`
yuanyu5237
  • 浏览: 159341 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MSP430单片机控制GSM模块发短信(原理)

 
阅读更多
首先,GSM发短信,对英文和中文的处理是不一样的,请参考以下资料:

1 简述
使用GSM模块收发短信,主要有两个部分需要考虑,一个是AT指令,一个串口读写。Tc35i GSM模块在收发短信时,分为两种模式,一为text模式,一为pdu模式,如果只需要发送英文内容,则text模式足矣,但若要发送中文短信,则必须使用pdu模式。串口的读写在不同的系统里是有区别的,在windows下使用系统提供的win32 API可以实现串口操作,在linux下串口作为文件读写,在单片机上串口的读写是把一个个字符送入特定缓冲区即可,但无论在何种系统中,操作串口之前都需要对串口进行初始化操作。
2 AT指令
在使用AT指令发送短信的时候,可以使用串口调试助手(windows和linux下的串口调试助手不同,而且版本也有许多,但使用方法大致相同,都需要先找到串口的端口号,windows下可以到设备管理器中查看(注意安装好usb转串口驱动),linux下可以到/dev下查看,设置波特率9600,校验位None,数据位8,停止位1;windows下可以使用stc-isp带有的串口助手,在linux下可以使用minicom,)来帮助熟悉指令,以及了解短信发送的流程。
2.1 TEXT模式
先对模块SMS进行一些初始设置,AT+CMGF=1设置为Text模式,AT+CSMP=17,167,0,0设置Text模式参数,AT+CSCS=GSM设置GSM字符集,接下来发送一条短信,例如要往15948020629这个号码发送一条短信,输入命令AT+CMGS=15948020629 并回车,返回
>
接着输入短信内容,输入完毕后以->结尾,这个字符是ASCII码中的26(0x1A),一个控制字符,在这里作为结束标志,测试时可以在正常短信内容输入完毕后:先点发送,再以十六进制方式输入1A,1A也就是16进制的026,再点发送,这时接收区就会显示这个符号,以后再需要这个符号时可以直接粘贴使用。如果返回OK就说明短信发送成功。需要注意的是,虽然有短信息服务中心号码设置的命令,不过一般不需要我们设置的,可以使用AT+CSCA?来查询服务中心号码。
下面来往模块中发送一条短信,注意犹豫此时是Text模式,所以发送内容应为英文内容,包括数字,英文标点。发送短信前执行AT+CNMI=2,1
此命令的作用是当有新的短信时给予提醒并显示存储位置,同时还会将信息存储到默认的内存位置。例如发送信息的手机为15948020629,信息到达后接收区显示
+CMTI: "ME",22
我们可以使用AT+CMGR=22来将其读出,接收区显示
+CMGR: "REC UNREAD","15948020629",,"08/03/25,09:51:01+32"
ADG123456

OK
其中ADG123456为短信内容,REC UNREAD 表示这条短信未读,以后再读取这条短信时将变为REC READ,接收时间时间,短信号码等信息皆显示在第一行里。
2.2 PDU模式
假如我要发送下面的短信:
接收号码:+8613602433649
短信内容:工作愉快!
短信中心号码:+8613800200500
一、短信中心号码处理:用字符串 addr 表示
1、将短信息中心号码去掉+号,看看长度是否为偶数,如果不是,最后添加F
即 addr = "+8613800100500"
=> addr = "8613800100500F"
2、将奇数位和偶数位交换。
=> addr = "683108100005F0"
3、将短信息中心号码前面加上字符91,91是国际化的意思
=> addr = "91683108100005F0"
4、算出 addr 长度,结果除2,格式化成2位的16进制字符串,16 / 2 = 8 => "08"
=> addr = "0891683108100005F0"
二、手机号码处理:用字符串 phone
1、将手机号码去掉+号,看看长度是否为偶数,如果不是,最后添加F
即 phone = "+8613602433649"
=> phone = "8613602433649F"
2、将手机号码奇数位和偶数位交换。
=> phone = "683106423346F9"
三、短信息部分处理:用字符串 msg 表示
1、转字符串转换为Unicode代码,例如“工作愉快!”的unicode代码为 5DE54F5C61095FEBFF01,(5de54f5c61095febff01)
(转换函数见最后附录)
2、将 msg 长度除2,保留两位16进制数,即 5DE54F5C61095FEBFF01 = 20 / 2 => "0A",再加上 msg
=> msg = "0A5DE54F5C61095FEBFF01" 
四、组合
1、手机号码前加上字符串 11000D91(1100:固定,0D:手机号码的长度,不算+号,十六进制表示,91:发送到手机为91,发送到小灵通为81),
即 phone = "11000D91" + phone
=> 11000D91683106423346F9
2、手机号码后加上 000800 和刚才的短信息内容,000800也写死就可以了
即 phone = phone + "000800" + msg
即 11000D91683106423346F9 + 000800 + 0A5DE54F5C61095FEBFF01
=> phone = 11000D91683106423346F90008000A5DE54F5C61095FEBFF01
3、phone 长度除以2,格式化成2位的十进制数
即 11000D91683106423346F90008000A5DE54F5C61095FEBFF01 => 50位 / 2 => 25
五、所以要发送的内容为
AT+CMGF=0 <回车>
OK
AT+CMGS=25<回车>
> addr+phone <Ctrl+Z发送>  (_)
六、如果返回不是ERROR,恭喜你,发送成功了^_^
其详细过程参看下图:

2.3 常用AT指令
命令 作用
AT 测试连接是否正确
ATE0/ATE1 关闭回显/打开回显
AT+CGMI 得到厂商信息
AT+CGMR 得到手机版本号
AT+CGSN 得到手机序列号(IMEI)
AT+CIMI 得到手机IMSI号码
AT+CSCS 获取、设置手机当前字符集。可设置为 GSM 或 UCS2
AT+CCLK 获取设置手机时钟
AT+COPS 网络营运商
AT+CSCA 短信中心号码
AT+CPMS 选择短信储存地点。可选择 ME(SIM卡)和MT(机身)
AT+CMGL 列出短信,列出指定状态的短信息的PDU代码
AT+CMGR 读短信,列出指定序号的短信息PDU代码
AT+CMGS 发送短信
AT+CMGD 删除指定的短信
AT+CMGF 短信格式。分为Text模式和PDU模式
AT+CNMI 设置新短消息通知电脑端

3 串口通信
串口通信注意两点:一,在任何一个系统中,操作串口和操作其他设备的接口是一样的,都是系统提供的最基础的API,有打开,初始化,读写和关闭操作;二,如果不喜欢使用系统提供的API,网上有已经封装好了的串口通信类,使用这些串口通信类可以极大地减小出错的概率。
3.1 windows
3.1.1 win32 API

见源码
3.1.2  A communication class for serial port
见源码
windows下串口通信类的下载及使用方法请参见:
http://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c2483
3.2 linux
3.2.1 File Operation
见源码
3.2.2 a qt class for serial communication
见源码
linux下(其实是基于qt扩展的,既可以用于linux下也可以用于windows下)串口通信类的下载及使用方法请参见:
http://code.google.com/p/qextserialport/

3.3 单片机
可以参看redmine系统中的单片机学习报告中关于串口通信的相信介绍。

4 附录
4.1 native2ascii工具
在使用GSM模块发送和接收短信的时候,如果是中文,必须转化为unicode编码,这里介绍一个小工具
在java的安装目录下,找到位于jdk目录下的bin目录下,有一个可执行文件: native2ascii.exe
双击这个.exe文件,弹出一个命令行控制台,直接输入中文,然后回车,返回的字符则是相应中文的unicode编码,其实这个工具用的很广泛,在做一些java的企业级应用,如果需要进行国际化,往往都会使用这个工具对资源文件进行编码控制。
其详细使用方法如下:
  1、只转换特定字符
  在控制台中可以输入汉字回车后,就可以看到转移后的字符了。
  Ctrl+C退出。
  2、转换properties文件
  native2ascii allMessages_zh_CN.input.properties allMessages_zh_CN.properties
  将文件allMessages_zh_CN.input.properties编码后输出为allMessages_zh_CN.properties。
  为了方便properties文件的管理,建议纯中文的配置文件用input命名。
  3、反向单一properties文件
  native2ascii -reverse allMessages_zh_CN.properties allMessages_zh_CN.txt
  注意-reverse参数
  4、批量反向所有的properties文件
  JDK自带的工具native2ascii可以将uncode编码的文件转换为本地编码的文件,但是不能批量转换文件。
4.2 更多相关资料,请参看以下链接:
GSM模块TC35i调试心得
http://hi.baidu.com/robo2046/blog/item/7a407a589560e4d39c8204e1.html
用MSP430串口中断服务程序将接受到的数据回发回去
http://zhidao.baidu.com/question/202687795.html
MSP430单片机的端口介绍
http://blog.csdn.net/chen_cheng_fly/article/details/4552402
MSP430单片机IO
http://www.cnblogs.com/MrYang/archive/2010/04/14/1711993.html
MSP430 多源中断 中断标志软件复位的问题
http://bbs.21ic.com/icview-188418-1-1.html
MSP430中断嵌套机制
http://www.jdzj.com/pic/Class346/Class362/20091207165253.html
MSP430源程序---P1.0口做外部中断
http://hi.baidu.com/liclny/blog/item/ed92b62f5cb8fd3f1e3089c2.html
引用 IAR+Proteus7.6仿真MSP430单片机PORT1外部中断功能
http://datouguaa.blog.163.com/blog/static/166069841201052811221152/
MSP430单片机学习(一)——Flash读写操作
http://hi.baidu.com/frfly2008/blog/item/3a17df16aafd591fc83d6d08.html
MSP430单片机入门例程-按键处理示例
http://www.cpu-led.com/forum.php?mod=viewthread&tid=1918&archiver=1
***********下一篇文章会放出源码,以下是上位机上的截图***************

  • 大小: 76.8 KB
  • 大小: 10.9 KB
  • 大小: 23.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics