打印

MSP430与TC35I模块收发短信(AT指令)实例[特约分享]

[复制链接]
4237|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
TA|  楼主 | 2011-11-25 12:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面格式有点乱,但确实已验证过的例子。感谢~~~
复制代码
  • include <msp430x44x.h>  
  • #include "xs.h"  
  • #include "GSM.h"  
  • void main(void)  
  • {  
  •    WDTCTL = WDTPW+WDTHOLD;  
  •    FLL_CTL0 |= XCAP14PF;                 // 设定负载电容值  
  •    SCFQCTL |= SCFQ_4M;                   // 设定主时钟为4MHz  
  •    init_LCD();      //初始化点阵LCD   
  •    init_serialcom(); //初始化串口      
  •    init_tc35_data();  
  •    AT_RST(); AT_RST();AT_RST();  
  •    ATE0();  
  •    _EINT();  
  • while(1)  
  • {  
  • //GSM_RX();  
  • SEND_MESSAGE();  
  • _NOP();  
  • }  
  • }  
  • GSM子程序:  
  • #define RST      0X01  
  • #define CMGF     0X02  
  • #define CMGD     0X03  
  • #define CREG     0X04  
  • #define CMGR     0X05  
  • #define CMGS     0X06  
  • #define CSCA     0X07  
  • #define ATDAT    0X08  
  • #define ATE      0X01  
  • #define TC35RET  0X00  
  • uchar i_tmp,j_tmp;  
  • uchar TC35_CON,ch;  
  • uchar read_flag;  
  • uchar i_TC35_RECE;  
  • uchar i_receive,  
  •       TC35_RE[80],  
  •        TC35_MAX,  
  •        i_TC35;  
  • uint delete;//设置一变量控制删除次数  
  • uchar TC_MDSJ[]={"AT+CMGS=159432142XX"};   //目的手机地址,  
  • uchar TC_ZXH[]={"AT+CSCA=+8613800432500"}; //本地中心号。  
  • uchar  TC_FSNR[]={"I AM OK"};                  //发送短信内容。  
  • uchar  TC_WLZT[]={"AT+CREG?"};                  //网络状态查询  
  • uchar  TC_MSXZ[]={"AT+CMGF=1"};                  //发送模式选择。  
  • uchar  TC_DQML[]={"AT+CMGR=1"};                  //短信读取命令。  
  • uchar  TC_SCML[]={"AT+CMGD=1"};                  //短信删除命令。  
  • uchar  TC_ATF[]={"AT&F"};                      //格式化命令。  
  • uchar  TC_ATE0[]={"ATE0"};                      //清除回显命令  
  • uchar  TC_ATE1[]={"ATE1"};                      //回复回显命令  
  • void delay(uint i)  
  • {unsigned int i_delay,j_delay;  
  • for(i_delay=0;i_delay<i;i_delay++)  
  • {for(j_delay=0;j_delay<100;j_delay++)  
  • {;}}  
  • }  
  • void init_tc35_data( void )  
  • {  
  • for(i_TC35=0;i_TC35<=TC35_MAX;i_TC35++)  
  • {TC35_RE[i_TC35]=0;}  
  • i_TC35_RECE=0;  
  • TC35_MAX=0;  
  • i_receive=0;  
  • TC35_CON=TC35RET;  
  • }  
  • void init_serialcom( void )  
  • {  
  • UTCTL0 = SSEL0;                       // UCLK = ACLK                           
  • UBR00 = 0x0D; // 32k/2400 - 13.65  
  • UBR10 = 0x00;                        
  • UMCTL0 = 0x6D;                       // 调制  
  • UCTL0 = CHAR;                         // 8位字符*SWRST*  
  • ME1 |= UTXE0 + URXE0;                 // 使能 USART0 TXD/RXD  
  • IE1 |= URXIE0;                        // 使能 USART0 RX 中断  
  • P2SEL |= 0x30;                        // P2.4,5 = USART0 TXD/RXD  
  • P2DIR |= 0x10;                        // P2.4 输出方向  
  • }  
  • //向串口发送一个字符  
  • void send_uart( unsigned char ch)  
  • {  
  •   //  while ((IFG1 & UTXIFG0) == 0);        // USART0 TX 缓存器准备好?                  
  •   TXBUF0=ch;  
  •   delay(200);               
  • }  
  • void ATE0()  
  • {//I AM OK  
  • uchar i;  
  • for(i=0;i<sizeof(TC_ATE0)-1;i++)  
  • { send_uart(TC_ATE0);}  
  •   send_uart(0X0D);  
  • send_uart(0X0A);  
  •   TC35_CON=ATE;  
  • //TC35_CON=ATDAT;  
  • }  
  • void ATNAME()  
  • { //I AM OK  
  •   uchar i;  
  • for(i=0;i<sizeof(TC_FSNR)-1;i++)  
  • { send_uart(TC_FSNR);}  
  • delay(500);delay(500);  
  • send_uart(0X1A);  
  • send_uart(0X0D);  
  • send_uart(0X0A);  
  • TC35_CON=ATDAT;  
  • }  
  • //写目的手机的  
  • void AT_CMGS()  
  • {  
  • uchar i;  
  • for(i=0;i<sizeof(TC_MDSJ)-1;i++)  
  • {send_uart(TC_MDSJ);}  
  • send_uart(0X0D);  
  • send_uart(0X0A);  
  • TC35_CON=CMGS;  
  • }  
  • //写信息中心号  
  • void AT_CSCA()  
  • {//AT+CSCA=+86`````  
  • uchar i;  
  • for(i=0;i<sizeof(TC_ZXH)-1;i++)  
  • {send_uart(TC_ZXH);}  
  • send_uart(0X0D);  
  • send_uart(0X0A);  
  • TC35_CON=CSCA;  
  • }  
  • //AT复位指令  
  • void AT_RST()  
  • {  
  • uchar i;  
  • for(i=0;i<sizeof(TC_ATF)-1;i++)  
  • {send_uart(TC_ATF);}  
  • send_uart(0X0D);  
  • send_uart(0X0A);  
  • TC35_CON=RST;  
  • }  
  • //AT网络状态查询指令  
  • void AT_CREG()  
  • {  
  • uchar i;  
  • for(i=0;i<sizeof(TC_WLZT)-1;i++)  
  • {send_uart(TC_WLZT);}  
  • send_uart(0X0D);  
  • send_uart(0X0A);  
  • TC35_CON=CREG;  
  • }  
  • //AT接收格式指令  
  • void AT_CMGF()  
  • {//AT+CMGF=1  
  • uchar i;  
  • for(i=0;i<sizeof(TC_MSXZ)-1;i++)  
  • {send_uart(TC_MSXZ);}  
  • send_uart(0X0D);  
  • send_uart(0X0A);  
  • TC35_CON=CMGF;  
  • }  
  • //AT短消息读取指令  
  • void AT_CMGR()  
  • {//AT+CMGR=1  
  • uchar i;  
  • for(i=0;i<sizeof(TC_DQML)-1;i++)  
  • {send_uart(TC_DQML);}  
  • send_uart(0X0D);  
  • send_uart(0X0A);  
  • TC35_CON=CMGR;  
  • }  
  • //AT短消息删除指令  
  • void AT_CMGD()  
  • {//AT+CMGD=1  
  • uchar i;  
  • for(i=0;i<sizeof(TC_SCML)-1;i++)  
  • {send_uart(TC_SCML);}  
  • send_uart(0X0D);  
  • send_uart(0X0A);  
  • TC35_CON=CMGD;  
  • }  
  • //串口接收中断函数  
  • #pragma vector=USART0RX_VECTOR  
  • __interrupt  void usart0_rx (void)  
  • {  
  •     _NOP();  
  •     i_receive=RXBUF0;      
  •     TC35_RE[i_TC35_RECE++]=i_receive;  
  •     if(i_TC35_RECE>TC35_MAX){TC35_MAX=i_TC35_RECE;}  
  • }  
  • void GSM_RX()  
  • {   
  • delay(100); //此处最好加延时  
  •   if(TC35_MAX>0)  
  • {  
  • if(TC35_CON==ATE)  
  •     {  
  •      if((TC35_RE[2]=='O')&&(TC35_RE[3]=='K'))  
  •        {  
  •        init_tc35_data();  
  •         AT_CMGF();}  
  •      else{init_LCD(); px=20; py=16; width=96; drawStr2(px,py);init_tc35_data(); ATE0();}  
  •     }   
  •   else if(TC35_CON==CMGF)  
  •      {  
  •       if((TC35_RE[2]=='O')&&(TC35_RE[3]=='K'))  
  •        {  
  •         init_tc35_data();  
  •        AT_CMGR();}  
  •       else{init_LCD(); px=20; py=16; width=96; drawStr3(px,py);init_tc35_data();AT_CMGF();}  
  •      }  
  • else if(TC35_CON==CMGR)  
  •   {  
  •      {  
  •      if((TC35_RE[62]=='O')&&(TC35_RE[63]=='N'))  
  •          {init_LCD(); px=20; py=24; width=80; drawStr6(px,py);  
  •          init_tc35_data();delay(100);AT_CMGD();  
  •          }  
  •      else if((TC35_RE[62]=='O')&&(TC35_RE[64]=='F'))  
  •          {init_LCD();px=20; py=20; width=88;drawStr7(px,py);  
  •          init_tc35_data();delay(100);AT_CMGD();  
  •          }  
  •   else  
  •      {init_LCD();  
  •      px=20; py=0; width=128; drawStr4(px,py);  
  •      init_tc35_data();delay(100);AT_CMGR();}  
  •     }  
  •   }  
  • else if(TC35_CON==CMGD)  
  • {  
  • if((TC35_RE[2]=='O')&&(TC35_RE[3]=='K'))  
  • {AT_CMGR();  
  • }  
  • else{init_LCD();px=20; py=16; width=96; drawStr5(px,py);  
  •      delay(100);  
  •      delete+=1;  
  •      AT_CMGD();  
  •     if(10==delete){delete=0;init_LCD();  
  •      px=20; py=0; width=128; drawStr4(px,py);  
  •      init_tc35_data();delay(100);AT_CMGR();}  
  •    }  
  •   }  
  • }  
  • }  
  • void SEND_MESSAGE()  
  • { delay(100);  
  • if(TC35_MAX>0)  
  • {  
  • if(TC35_CON==ATE){  
  • if((TC35_RE[2]=='O')&&(TC35_RE[3]=='K'))  
  • {  
  • init_tc35_data();  
  • AT_CMGF();}  
  • //如果不成功则重新关闭回显  
  • else{ init_LCD(); px=20; py=16; width=96; drawStr2(px,py);init_tc35_data();  
  • ATE0();  
  • }  
  • }  
  • else if(TC35_CON==CMGF){                    //设置短信收发方式  
  • if((TC35_RE[2]=='O')&&(TC35_RE[3]=='K'))  
  • {init_tc35_data();  
  • delay(100);  
  • AT_CSCA();}  
  • else{init_LCD(); px=20; py=16; width=96; drawStr3(px,py);init_tc35_data();AT_CMGF();}  
  • }  
  • //填写信息中心号  
  • else if(TC35_CON==CSCA)  
  • {  
  • delay(100);  
  • if((TC35_RE[2]=='O')&&(TC35_RE[3]=='K'))  
  • { init_LCD();  
  • px=20; py=0; width=128; GSM_TX4(px,py);  
  • init_tc35_data();   
  • delay(100);init_tc35_data();AT_CMGS();  
  • }  
  • else{init_tc35_data();AT_CSCA();}  
  • }  
  • //填写目的手机  
  • else if(TC35_CON==CMGS){  
  • delay(100);  
  • if((TC35_RE[2]==0X3E)&&(TC35_RE[3]==0X20))  
  • {  
  • init_tc35_data();  
  • delay(100);init_tc35_data();ATNAME();  
  • init_LCD();  
  • px=20; py=0; width=128; GSM_TX3(px,py);}  
  • else{init_LCD();  
  • px=20; py=0; width=128; GSM_TX1(px,py);init_tc35_data(); AT_CMGS();}  
  • }  
  • //发送完毕返回继续扫描接收  
  • else if(TC35_CON==ATDAT){  
  • delay(10);  
  • if(TC35_RE[2]=='+')  
  • { init_LCD(); px=20; py=20; width=80; GSM_TX2(px,py);  
  • init_tc35_data();  
  •   }  
  •   else{init_LCD(); px=20; py=20; width=80; GSM_TX5(px,py);}  
  •   }  
  •   }  
  • }  



