SIM模块的串口通信例程

项目里写的SIM模块串口通信例程,模块使用SIM7100,支持2G/3G/4G,交互使用串口中的AT命令实现,采用非阻塞,提高交互效率。


代码

详见gayhub:


函数分析

得到的数据使用结构体保存,方便丢给主程序。
实现的功能函数如下,主要包括:

  1. 串口的设置和打开

  2. 串口的发送和接受函数

  3. 获取模块的信号质量

  4. 获取模块的当前网络制式

  5. 获取模块的运营商

  6. 选择模块的网络模式

  7. 对模块的离线控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
typedef struct{
int csq; // Signal Quality
int ber; // Bit Error Rate
char provider_name[30]; // Provider Name
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)
{
//printf("\nLen %d\n",nread);
buff[nread]='\0';
//printf("\n%s",buff);

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);
}
}
//usleep(5000);
}
printf("\n%d + %d\n",stateinfo->csq,stateinfo->ber);
printf("\n--get csq&ber end--\n");
return 0;
}


SIM模块的串口通信例程
http://example.com/posts/42320/
作者
ykk648
发布于
2018年1月17日
许可协议