手里有一块SIM800C的实验板,花时间做几个实验。
时间:
2018-9-8
条件:
SIM800C实验板, 1块;
移动SIM卡,1张;
USB转串口线,1根;
PC机(含串口调试软件),1台;
5V电源,1块。
准备:
装上SIM卡,转接线的串口接SIM800C的UART1端,USB口接PC的一个USB端。实验板施加5V电源。
开机:
上电后,STATUS引脚控制的状态灯(红)常亮,说明开机正常。
NETLIGHT引脚控制的指示灯(绿)闪烁,看不出来是否成功注册。后来重新上电一次,发现闪烁的快了一些,才知道前一次的慢闪烁表示没有注册成功。
如果监视串口,可发现SIM800C将启动过程中的状态通过串口发送出来了:
状态代码 | 注释 |
---|---|
RDY | 上电过程完成,调制解调器按照固定波特率准备好。 |
+CFUN: 1 | 完整功能 |
+CPIN: READY | 移动终端不用等待任何口令 |
Call Ready | 调制解调器已经上电,号码簿完成初始化 |
SMS Ready | 调制解调器已经上电,短信服务完成初始化 |
串口通讯
打开串口调试助手,设置串口号、波特率、校验位、数据位、停止位。我的设置是:串口号:com3,波特率:115200(SIM800C具有波特率自适应功能,波特率是多少应该无所谓),校验位:NONE,数据位:8,停止位:1。at<回车>,没有反应。随机换了几种波特率,也还是没有反应。换了一台机子,恰巧默认的波特率是9600,at<回车>,应答OK。调成其它波特率,不行,说明这块板子上的SIM800C没有开启自适应功能。
AT命令基础
AT命令不区分大小写。
AT命令后,必须有回车,否则SIM800C无应答;
发送命令时,SIM800C先回送收到的命令,再应答。可用ATE0关回显,用ATE1打开回显。用ATE0&W(或者ATE1&W)将设置保存到非易失存储器,掉电不丢失。
比如:
PC机发送的命令 | SIM800C的应答 | 注释 |
---|---|---|
at | at | 有回显功能 |
OK | ||
ATE0 | ATE0 | 关闭回显的命令 |
OK | ||
AT | 已经不回显了 | |
OK |
AT命令的入门
PC机发送命令 | SIM800C应答 | 注释 |
---|---|---|
at | 能收到AT命令吗 | |
OK | 表明接收到命令 | |
at+gsv | 芯片信息 | |
SIMCOM_Ltd | 制造商 | |
SIMCOM_SIM800C | 型号 | |
Revision:1418B06SIM800C24 | 版本号 | |
OK | ||
AT+ipr? | 波特率是多少 | |
+IPR: 9600 | 9600 | |
OK | ||
AT+ipr=0 | 设为自适应 | |
OK | 自适应似乎并不适用于各种波特率,我发现至少对9600,38400,115200可用。 |
一、 指令介绍:
1 +CMGW 将消息写入内存(Write Message to Memory)。
描述:该指令将一条消息存储到内存中(SMS-SUBMIT 或 SMSDELIVERS),并返回保存在内存中的位置。输入的“消息文本”或 PDU 可以被发送消息的指令 +CMSS 使用。
语法格式:
文本模式: (
AT+CMGW=
PDU模式:
AT+CMGW=
返回消息格式:
+CMGW:
或(如果发生错误)
+CMS ERROR:
2 +CMSS 发送存储的消息(Send Message From Storage)
描述:该指令发送存储在
语法格式:
AT+CMSS=
返回消息格式:
+CMSS :
或(如果发生错误)
+CMS ERROR:
如果通过
3 参数说明:
--0: "REC UNREAD"
--1: "REC READ"
--2: "STO UNSENT"
--3: "STO SENT"
二 实现原理:
基于上面的指令,我们发现可以如下方式提高发送效率——通过+CMGW将要群发的消息保存到内存中,然后一次调用+CMSS将消息发送出去,而无须每次发送重复的PDU信息,减少了通信数据。
三 示例:(以下采用java注释风格进行注释)
AT //测试连接状态
OK //连接正常
AT+CMGF? //查看当前工作模式
+CMGF: 1 //文本模式
OK //消息返回结束
at+cmgf=0; //设置工作模式为PDU模式
OK
AT+CMGF? //查看当前工作模式
+CMGF: 0 //PDU模式
OK
AT+CPMS=? //查看当前首选存储器
+CPMS: ("SM"),("SM"),("MT")
OK
AT+CPMS? //查看当前存储器中的消息
+CPMS: "SM",0,70,"SM",0,70,"MT",0,70 //当前三个存储器中消息数均为0
OK
AT+CMGW=21 //向内存中写入一条消息
> 0891683108100005F011000D916831xxxxxxxxFx00000006C8329BFD0E01^Z
+CMGW: 1 //消息保存成功,其索引
OK
AT+CPMS?
+CPMS: "SM",1,70,"SM",1,70,"MT",1,70 //当前SM 0存储器中有一条消息
OK
at+cmss=1,"13xxxxxxxx1",145 //将消息转发给13xxxxxxxx1
+CMSS: 232 //发送成功,并保存在存储器中,索引是232
OK
at+cmss=1,"13xxxxxxxx2",129 //将消息转发给13xxxxxxxx2
+CMSS: 233
OK //结束
AT+CMGS="1000" OK |
返回的“+CMGS: 30”是什么意思,《ATK-SIM800C 用户手册》上的解释是:
稍等片刻,在短信成功发送后,模块返回如: +CMGS: 30,的确认信息,表示短信成功发送,其中 30 为模块内部的短信
计数器,一般不用理会。
打开 SIM800C 配套串口调试助手,选择正确的 COM 号,设置波特率为 115200, 勾选发送新行(必选!即自动添加发送回车换行功能) ,然后连续发送三次 AT 到SIM800C 模块
发送了 3 次 AT 指令,第一次看到有乱码,这是因为模块上电后,还没有实现串口同步,在收到第一次数据(不一定要 AT 指令)后,模块会自动实现串口同步(即自动识别出了通信波特率),后续通信就不会出现乱码了。因为 SIM800C 具有自动串口波特率识别功能(识别范围: 1200-115200),所以我们的电脑(或设备)可以随便选择一个波特率(不超过识别范围即可),来和模块进行通信,这里我们选择最快的 115200。
依次进行以下设置:"GSM"字符集(AT+CSCS="GSM"),文本模式(AT+CMGF=1),新消息指示(AT+CNMI=2,1)
AT+CSCS,用于设置 TE 字符集,默认的为 IRA,国际标准字符集,在发送纯英文短信的时候,发送: AT+CSCS=”GSM”,设置为缺省字符集即可。在发送中英文短信的时候,需要发送: AT+CSCS=”UCS2”,设置为 16 位通用 8 字节倍数编码字符集。
AT+CMGF,用于设置短消息模式, SIM800C 支持 PDU 模式和文本(TEXT)模式等 2种模式,发送: AT+CMGF=1,即可设置为文本模式。
AT+CNMI,用于设置新消息指示。发送: AT+CNMI=2,1,设置新消息提示,当收到新消息,且 SIM 卡未满的时候, SIM800C 模块会返回数据到串口,如: +CMTI: ”SM”,2,表示收到接收到新消息,存储在 SIM 卡的位置 2。
发送: AT+CMGS="10010" (注意我是联通的号,发101给10010查话费相当于免费做收发实验),等待模块返回: >,此时输入需要发送的内容: 101,注意,发送101时不要发送回车。在发送完内容以后, 最后以十六进制格式单独发送(不用添加回车): 1A,即可完成一次短信发送
0x1A,即“CTRL+Z”的键值,用于告诉 SIM800C,要执行发送操作。另外还可以发送: 0x1B,即“ESC”的键值,用于告诉 SIM800C,取消本次操作,不执行发送。
在短信成功发送后,模块不久会返回形如: +CMGS: 39,的确认信息,表示短信成功发送,其中 39 为模块内部的短信计数器,一般不用理会。
稍等片刻后,模块会提示如:+CMTI: "SM",22,表明收到了新的短信,存放在 SIM 卡位置 22。然后,我们发送 :AT+CMGR=22,即可读取该短信
第一次发送 AT+CMGR=22 的时候, SIM800C 模块返回的是(省略了多余的回车换行和“OK”等字符串,下同):
+CMGR: "REC UNREAD","10010","","18/09/18,11:11:43+32"
60A876845B9E65F68BDD8D39FF1A00320035002E003500395143FF0C000D000A00208D2662375F53524D53EF75284F59989DFF1A003200320039002E003700365143FF0C000D000A002067E58BE25B9E65F68BDD8D39660E7EC68BF756DE590D00480046004D00583002
其 中 : ”REC UNREAD”, 表 示 该 短 信 没 有 被 读 取 过 , 也 就 是 未 读 短 信 。 接 着是: ”10010”,表示此短信发送方的电话号码。最后的: ”18/09/18,11:11:43+32 ”,表示的是此短信的接收日期和时间信息。然后换行后的就是本次接受短信内容,是一串 UNICODE 编码,这里我们这里需要用到一个工具:汉字 UNICODE 互换工具.exe,来实现 UNICODE 到汉字的装换。