SIM800模块内置协议栈的开发笔记

本文主要记录如何通过UART接口发送AT指令进行GPRS网络连接。

前言

SIM800是GSM制式的2G网络模块,支持移动和联通2G网络。
类似的模块的还有SIM900和SIM2000,
SIM2000是CDMA制式的模块,仅支持电信2G网络。
这三个模块的开发方式是一样的,支持的AT命令也都差不多。
但是2019年了,2G模块基本也属于淘汰级别的产品了。

 

硬件

硬件上使用一路UART接口与模块通信,UART接口默认使用115200波特率。
这个模块比较奇葩!
还需要一个GPIO控制模块的电源开关PWRKEY。
开机需要将模块的PWRKEY引脚拉低1.2秒才能开机。
开机后再给个1.2秒的低脉冲,模块还会关机。

软件

AT命令的格式:
发送方是以AT开头0x0D结尾的字符串,格式比较统一。
模块响应是以0x0D,0x0A结尾,但开头字符是没有统一的格式,有的指令响应是以+开头,有的又没有。

软件开发的难点:
由于模块会主动上报一些数据,比如来电会上报RING。
并不是主机发一条AT命令,模块才会响应一条数据。
如果在主机发送一条命令的时候,模块突然主动上报了一些信息,
更让人头疼的是响应的数据还没有统一的格式,
这就给软件解析响应数据带来了麻烦,难以判断接收到的数据是什么东西?
解决办法只能先判断接收到的数据是不是主动上报的内容,如果不是再根据上一次发送的指令类型来解析响应数据。
但我目前还不能确定模块主动上报的内容和命令响应的内容有没有重叠的,如果有重叠的,那就GG了。

 

AT指令软件初始化流程,仅供参考:

第1步:等待模块就绪
由于这个模块奇葩的上电流程,软件没办法确认模块现在是不是上电了?
所以这一步主机先循环发送AT,等待模块响应OK,表示模块通信就绪了。
如果发送了多次都没有响应,则给模块来一个上电流程:PWRKEY低脉冲1.2秒。
再重复上面的操作。

第2步:基本参数设置
2.1 发送ATE0,关闭指令回显。
如果不关闭回显,主机发什么,模块就会原样回复,适合于在终端软件里人工发送命令,可以看到输入指令。
但是我们做产品是用程序去发指令,指令回显不利于写代码解析响应数据,所以关掉为好。
2.2 发送AT+CREG=0,取消注册状态主动上报
注册状态通过AT+CREG?查询就行了,可以不用主动上报。
2.3 发送AT+CMEE=2,设置错误反馈方式
设置为0所有的错误都会返回ERROR.
设置为2某些指令错误会返回+CME ERROR:给出详细的错误信息

第3步:模块识别
主机发送AT+GMM,可以得到模块型号。
但是这条指令的响应内容就是模块型号字符串,没有固定的头和尾,解析比较困难,
如果发这条指令之后,模块突然主动上报一些其它内容,不要把干扰数据当成模块型号了!

第4步:检测SIM卡
主机发送AT+CPIN?,可以得到SIM卡状态。
这条指令很好解析,响应是格式是+CPIN:
检测到接收的内容是+CPIN开头,就可以确定这是指令应答,而不是模块主动上报的干扰数据。
为READY时表示SIM卡也就绪了,可以进行下一步操作了。
为其它状态时,看手册吧,反正是不正常的状态。
可以发送AT+CIMI得到IMSI信息,从号码的前5位可以判断这张卡是哪家运营商,
比如46000是中国移动,46001是中国联通。

第5步:等待注册网络
主机发送AT+CREG?
模块响应+CREG:,
当stat的值为1或者5时,表示注册成功。
可以发送AT+COPS?查询当前注册的是哪家运营商
可以发送AT+CSQ查询信号强度1-31,31表示信号最强

第6步:激活GPRS数据连接
主机发送AT+CSTT=,,设置APN接入点。
模块响应OK
主机发送AT+CIICR,激活GPRS数据连接。
模块响应OK
主机发送AT+CIFSR,查询模块的IP地址。
模块响应IP地址,注意这又是一个没有前缀的响应,就是纯IP字符串。

第7步:数据连接相关的参数设置
发送AT+CIPDPDP=1,30,1可以让模块在网络异常时上报+PDP: DEACT
发送AT+CIPMUX=1启用多路连接功能
发送AT+CIPSWT=59设置发送超时(仅SIM2000需要)

至此模块的GPRS初始化完成了。
可以进行网络通信了。

第8步:连接远程服务器
发送AT+CIPSTART=,"TCP","www.baidu.com",80就可以连接www.baidu.com服务器的80端口。
是通道号码,模块支持0-4通道,可以理解为socket句柄。
服务器地址可以是域名也可以是IP地址。
连接成功会收到, CONNECT OK
连接失败会收到, CONNECT FAILED

第9步:发送数据
发送AT+CIPSEND=,
是通道号码
是数据长度
发完这条命令模块没有回应,需要主机继续发送len字节的数据,才会启动发送。
发送成功会收到, SEND OK
发送失败会收到, SEND FAILED

第10步:接收数据
当模块收到远程服务器发送的数据时会主动上报。
+RECEIVE,,:<\r\n>
是通道号码
是数据长度
是原始二进制数据
注意:只有打开了多路连接功能,才会有这条上报。

第11步:关闭连接
如果是服务器发起的关闭连接,模块会主动上报:
,CLOSED
如果是模块发起关闭连接,要向模块发送:AT+CIPCLOSE=,1
模块响应:
,CLOSE OK
 

 

你可能感兴趣的:(学习笔记,嵌入式)