其中类似 px=20; py=20; width=80; GSM_TX5(px,py); 为12864显示函数 在此就不要列出了。
由于是测试程序 需手动在主程序循环中分别屏蔽GSM_RX();SEND_MESSAGE();分别测试接收短信和发送短信,其中接收短信 只编辑了 接收到ON和OFF

相关帖子

沙发
一个机会| | 2011-11-27 13:02 | 只看该作者
这个学期来最难的是协议啊

使用特权

评论回复
板凳
tl5324260| | 2011-11-28 13:43 | 只看该作者
学习  学习

使用特权

评论回复
地板
cococenstar| | 2012-5-2 23:41 | 只看该作者
学习了

使用特权

评论回复
5
wangkangming| | 2012-5-3 12:51 | 只看该作者
我现在串行通信都编写的不好。通信总是出错。接收到的数据也处理不好。总之对串行通信学的是一塌糊涂

使用特权

评论回复
6
拿起书本| | 2012-5-3 23:03 | 只看该作者
串口这一块就是个接收和发送,如果有现成的协议,把协议读懂了,其实的都不是问题。先从最简单的接收和发送开如,不要怕,慢慢来。

使用特权

评论回复
7
287651380| | 2013-4-4 15:55 | 只看该作者
什么是协议???在哪儿

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

TA

12

主题

110

帖子

0

粉丝