《【2017年整理】串口应用实例——手机短信发送》由会员分享,可在线阅读,更多相关《【2017年整理】串口应用实例——手机短信发送(6页珍藏版)》请在金锄头文库上搜索。
1、串口应用实例手机短信发送一:简介PC 与手机通过串口连接,通过电脑控制手机发送短信,由于最近几年手机大多都提供USB 接口,通过手机 USB 驱动程序在手机和 PC 之间建立虚拟串口设备。由于大多数安卓手机和苹果手机很难找到 linux 下的虚拟驱动软件,所以采用早起的诺基亚手机,使用一个名为 Gnokii 的手机驱动软件。手机采用 NOKIA 6300 手机进行操作。二:AT 指令简介AT 即 Attention,AT 指令集是从终端设备 (Terminal Equipment,TE)或数 据 终 端 设 备(Data Terminal Equipment,DTE)向终端适配器(Termin
2、al Adapter, TA)或数 据 电 路 终 端 设备 (Data Circuit Terminal Equipment,DCE) 发送的。通过 TA,TE 发送 AT 指令来控制移动台(Mobile Station,MS) 的功能,与 GSM 网络业务进行交互。用户可以通过 AT 指令进行呼叫、短信、电话本、数据业务、传真等方面的控制。90 年代初,AT 指令仅被用于Modem 操作。没有控制移动电话文本消息的先例,只开发了一种叫 SMS BlockMode 的协议,通过终端设备(TE)或电脑来完全控制 SMS。几年后,主要的移动电话生产厂商诺基亚、爱立信、摩托罗拉和 HP 共同为 G
3、SM 研制了一整套 AT 指令,其中就包括对 SMS的控制。AT 指令在此基础上演化并被加入 GSM0705 标准以及现在的 GSM0707 标准,完全标准化和比较健全的标准。如:对 SMS 的控制共有 3 种实现途径:最初的BlockMode;基于 AT 指令的 TextMode;基于 AT 指令的 PDUMode。到现在 PDUMode 已经取代 BlockMode,后者逐渐淡出。GSM 模块与计算机之间的通信协议是一些 AT 指令集,AT 指令是以 AT 作首,字符结束的字符串,AT 指令的响应数据包在中。每个指令执行成功与否都有相应的返回。其他的一些非预期的信息(如有人拨号进来、线路无
4、信号等) ,模块将有对应的一些信息提示,接收端可做相应的处理。 由于本次只用到短信的 AT 指令所以只介绍 AT 指令集中的短信收发功能指令GSM AT 指令集1、 AT+CSMS 选择消息服务。支持的服务有 GSM-MO、SMS-MT、SMS-CB。 2、 AT+CNMA 新信息确认应答。 3、 AT+CPMS 优先信息存储。这个命令定义用来读写信息的存储区域。 4、 AT+CMGF 优先信息格式。执行格式有 TEXT 方式和 PDU 方式。 5、 AT+CSAS 保存设置。保存 +CSAS 和+CSMP 的参数。 6、 AT+CRES 恢复设置。 7、 AT+CSDH 显示文本方式的参数。
5、 8、 AT+CNMI 新信息指示。这个命令选择如何从网络上接收短信息。 9、 AT+CMGR 读短信。信息从+CPMS 命令设定的存储器读取。 10、 AT+CMGL 列出存储的信息。 11、 AT+CMGS 发送信息。 12、 AT+CMGW 写短信息并存储。 13、 AT+CMSS 从存储器中发送信息。 14、 AT+CSMP 设置文本模式的参数。 15、 AT+CMGD 删除短信息。删除一个或多个短信息。 16、 AT+CSCA 短信服务中心地址。 17、 AT+CSCB 选择单元广播信息类型。 18、 AT+WCBM 单元广播信息标识。 19、 AT+WMSC 信息状态(是否读过、是
6、否发送等等)修正。 20、 AT+WMGO 信息覆盖写入。 21、 AT+WUSS 不改变 SMS 状态。在执行+CMGR 或+CMGL 后仍保持 UNREAD。三:PDU 编码简介目前,发送短消息常用 Text 和 PDU(Protocol Data Unit,协议数据单元)模式。使用Text 模式收发短信代码简单,实现起来十分容易,但最大的缺点是不能收发中文短信;而PDU 模式不仅支持中文短信,也能发送英文短信。PDU 模式收发短信可以使用 3 种编码:7-bit、8-bit 和 UCS2 编码。7-bit 编码用于发送普通的 ASCII 字符,8-bit 编码通常用于发送数据消息,UCS
7、2 编码用于发送 Unicode 字符。一般的 PDU 编码由 A B C D E F G H I J K L M 十三项组成。A:短信息中心地址长度,2 位十六进制数(1 字节)。B:短信息中心号码类型,2 位十六进制数。C:短信息中心号码,B+C 的长度将由 A 中的数据决定。D:文件头字节,2 位十六进制数。 E:信息类型,2 位十六进制数。F:被叫号码长度,2 位十六进制数。G:被叫号码类型,2 位十六进制数,取值同 B。H:被叫号码,长度由 F 中的数据决定。I:协议标识,2 位十六进制数。J:数据编码方案,2 位十六进制数。K:有效期,2 位十六进制数。L:用户数据长度,2 位十六
8、进制数。M:用户数据,其长度由 L 中的数据决定。J 中设定采用 UCS2 编码,这里是中英文的 Unicode 字符。需要注意的是,PDU 串的用户信息长度(TP-UDL),在各种编码方式下意义有所不同。7-bit 编码时,指原始短消息的字符个数,而不是编码后的字节数。8-bit 编码时,就是字节数。UCS2 编码时,也是字节数,等于原始短消息的字符数的两倍。如果用户信息(TP-UD)中存在一个头(基本参数的 TP-UDHI 为 1),在所有编码方式下,用户信息长度(TP-UDL)都等于头长度与编码后字节数之和。如果采用 GSM 03.42 所建议的压缩算法(TP-DCS 的高 3位为 00
9、1),则该长度也是压缩编码后字节数或头长度与压缩编码后字节数之和。在 Text Mode 下,发送及接收到的数据均以 ASCII 码的形式来表示。在 PDU Mode下,短信息正文经过十六进制编码后被传送。PDU 相当于一个数据包,它由构成消息(SMS)的信息组成。作为一种数据单元,它必须包含源/目的地址、保护(有效)时间、数据格式、协议类型和正文,正文长度可达 140 字节,它们都以十六进制表示。PDU 结构根据短消息由移动终端发起或以移动终端为目的而不同。每条消息可以发送 140 个字节,由于本系统中最长的数据串没有超过 140 个字节,因此数据均可以用一条消息来发送。考虑到 GSM 传输
10、存在时延问题,与卫星传输方式一样,双方的数据收发均只采用自报方式。即:终端站采用定时自报方式主动向后台中心发射数据,后台中心被动接收;当后台中心需要终端站当前的数据或需要对终端站参数进行设置时,后台中心只向该终端站发射相应的命令包,终端站收到该命令时,根据不同的命令以自报方式发送后台中心所要数据或修改相应的参数。四:用 AT 指令发送短信的代码:#include #include #include #include #include #include #include #include #include #define STTY_DEV /dev/ttyS0#define BUFF_SIZE
11、512int Setoption(int fd)struct termios opt;/获得当前串口设置tcgetattr(fd,&opt);tcflush(fd,TCIOFLUSH);/设置波特率cfsetispeed(&opt,B19200);cfsetospeed(&opt,B19200);/设置数据位 8options.c_cflag |= PARENB; options.c_cflag &= PARODD; options.c_cflag &= CSTOPB; options.c_cflag &= CSIZE; options.c_cflag |= CS8; /* Set the t
12、imeout options */ options.c_ccVMIN = 0; options.c_ccVTIME = 10; options.c_ccVTIME = 10; if(0!=tcsetattr(fd, TCSANOW, &options); perror(set baudrate);return -1; tcflush(fd,TCIOFLUSH);return 0;int main()int stty_fd ,n;iconv_t cd;char bufferBUFF_SIZE;char phone20=86 char sms_number20=+86 char sms_gb231
13、2140=工作愉快“; char sms_utf8140;char *sms_in=sms_gb2312;char *sms_out=sms_utf8;int str_len,i,tmp;int sms_utf8,gb2312_len;/打开串口设备fd=open(/dev/ttyS0, O_RSWR);/只读方式if(-1=fd)perror(open device);return 0;printf(open device OK!n);if(0!=Setoption(fd)close (fd);/关闭串口return 0;/*转换电话号码*/if (phone0=+)for (i=0;ist
14、rlen(phone)-1;i+)phonei=phonei+1;phonei=0;str_len=strlen(phone);if (strlen(phone)%2)!=0)phonestr_len=F;phonestr_len+1=0;for (i=0;istrlen(phone);i+=2)tmp=phonei;phonei=phonei+1;phonei+1=temp;/*转换短信中心号码*/if (sms_number0=+)for(i=0;istrlen(sms_number)-1;i+)sms_numberi=sms_numberi+1;sms_numberi=0;str_len
15、=strlen(sms_number);if (strlen(sms_number)%2)!=0)sms_numberstr_len=F;sms_numberstr_len+1=0;for (i=0;istrlen(sms_number);i+=2)tmp=sms_numberi;sms_numberi=sms_numberi+1;sms_numberi+1=temp;str_len=strlen(sms_number);for(i=strlen(sms_number)+2;i!=0;i-)sms_numberi=sms_numberi-2;sms_numberstr_len+3=0;strncpy(sms_number,91,2);temp=strlen(sms_number)/2;str_len=strlen(sms_number);for(i=strlen(sms_number)+2;i!=0;i-)sms_numberi=sms_numberi-2;sms_numberstr_len+3=0;sms_number0=(char)(tmp/10)+0x30;sms_number0=(char)(tmp%10)+0x30;/*转换短信内容*/cd=iconv_open(utf-8,gb2312);if