单片机控制GSM模块(TC35)收发短信接打电话 这两天用单片机控制GSM模块(TC35)收发短信接打电话碰到了一些问题,也走了一些弯路,总的看来用AT命令控制GPRS算是比较简单,不过要注意的是一些细节问题,如果没注意到这些问题将会耗费很多时间。 网上相关的资料有很多,但感觉比较杂,一些细节问题没有强调清楚。先看下发短信的几个AT命令。 直接在pc上面串口操作的命令如下: 依次执行下列命令, AT+CMGF=1 //文本方式 AT+CSCS="GSM" //字符模式 AT+CSMP=17,168,0,0 //字符编码 AT+CSCA="+8613800791500",145 //短信中心号码 AT+CMGS="136********" //发短信命令 接收短信的号码 //当命令AT+CMGS="136********"执行后超级终端出现>(大于号),提示用户在大于号后面输入短信内容。 短信内容输入完毕后直接按键盘上的Ctrl+z确认发送。除命令“AT+CMGS="136********"”执行成功后是返回“>”,其它命令执行成功后都直接返回“OK”,当然“AT+CMGS="136********"”这条命令执行完后是等待用户的输入,用户按 Ctrl+z发送后,发送成功依然会返回“OK”。 接收短信的操作更简单,只要通过执行AT+CMGF=1命令选择文本方式后就能通过读取命令读取收到的短信,收短信我们不用设置GPRS怎样接收短信,因为GPRS接收短信的操作是内部完成的,我们不用去理会。当然如果之前你发短信的操作已经执行了AT+CMGF=1命令的话,那你收短信的时候就没必要重复操作了。
收短信的操作如下: 1.列举所有短信: AT+CMGF=1 AT+CMGL="ALL" //读取所有短信 2.列举未读的短信: AT+CMGF=1 AT+CMGL=”REC UNREAD” 3.列举已读的短信: AT+CMGF=1 AT+CMGL=”REC READ” 其实叫列举,也就是读取的意思,只是读取的是多条短信,是所有的短信内容的列表。 4.读取短信: AT+CMGF=1 AT+CMGR=短信索引号
删除短信的操作: 按索引号删除: AT+CMGF=1 AT+CMGD=短信存储索引号 //当读出所有短信时,每条短信前面都对应了本条//短信的索引编号 删除已读短信: AT+CMGF=1 AT+CMGD=1,2
接听电话: 简单的一个ATA就搞定。
拨打电话: ATD136********; //别漏掉了“;”
挂电话命令: ATH
以上所讲的都是直接通过超级终端或串口调试平台进行的命令操作。在编程应用这些命 令时还要注意一些细节问题。 编程中注意除了确认短信发送的这条指令0X1A(对应ctrl+z的十六进制表示)外每条命令结尾都要加上“\r\n”。 具体发短信的操作可以参考我的代码: //发送短信 //参数 1短信号码 2短信内容 void SendMessage(unsigned char *num,unsigned char *massge) { unsigned char instuct[]="AT+CMGS=\""; unsigned char numinstuct[27]; strcpy(numinstuct,instuct); strcat(numinstuct,num); strcat(numinstuct,"\"\r\n"); USART1_Write_DR(numinstuct);//AT+CMGS=\"136********\" USART1_Write_DR(massge); UART1_SendByte(0x1a); }
调用该函数: SendMessage("158********","test!\r\n"); //发送短信 注意加\r\n
我做本程序所要实现的是从短信的内容中提取相关的控制命令,MUC根据相关命令执行对应的操作,一开始我想从GPRS通过串口返回的字符串中提取相关的命令字符,由于GPRS通过串口返回的字符有其特殊的格式,提取比较麻烦,而且提取得按一定的格式来操作,显然操作起来不灵活,而用户也得按这种格式来发命令显然不方便用户操作,并且使得用户的操作更为复杂。 折腾了好一阵子后我突然意识到直接用strstr(char *str1, char *str2)(未检测到str2则返回NULL,检测到了就返回从str2开始到后面的字符)函数检测字符更方便,而且可以实现短信内容的智能识别,这样我只要判断短信中存不存在相应的命令字符就可以,没必要考虑繁杂的字符串提取问题。而且用户发命令可以相对自由,只要单个命令不出错,多个命令之间可以自由排列,甚至可以出现不相关的字符,当然前提是这些不相关的字符的组合不会出现用户命令协议中的命令字符。 编写AT命令时大家还得注意确保字符是在英文输入法下输入的。 就总结到这里了,大家可以参考我的代码,进一步分析我以上总结的。 每条指令用0x0D结尾。
|