目录:
一、SIM7600CE-A模块简介
二、AT+CNMI指令的使用
1、概述
2、网络资料
3、模块的AT+CNMI
4、短信息的Class
三、发送AT指令不能正确响应
1、硬件问题
1)串口未被正确选择 2)模块电压不正确 3)其他
2、波特率设置不正确
1)现象 2)使用指令修改波特率 3)刷固件
3、命令格式需正确
四、USB接口
五、使用SIM卡的热插拔功能
1、硬件要求
2、启用SIM卡检测功能
六、主控部分问题总结
1、主控程序正常,短信收不到
2、程序卡在SEND_START处
七、短信开发一般流程
1、短信模块初始化
2、发送短信
3、接收短信
4、正常收发状态图片
附录
1、strstr()函数用法
2、无法收发短信的常见原因
1)无法发送短信 2)无法接收短信回执
3、mini-PCIE线路板封装
一、SIM7600CE-A模块简介
SIM7600CE-A(下称模块)是上海芯讯通产品。芯讯通无线科技有限公司(SIMCom Wireless Solutions)是晨讯科技集团旗下全资附属公司(HK:2000)。
芯讯通无线科技致力于提供GSM/GPRS/EDGE/WCDMA/HS*PA、TD-SCDMA、CDMA EVDO、LTE以及GPS/GNSS、SRD等多种技术平台的无线模块解决方案。据ABI调查报告显示,芯讯通无线模块出货量在2008年首次占据全球第二的市场地位。
芯讯通无线科技通过和第三方的合作,在M2M、WLL、Mobile Computering以及GPS等多种行业应用上为客户提供高性价比的定制解决方案及ODM服务。
--------------------------------
本内容主控MCU:STM32F103VET6,模块:SIM7600CE-A。AT+CNMI在主控MCU中对模块设置,关于此指令祥见下面的介绍。除了实现短信功能外,也可以作DTU使用,祥见“STM32-GPRS模块连接系统主站”。
二、AT+CNMI指令的使用
AT+CNMI:设定当有某类短消息到达时如何处理。
1、概述
SMS 术语 TA、TE、DCE、DTE、ME、MS、AT:
TE Terminal Equipment 终端设备,比如一台计算机,一部手机,与DTE等价。它是和信息网络的一端相接的可提供必要功能的设备,这些功能使得用户可以通过接入协议接入网络。发送信息,接收信息。
TA Terminal Adapter 终端适配器,提供终端适配功能的物理实体,是一种接口设备,与DCE等价,比如SIM9600CE模块。
DCE 是Data Communications Equipment(数据通信设备)的首字母缩略词,它在DTE和传输线路之间提供信号变换和编码功能,并负责建立、保持和释放链路的连接,如Modem。DCE设备通常是与DTE对接,因此针脚的分配相反。其实对于标准的串行端口,通常从外观就能判断是DTE还是DCE,DTE是针头(俗称公头),DCE是孔头(俗称母头),这样两种接口才能接在一起。
DTE; "Data Terminal Equipment(数据终端设备)"的首字母缩略词,具有一定的数据处理能力和数据收发能力的设备。DTE提供或接收数据,例连接到调制解调器上的计算机就是一种DTE。DTE提供或接收数据,连接到网络中的用户端机器,主要是计算机和终端设备。与此相对的,在网络端的连接设备称为 DCE ( Date Circuit - terminating Equipment )。
DTE与进行信令处理的DCE相连。 它是用户-网络接口的用户端设备,可作为数据源、目的地或两者兼而有之。 DTE通过DCE设备(例如,调制解调器)连接到数据网络,且一般使用DCE产生的时钟信号。DTE包括像计算机、协议转换器和多路复用器这样的设备。
--------------------------------
ME Mobile Equipment 移动设备,比如手机,就属于ME。
MS Mobile Station 移动台,在移动中使用的通信站或者手持台。
AT 即Attention, AT指令一般应用于终端设备与PC应用之间的连接与通信。AT指令集是从终端设备(Terminal Equipment,TE,比如手机)或数据终端设备(Data Terminal Equipment,DTE)向终端适配器(Terminal Adapter,TA,比如SIM9600模块)或数据电路终端设备(Data Circuit Terminal Equipment,DCE)发送的。简单的说,就是用DTE(电脑)或者TE(手机)向TA(SIM9600模块)发送AT命令。
2、网络资料
GSM Modem一般都支持一条“ AT + CNMI ”指令,用于设定当有某类短消息到达时,如何处理它——只储存在指定的内存(易失 / 非易失)中;先储存后通知 TE ;直接转发到 TE 等等。
AT + CNMI 指令语法为:AT + CNMI=<mode>,<mt>,<bm>,<ds>,<bfr>
< mode >控制通知 TE 的方式
0 ——先将通知缓存起来,再按照< mt >的值进行发送
1 ——在数据线空闲的情况下,通知 TE ,否则,不通知 TE
2 ——数据线空闲时,直接通知 TE ;否则先将通知缓存起来,待数据线空闲时再行发送\
3 ——直接通知 TE 。在数据线被占用的情况下,通知 TE 的消息将混合在数据中一起传输
----------------
< mt >设置短消息存储和通知 TE 的内容
0 ——接受的短消息存储到默认的内存位置(包括 class 3 ),不通知 TE
1 ——接收的短消息储存到默认的内存位置,并且向 TE 发出通知(包括 class 3 )。通知的形式为:+ CMTI :” SM ”,< index >
2 ——对于 class 2 短消息,储存到 SIM 卡,并且向 TE 发出通知;对于其他 class ,直接将短消息转发到 TE :
+ CMT : [ < alpha > ] ,< length >< CR >< LF >< pdu >( PDU 模式)
或者+ CMT :< oa >, [ < alpha >, ] < scts > [ ,< tooa >,< fo >,< pid >,< dcs >,< sca >,< tosca>,< length > ] < CR >< LF >< data >( text 模式)
3 ——对于 class 3 短消息,直接转发到 TE ,同< mt >= 2 ;对于其他 class ,同< mt >= 1
----------------
< bm >设置小区广播
0 ——小区广播不通知
2 ——新的小区广播通知,返回+CBM:length,CR,LF,pdu
3 —— Class3 格式的小区广播通知,使用 bm=2 格式
----------------
< ds >状态报告
0 ——状态报告不通知
1 ——新的状态报告通知,返回:+CDS:length,CR,LF,pdu
2 ——如果新的状态报告存储到 ME ,则返回:+CDSI:mem,index
----------------
< brf >
1 ——始终为 1
由于 SIM 卡只有 1 万~10 万的读写次数和 10~15 条短消息的存储空间,而且 SIM 卡上短消息读写需要一定的时间才能完成,因此最好使短信息不经过 SIM 卡读写,直接发送至 TE 终端,可以设置:AT + CNMI = 2,2,0,1,1
3、模块的AT+CNMI
< mode >控制通知 TE 的方式
0 – Buffer unsolicited result codes in the TA. If TA result code buffer is full, indications can be buffered in some other place or the oldest indications may be discarded and replaced with the new received indications.
将主动返回的结果代码缓存在 TA 中。如果 TA 中的结果代码已经满了,那么就缓存在其他一些地方,或者将最先的若干结果代码删除,取而代之的是新收到的。
----------------
1 ——Discard indication and reject new received message unsolicited result codes when TA-TE link is reserved (e.g. in on-line data mode). Otherwise forward them directly to the TE.
当 TA-TE 连接被保留(例如处于在线数据模式中)的时候,会丢弃通知,拒绝新收到的短信主动返回结果代码。否则会将它们直接送到TE。
2 ——Buffer unsolicited result codes in the TA when TA-TE link is reserved (e.g. in on-line data mode) and flush them to the TE after reservation. Otherwise forward them directly to the TE.
当 TA-TE 连接被保留(例如处于在线数据模式中)的时候,将主动返回的结果代码缓存在 TA ,并且在保留的连接被取消后,将它们送到 TE 。否则会将它们直接送到 TE 。
注:主动返回的结果代码指的就是自动送到串口上的数据。当然这个数据有可能包含短信内容,也有可能不包含,根据参数选择什么而定。
----------------
< mt >设置短消息存储和通知 TE 的内容
The rules for storing received SMS depend on its data coding scheme, preferred memory storage (AT+CPMS) setting and this value:
设置短消息存储和通知 TE 的内容,首选内存存储(AT+CPMS)设置和下面的值:\
0 ——No SMS-DELIVER indications are routed to the TE.
没有信息发送指示直接路由到 TE
1 ——If SMS-DELIVER is stored into ME/TA, indication of the memory location is routed to the TE using unsolicited result code: +CMTI:
接收的短消息储存到默认的内存位置,并且向 TE 发出通知。通知的形式为:+CMTI:
2 ——SMS-DELIVERs (except class 2 messages and messages in the message waiting indication group (store message)) are routed directly to the TE using unsolicited result code:
对于 class 2 短消息,储存到 SIM 卡,并且向 TE 发出通知;对于其他 class ,直接将短消息转发到 TE:
+CMT:[], (PDU mode enabled) or
+CMT:,[],[,,,,,,,] (text mode enabled, about parameters in italics,refer command Show Text Mode Parameters AT+CSDH).
(启用文本模式,有关斜体的参数,请参考命令显示文本模式参数AT+CSDH)
3 ——Class 3 SMS-DELIVERs are routed directly to TE using unsolicited result codes defined in =2. Messages of other data coding schemes result in indication as defined in =1.
对于 class 3 短消息,直接转发到 TE ,同< mt >= 2 ;对于其他 class ,同< mt >= 1
----------------
< bm >设置小区广播
(not used in CDMA/EVDO mode)未用在CDMA/EVDO模式
The rules for storing received CBMs depend on its data coding scheme, the setting of Select CBM Types (AT+CSCB) and this value:
存储接收到的CBM的规则取决于其数据编码方案、选择CBM类型(AT+CSCB)的设置和下面的值:
0 ——No CBM indications are routed to the TE.
小区广播不通知
2 ——New CBMs are routed directly to the TE using unsolicited result code:
+CBM: (PDU mode enabled) or
+CBM: ,,,, (text mode enabled)
新的小区广播通知,返回+CBM:(启用PDU模式)或+CBM:(启用文本模式)
----------------
< ds >状态报告
(not used in CDMA/EVDO mode)未用在CDMA/EVDO模式
0 ——No SMS-STATUS-REPORTs are routed to the TE.
没有短信状态报告转发到 TE
1 ——SMS-STATUS-REPORTs are routed to the TE using unsolicited result code:
+CDS: (PDU mode enabled) or
+CDS: ,,[],[],,, (text mode enabled)
短信状态报告使用主动返回的结果代码转发到 TE :
+CDS:(启用PDU模式)
+CDS:(启用文本模式)
2 ——If SMS-STATUS-REPORT is stored into ME/TA, indication of the memory location is routed to the TE using unsolicited result code: +CDSI:
若短信状态报告存储到ME/TA中,则使用主动返回的结果代码:+CDSI:
----------------
< brf >
0 ——TA buffer of unsolicited result codes defined within this command is flushed to the TE when 1 to 2 is entered
(OK response shall be given before flushing the codes).
1 ——TA buffer of unsolicited result codes defined within this command is cleared when 1 to 2 is entered.
4、短信息的Class
短消息类(class)的概念:根据指定储存的位置,短消息分为class 0~3四个类。也可以不指定类(no class),由ME按默认设置进行处理,存储到内存或者SIM卡中。在TPDU的TP-DCS字节中,当bit7-bit4为00x1, 01x1, 1111时,bit1-bit0指出消息所属类:
00-class 0:只显示,不储存
01-class 1:储存在ME内存中
02-class 2:储存在SIM卡中
03-class 3:直接传输到TE
GSM Modem一般都支持一条“AT+CNMI”指令,用于设定当有某类短消息到达时,如何处置它:只储存在指定的内存(易失/非易失)中,先储存后通知TE,还是直接转发到TE等。
“AT+CNMI”指令语法为:AT+CNMI=[[,[,[,[,]]]]]
----------------
<mode >通知方式
0 ——不通知TE,取决于mt
1 ——只在数据线空闲的情况下,通知TE;否则不通知TE
2 ——通知TE,在数据线被占用的情况下,先缓冲起来,待数据线空闲,再行通知
3 ——通知TE,在数据线被占用的情况下,通知混合在数据中一起传输
----------------
< mt >消息储存或直接转发到TE
0 ——储存到默认的内存位置(包括class 3)
1 ——储存到默认的内存位置,并且向 TE 发出通知(包括class 3)
2 ——对于class 2,储存到SIM卡,并且向TE发出通知;对于其它class,直接将消息转发到 TE
3 ——对于class 3,直接将消息转发到 TE;对于其它class,同mt=1
----------------
bm, ds, bfr的含义,请参考相关标准文档,一般不需要去关心它们
----------------
程序具体实现时,使用mode = 2, mt = 1,比较简单。对所有类型的短消息,只要在收到ME送来的“+CMTI”通知后,用“AT+CMGR”指令读取消息内容就行了。TE与ME之间的通信过程举例如下:
(初始化)
AT+CNMI=? (查看能支持的设置范围)
+CNMI: (0-2),(0-3),(0,2,3),(0,1),(0,1)
OK
AT+CNMI? (查看当前设置)
+CNMI: 0,0,0,0,0
OK
AT+CNMI=2,1 (设置为mode=2, mt=1)
OK
AT+CNMI? (再查看当前设置)
+CNMI: 2,1,0,0,0
OK
(过了一段时间,有一条消息到达)
+CMTI “ME”,8 (通知:消息已经存储在ME内存中,序号为8)
AT+CMGR=8 (读第8条消息)
+CMGR: 8,27
0891683108200505F0240D91683158812764F80000402052110373800741E19058341E01
OK
AT+CMGD=8 (删除第8条消息)
OK
还有一种方式mode = 2, mt = 2也很令人感兴趣。在这种方式下,除了class 2外,消息不存储,直接转发到TE。需要处理消息通知和内容两种情况,复杂一些。但如果发送方也由程序控制,可以只发no class或class 1的消息,这样不存储在接收方ME内存(一般是闪存,非易失性)中,肯定能延长它的使用寿命。TE与ME之间的通信过程举例如下:
AT+CNMI = 2,2 (设置为mode = 2, mt = 2)
OK
(过了一段时间,有一条消息到达)
+CMT: ,26
0891683108200505F0040D91683158812764F8000840205211639180064F60597D0021
三、发送AT指令不能正确响应
1、硬件问题
1)串口未被正确选择
这里涉及到电平转换,电路见下方图3.1.4;TXD、RXD需正确对应到模块。
2)模块电压不正确
SSCOM V5.13.1一直接收到RDY,如图3.1.1所示。
----------------
上述现象为模块供给电压不足引起的。
切换宏晶ISP下载工具的电压至5V供电,此电压再由SPX2915T5转换为3.8V,如图3.1.2所示。
图3.1.2 下载工具与实验板连接
图3.1.3 实验板实物图
----------------
电平转换与接口电路:
图3.1.4-1 电路原理图
图3.1.4-2 PCBA
3)其他
(1)未检测到SIM卡时,SIM_VCC将被控制为不输出电压,这是正常现象。
(2)天线推荐陶瓷贴片天线,尽可能远离噪声;若采用有源天线,注意增益指标,通常增益应该在20dB左右,噪声指数应该小于1.5。
2、波特率设置不正确
此模块出厂时波特率默认设置在115200。
本公司短信功能与DTU的发送与接收波特率设置在9600,已经足够使用。外购才茂DTU、四信DTU、映翰通DTU,以及自行研发的4G短信、4G/3G/2G自适应DTU波特率一律设置在9600。故需要更改模块的波特率,后发现保存不住。
----------------
1)现象
2)使用指令修改波特率
指令格式:AT+IPREX。
3)刷固件
若通过AT+IPREX无法更改波特率,就需要刷固件。
下载工具“SIM7080_SIM7500_SIM7600_SIM7900_SIM8200 QDL V1.58 Only for Update”以及相应的固件搜索我的百度网盘或移步SIM7600CE-A固件、工具软件与教程下载。通过USB口下载固件,故画线路板时建议保留此口,生产时可不装配。本例以SIM7600CE-A说明,其他型号可参考。
(1)打开QDL1.58 工具,如下图:
(2)选择Load,选择你要下载的模块平台,如下所示:
(3)点击Browse,选择你要升级的固件路径,如下图:
看回复里面的IMEI号是不是在,如果在,就说明升级没有问题。
发送AT+CFUN?看回复是否为1,如果为1,就说明升级没有问题。
以下指令建议升级前先查询下,升级之后再对比看看。IMEI、MEID是否还在。跨基线MEID可能会丢需要重新写入。AT+SIMEI和AT+SMEID指令写入,模块标签上有这个号。AT指令如下:
at+simcomati
Manufacturer: SIMCOM INCORPORATED
Model: SIMCOM_SIM7600CE-T
Revision: LE11B13SIM7600M22
SIM7600M22_B13V01_191122
QCN:
IMEI: 861477035026184
MEID: A100006444CCE1
+GCAP: +CGSM
DeviceInfo: 173,170
OK
at+gmr
+GMR: LE11B13SIM7600M22
OK
at+csub
+CSUB: B13V01
+CSUB: MDM9x07_AP_S_22_V1.53_191125
OK
AT+CQCNV
+CQCNV: "9X07_SIM7600CE-T_P3.01_20180914"
OK
at+cfun?
+CFUN: 1
OK
3、命令格式需正确
SimCom推荐使用AT指令的大写发送。
四、USB接口
连接按照以下原理图进行。推荐使用ESD9M5.0ST5G或ESD9L5.0ST5G作为过压保护TVS。
注意:保留模块的USB端口,以便进一步升级与调试。
五、使用SIM卡的热拔插功能
1、硬件要求
进行8引脚SIM卡座设计,确保已连接模块的SIM_PRESENCE引脚。其详细的检测原理移步:GSM/GPRS之一-GSM基础知识之二、SIM卡插入检测原理。
2、启用SIM卡检测功能
AT+CSDT=1 //启动SIM卡检测功能
AT+CSMINS=1 //启动SIM卡插入状态报告
六、问题总结
1、主控程序正常,短信收不到
本控制器内有7个号码,默认10000000000。使用的号码正确设置,不使用的号码默认。如默认的号码乱设置,可能会造成收不到短信的现象。
2、程序卡在SEND_START处
七、短信开发一般流程
1、短信模块初始化
1)主界面设置短信功能是否投入,如已投入,向下执行。
2)AT+CPBW //写入电话本
sprintf(phone,"AT+CPBW=%d,\"%s\",%d,\"%s\"\r\n",SetNum,usr_phone[SetNum-1].num,129,usr_phone[SetNum-1].name);
3)AT+CPIN //查看SIM卡是否就绪(READY已就绪,ERROR错误)
4)AT+CME //关闭错误回显,错误只返回ERROR
5)AT+CNMI //设定当有某类短消息到达时如何处理
6)AT+CPBS = \"SM\"\x00D\x00A") //设置电话薄的存储介质为MT(SIM卡),无错误返回OK
7)AT+CPBR //读取电话本,无错误返回OK
8)AT+CMGF = 0\x00D\x00A","+CMGF: 0"); //设置gsm为pdu模式
9)AT+CSCA = \"+8613800577500\"\x00D\x00A //设置短消息服务中心号码,无错误返回OK
10)AT+CREG //查看SIM卡注册状态,无错误返回OK
case GSMModeStatus_ZCCX1: //注册查询
{
if((strstr(buf_uart3.buf,"OK")!=NULL)) //strstr()函数的用法见“附录1、strstr()函数用法”
{
pflag=strstr(buf_uart3.buf,"0,");
printf("%s\r\n\r\n",pflag);
pflag+=2;
switch(*pflag)
{
case '4': //状态未知
case '2':GSMModeStatus=GSMModeStatus_ZCCX;break; //未注册,正在尝试注册
case '1': //已注册到归属地网络
case '5':{ //已注册,漫游状态
GSMModeStatus=GSMModeStatus_SD;
GSMSendMessage_ZD=GSMEVENTZDSC_HMCL;
GSMModeReReadTime=0;
}break;
case '0': //未注册,且未在尝试注册
case '3': //注册被拒绝
default:{
GSMModeStatus=GSMModeStatus_Sus;
}break;
}
}
2、发送短信
AT+CMGF=0\x00D\x00A","+CMGF: 1");
//对设备的短消息格式进行设置,格式有两种模式0:PDU模式和1:Text模式
AT+CMGS //发送短消息
3、接收短信
+CMTI //主动上报短消息到达
AT+CMGR //读取短消息
AT+CMGD=1,4\x00D\x00A"); //删除SIM卡上所有短消息,包括未读,无错误返回OK
4、正常收发状态图片
附录
1、strstr()函数用法
包含文件:string.h
函数名:strstr()
函数原型:
extern char *strstr(char *str1,const char *str2)
语法:
* strstr(str1,str2)
str1:被查找目标 string expression to search.
str2:要查找对象 The string expression to find.
返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;若str2不是str1的子串,则返回NULL。使用详述:C语言中string函数详解。
2、无法收发短信的常见原因
1)无法发送短信
若无法发送短信,但可以正常接收,一般为短信中心号码设置有误。
安卓终端通过手机菜单查找或按手机说明书指导进入“短信中心号码”设置,核实短信中心号码是否设置正确。短信中心号码格式为:+8613800XYZ500(XYZ为手机号码归属地区号)。
iPhone终端重新设置短信中心号码,可在手机拨号界面输入*5005*7672*+8613800XYZ500#(XYZ为手机号码归属地区号,具体请参考上述按归属地区分中的描述内容),输入完停顿几秒,然后点击呼叫。
2)无法接收短信回执
若接收短信正常,但手机端看不到回执内容,可能是移动通信认为是“垃圾信息”所致,可以换一张卡试试。
3、mini-PCIE线路板封装
难走的路,往往能把我们带向更远的地方。觉得不错,动动发财的小手点个赞哦!