- 📚 相关推荐文章
- AT指令集 推荐
- 16进制 指令集 校验码 计算器,文件输出计算结果 推荐

AT指令集
cae考试-初中体育教学反思
2023年2月21日发(作者:森林工业)百度文库-让每个人平等地提升自我!
1
串口应用实例——手机短信发送
一:简介
PC与手机通过串口连接,通过电脑控制手机发送短信,由于最近几年手机大多都提供USB
接口,通过手机USB驱动程序在手机和PC之间建立虚拟串口设备。由于大多数安卓手机
和苹果手机很难找到linux下的虚拟驱动软件,所以采用早起的诺基亚手机,使用一个名为
Gnokii的手机驱动软件。手机采用NOKIA6300手机进行操作。
二:AT指令简介
AT即Attention,AT指令集是从终端设备(TerminalEquipment,TE)或数据终端设备
(DataTerminalEquipment,DTE)向终端适配器(TerminalAdapter,TA)或数据电路终端设备
(DataCircuitTerminalEquipment,DCE)发送的。通过TA,TE发送AT指令来控制移动台
(MobileStation,MS)的功能,与GSM网络业务进行交互。用户可以通过AT指令进行呼叫、
短信、电话本、数据业务、传真等方面的控制。90年代初,AT指令仅被用于Modem操作。
没有控制移动电话文本消息的先例,只开发了一种叫SMSBlockMode的协议,通过终端设
备(TE)或电脑来完全控制SMS。几年后,主要的移动电话生产厂商诺基亚、爱立信、
摩托罗拉和HP共同为GSM研制了一整套AT指令,其中就包括对SMS的控制。AT指令
在此基础上演化并被加入GSM07.05标准以及现在的GSM07.07标准,完全标准化和比
较健全的标准。如:对SMS的控制共有3种实现途径:最初的BlockMode;基于AT指令
的TextMode;基于AT指令的PDUMode。到现在PDUMode已经取代BlockMode,后者逐
渐淡出。GSM模块与计算机之间的通信协议是一些AT指令集,AT指令是以AT作首,字
符结束的字符串,AT指令的响应数据包在中。每个指令执行成功与否都有相应的返回。其
他的一些非预期的信息(如有人拨号进来、线路无信号等),模块将有对应的一些信息提示,
接收端可做相应的处理。
由于本次只用到短信的AT指令所以只介绍AT指令集中的短信收发功能指令
GSMAT指令集
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显示文本方式的参数。
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信息状态(是否读过、是否发送等等)修正。
20、AT+WMGO信息覆盖写入。
百度文库-让每个人平等地提升自我!
2
21、AT+WUSS不改变SMS状态。在执行+CMGR或+CMGL后仍保持UNREAD。
三:PDU编码简介
目前,发送短消息常用Text和PDU(ProtocolDataUnit,协议数据单元)模式。使用Text
模式收发短信代码简单,实现起来十分容易,但最大的缺点是不能收发中文短信;而PDU
模式不仅支持中文短信,也能发送英文短信。PDU模式收发短信可以使用3种编码:7-bit、
8-bit和UCS2编码。7-bit编码用于发送普通的ASCII字符,8-bit编码通常用于发送数据消
息,UCS2编码用于发送Unicode字符。一般的PDU编码由ABCDEFGHIJKLM十三
项组成。
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位十六进制数。
M:用户数据,其长度由L中的数据决定。J中设定采用UCS2编码,这里是中英文的
Unicode字符。
需要注意的是,PDU串的用户信息长度(TP-UDL),在各种编码方式下意义有所不同。
7-bit编码时,指原始短消息的字符个数,而不是编码后的字节数。8-bit编码时,就是字节
数。UCS2编码时,也是字节数,等于原始短消息的字符数的两倍。如果用户信息(TP-UD)
中存在一个头(基本参数的TP-UDHI为1),在所有编码方式下,用户信息长度(TP-UDL)都
等于头长度与编码后字节数之和。如果采用GSM03.42所建议的压缩算法(TP-DCS的高3
位为001),则该长度也是压缩编码后字节数或头长度与压缩编码后字节数之和。
在TextMode下,发送及接收到的数据均以ASCII码的形式来表示。在PDUMode下,
短信息正文经过十六进制编码后被传送。PDU相当于一个数据包,它由构成消息(SMS)
的信息组成。作为一种数据单元,它必须包含源/目的地址、保护(有效)时间、数据格式、
协议类型和正文,正文长度可达140字节,它们都以十六进制表示。PDU结构根据短消息
由移动终端发起或以移动终端为目的而不同。每条消息可以发送140个字节,由于本系统中
最长的数据串没有超过140个字节,因此数据均可以用一条消息来发送。
考虑到GSM传输存在时延问题,与卫星传输方式一样,双方的数据收发均只采用自
报方式。即:终端站采用定时自报方式主动向后台中心发射数据,后台中心被动接收;当后
台中心需要终端站当前的数据或需要对终端站参数进行设置时,后台中心只向该终端站发射
相应的命令包,终端站收到该命令时,根据不同的命令以自报方式发送后台中心所要数据或
修改相应的参数。
百度文库-让每个人平等地提升自我!
3
四:用AT指令发送短信的代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineSTTY_DEV"/dev/ttyS0"
#defineBUFF_SIZE512
intSetoption(intfd)
{
structtermiosopt;
//获得当前串口设置
tcgetattr(fd,&opt);
tcflush(fd,TCIOFLUSH);
//设置波特率
cfsetispeed(&opt,B19200);
cfsetospeed(&opt,B19200);
//设置数据位8
options.c_cflag|=PARENB;
options.c_cflag&=~PARODD;
options.c_cflag&=~CSTOPB;
options.c_cflag&=~CSIZE;
options.c_cflag|=CS8;
/*Setthetimeoutoptions*/
options.c_cc[VMIN]=0;
options.c_cc[VTIME]=10;
options.c_cc[VTIME]=10;
if(0!=tcsetattr(fd,TCSANOW,&options));
perror("setbaudrate");
return-1;
tcflush(fd,TCIOFLUSH);
return0;
}
intmain()
{
intstty_fd,n;
iconv_tcd;
charbuffer[BUFF_SIZE];
charphone[20]="86"
charsms_number[20]="+86"
charsms_gb2312[140]="工作愉快“;
百度文库-让每个人平等地提升自我!
4
charsms_utf8[140];
char*sms_in=sms_gb2312;
char*sms_out=sms_utf8;
intstr_len,i,tmp;
intsms_utf8,gb2312_len;
//打开串口设备
fd=open("/dev/ttyS0",O_RSWR);//只读方式
if(-1==fd)
{
perror("opendevice");
return0;
}
printf("opendeviceOK!n");
if(0!=Setoption(fd))
{
close(fd);//关闭串口
return0;
}
/*转换电话号码*/
if(phone[0]=='+'){
for(i=0;i phone[i]=phone[i+1]; } phone[i]='0'; str_len=strlen(phone); if((strlen(phone)%2)!=0){ phone[str_len]='F'; phone[str_len+1]='0'; } for(i=0;i { tmp=phone[i]; phone[i]=phone[i+1]; phone[i+1]=temp; } /*转换短信中心号码*/ if(sms_number[0]=='+') { for(i=0;i sms_number[i]=sms_number[i+1]; } sms_number[i]='0'; str_len=strlen(sms_number); if((strlen(sms_number)%2)!=0){ sms_number[str_len]='F'; sms_number[str_len+1]='0'; 百度文库-让每个人平等地提升自我! 5 } for(i=0;i { tmp=sms_number[i]; sms_number[i]=sms_number[i+1]; sms_number[i+1]=temp; } str_len=strlen(sms_number); for(i=strlen(sms_number)+2;i!=0;i--) sms_number[i]=sms_number[i-2]; sms_number[str_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_number[i]=sms_number[i-2]; sms_number[str_len+3]='0'; sms_number[0]=(char)(tmp/10)+0x30; sms_number[0]=(char)(tmp%10)+0x30; /*转换短信内容*/ cd=iconv_open("utf-8","gb2312"); if(0==cd); { perror("creaticonvhandle!"); close(fd); return0; } gb2312_len=strlen(sms_gb2312); utf8_len=140; if(-1==iconv(cd,&sms_in,&gb2312_len, &sms_out,&utf8_len)){ perror("convertcode"); close(fd); return0; } iconv_close(cd); /*设置使用PDU模式*/ strcpy(buffer,"AT+CMGF=0n"); write(fd,buffer,strlen(buffer)); n=read(fd,buffer,BUFF_SIZE); if(n<=0){ perror("setpdumode"); close(fd); return0; } if(0!=strncmp(buffer,"ok",2)){ 百度文库-让每个人平等地提升自我! 6 perror("setpudmoade"); close(fd); return0; } /*发送信息*/ sprintf(buffer,"AT+GMGS=%dn",utf8_len); write(fd,buffer,strlen(buffer)); write(fd,sms_utf8,utf8_len); printf("sendmessageokn"); close(fd); } 五:实验总结: 用root权限运行程序,执行成功后手机会发送短信到指定号码,通过了电脑控制了手 机发送短信的功能,并且在做实验过程出现很多问题,首先就是下载的驱动是在windows 下面的,linux软件中心找不到,所以通过构建了samba服务器,建立于虚拟机的共享,最 终安装上了,刚开始手机给别人发短信过程总是出现问题,只能给自己发短信,最后找了很 久原来是PDU编码出现了问题,最后改了下能够顺利实现短信的发送。