SIM800C英文短信收发调试记录

他山之石(转载原因,方便下次查看复习)

转一

手里有一块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 使用。
语法格式:
文本模式: (<index> is returned in both cases)
AT+CMGW= <oa/da> [,<tooa/toda> [,<stat> ] ] <CR> enter text <ctrl-Z / ESC>
PDU模式:
AT+CMGW= <length> [,<stat>] <CR> give PDU <ctrl-Z / ESC>
返回消息格式:
+CMGW: <index> 
或(如果发生错误)
+CMS ERROR: <err>

2 +CMSS 发送存储的消息(Send Message From Storage)
描述:该指令发送存储在<index>指定位置的消息。
语法格式:
AT+CMSS=<index>[,<da> [,<toda>] ]
返回消息格式:
+CMSS : <mr> 
或(如果发生错误)
+CMS ERROR: <err>
如果通过<da>传递了一个新的收件人地址,将会取代已保存消息的收件人。

3 参数说明:
<oa/da> : 字符串,源/终消息地址。
<tooa/toda> : 源/终地址类型。129表示普通号码类型,145表示国际号码类型(自动在号码前加“+”)。
<stat>: PDU模式为整型(在+CMGW指令中缺省为2),文本模式为字符串(在+CMGW指令中缺省为"STO UNSENT"),标记消息在内存中的状态,如果 <stat> 被忽略, 被存储的消息被认为是要发送的消息。
<stat> 的取值:
--0: "REC UNREAD"
--1: "REC READ"
--2: "STO UNSENT"
--3: "STO SENT"
<length> : 实际数据的字节长度。

二 实现原理:
基于上面的指令,我们发现可以如下方式提高发送效率——通过+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  //消息保存成功,其索引<index>为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"
> 1000
+CMGS: 30

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 到汉字的装换。

猜你喜欢

转载自blog.csdn.net/qq_35629563/article/details/82752886