项目里写的SIM模块串口通信例程,模块使用SIM7100,支持2G/3G/4G,交互使用串口中的AT命令实现,采用非阻塞,提高交互效率。
代码
详见gayhub:
函数分析
得到的数据使用结构体保存,方便丢给主程序。
实现的功能函数如下,主要包括:
串口的设置和打开
 
串口的发送和接受函数
 
获取模块的信号质量
 
获取模块的当前网络制式
 
获取模块的运营商
 
选择模块的网络模式
 
对模块的离线控制
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   | typedef struct{ 	int csq;    	int ber;    	char provider_name[30];  	char sim_mode[30]; }StateInfo;
  int open_port(int port); int set_opt(int fd, int nSpeed, int nBits, char nEvent, int nStop); static int serial_send(int file_descriptor, char *buffer, size_t data_len);
  int get_operator(int fd,StateInfo *stateinfo); int get_csq(int fd,StateInfo *stateinfo); int get_mod(int fd,StateInfo *stateinfo); int mode_selection(int fd,int mode); int offline_control(int fd,int isornot);
  static int csq_detected(int csq); static int mod_detected(int mod,StateInfo *stateinfo);
 
  | 
 
获取信号质量为例
主要是通过发送AT命令(非阻塞),并处理接受的数据,来和模块交互。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
   | int get_csq(int fd,StateInfo *stateinfo) { 	int nread; 	char buff[SIZE];
  	char sbuffer[]="AT+CSQ\r"; 	serial_send(fd,sbuffer,sizeof(sbuffer));
  	int flag = 0;
  	while(!flag) 	{ 		while((nread=read(fd,buff,SIZE))>0) 		{ 			 			buff[nread]='\0'; 			
  			if(strstr(buff,"CSQ")!=NULL) 			{ 				stateinfo->ber=0; 				stateinfo->csq=0; 				int i = 0;
  				while(buff[i]!=',') 				{ 					if(buff[i]>='0'&&buff[i]<='9') 					{ 						stateinfo->csq=(stateinfo->csq)*10+(buff[i]-'0'); 					} 					i++; 				} 				while(buff[i]!='\0') 				{ 					if(buff[i]>='0'&&buff[i]<='9') 					{ 						stateinfo->ber=(stateinfo->ber)*10+(buff[i]-'0'); 					} 					i++; 				} 				flag = 1; 				stateinfo->csq=csq_detected(stateinfo->csq); 			} 		} 		 	} 	printf("\n%d + %d\n",stateinfo->csq,stateinfo->ber); 	printf("\n--get csq&ber end--\n"); 	return 0; }
 
  |