找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5453|回复: 2
打印 上一主题 下一主题
收起左侧

M8单片机串口通讯监听(使用PROTEUS串口仿真GSM模块AT指令通讯)源码

[复制链接]
跳转到指定楼层
楼主
实现监听(使用PROTEUS串口例子)V1.0
M8单片机仿真原理图如下(proteus仿真工程文件可到本帖附件中下载):


全部资料51hei下载地址:
窃听器(使用PROTEUS串口例子)V1.0.zip (123.24 KB, 下载次数: 67)



单片机源程序如下:
  1. ////////////////////////////////////////////////////////////////////////////////
  2. // ICC-AVR application builder : 6-25 下午 06:02:39
  3. // Target : M8
  4. // Crystal: 3.6864Mhz
  5. // Author:  Anwarye
  6. // Title:   Detcetaphone
  7. ////////////////////////////////////////////////////////////////////////////////

  8. #include <iom8v.h>
  9. #include <macros.h>
  10. #include "var.h"

  11. #define XTAL == 3.6864M

  12. ////////////////////////////////////////////////////////////////////////////////
  13. #pragma interrupt_handler uart0_rx_isr:12
  14. void uart0_rx_isr(void)
  15. {
  16.     unsigned char i,j;
  17.     if(UDR == 0x0A)
  18.     {
  19.        return;                 // 收到0x0A直接丢弃
  20.     }
  21.         
  22.         i = RxIndex;
  23.         j = RxIndex-1;
  24.     if((RxBuf[0] == 0x30) && (RxBuf[1] == 0x0D))
  25.     {
  26.         RxIndexTail = RxIndex;              // 保存接收缓冲指针尾
  27.         RxIndex = 0;                                                   // 接收缓冲指针归零
  28.             RxStatus = 1;                                                // 接收完成标志置位
  29.                 OkFlag = 1;
  30.                 error = 0;
  31.                 return;
  32.         }
  33.     if((RxBuf[0] == 0x32) && (RxBuf[1] == 0x0D))  // 收到来电信号,来电标志置位
  34.     {
  35.         CallInFlag = 1;                            // 置电话呼入标志
  36.             RxIndex = 0;
  37.                 RxStatus = 1;
  38.                 OkFlag = 1;
  39.                 return;  
  40.     }
  41.     else if((RxBuf[0] == 0x33) && (RxBuf[1] == 0x0D))  // 被叫号码忙 或者挂机 主叫挂机
  42.     {
  43.         BusyFlag = 1;                                       // 置电话呼入标志
  44.             RxIndex = 0;
  45.                 RxStatus = 1;
  46.                 OkFlag = 1;
  47.                 return;  
  48.     }      
  49.     else if((RxBuf[0] == 0x37) && (RxBuf[1] == 0x0D))  // 收到来电信号,来电标志置位
  50.     {
  51.         NoCarrierFlag = 1;                                   // 置电话呼入标志  NO CARRIER
  52.             RxIndex = 0;
  53.                 RxStatus = 1;
  54.                 OkFlag = 1;
  55.                 return;
  56.     }
  57.     else if((RxBuf[0] == 0x34) && (RxBuf[1] == 0x0D))  // 收到来电信号,来电标志置位
  58.     {
  59.             RxIndex = 0;
  60.                 RxStatus = 1;
  61.                 OkFlag = 1;
  62.                 error = 1;
  63.                 return;        
  64.         }
  65.         else
  66.     {
  67.    
  68.     RxBuf[RxIndex++] = UDR;                 // 继续接收数据放入接收缓冲
  69.         RxStatus = 0;                         // 串口接收中
  70. //        return;                                                                     // 结束接收,直接跳出
  71.         }
  72. }

  73. ////////////////////////////////////////////////////////////////////////////////
  74. #pragma interrupt_handler uart0_tx_isr:14
  75. void uart0_tx_isr(void)
  76. {
  77.    
  78.     if(!TxStatus)                                   // 本帧数据未发完,则继续发送  
  79.         {
  80.             //while ( !(UCSRA & (1<<UDRE)) );             // 等待UDR空
  81.             UDR = TxBuf[TxIndex];               
  82.         }
  83.         if((TxBuf[TxIndex] == 0x0D) || (TxBuf[TxIndex] == 0x1A))  // 本帧数据发送结束
  84.         {
  85.                 TxStatus = 1;                          // 发送完成状态标志置位
  86.                 TxIndex = 0;                           // 发送缓冲区指针归零
  87.                 UCSRB &= ~((1<<TXCIE));//|(1<<TXEN));  // 关发送中断
  88.                 return;
  89.         }
  90.         TxIndex++;                              
  91. }
  92. unsigned char CheckRx(void)
  93. {
  94.     unsigned char i,j;
  95.         i = RxIndex;
  96.         j = RxIndex - 1;
  97.     if(( RxBuf[j] == 0x30) && (RxBuf[i] == 0x0D))
  98.         {
  99.             RxIndex = 0;
  100.                 return (1);
  101.         }
  102.         else
  103.         {
  104.             return (0);
  105.         }
  106. }
  107. /*-----------------------------------------------------------------------*/
  108. ///////////////////////////  清除接收缓冲  ////////////////////////////////
  109. /*-----------------------------------------------------------------------*/
  110. void ClearRxBuf(void)
  111. {
  112.     unsigned char i;
  113.         for(i=0;i<128;i++)
  114.         {
  115.             RxBuf[i] = 0;
  116.         }
  117. }
  118. /*-----------------------------------------------------------------------*/
  119. ///////////////////////////  串口发送使能  ////////////////////////////////
  120. /*-----------------------------------------------------------------------*/
  121. void TxEnable(void)
  122. {
  123.     //RxIndex = 0;
  124.     UDR = TxBuf[0];                            // 发送缓冲头送入串口发送寄存器,激活开始发送
  125.         UCSRB |= ((1<<TXCIE));//|(1<<TXEN));
  126. }
  127. /*-----------------------------------------------------------------------*/
  128. /////////////////////////////  发送AT命令 /////////////////////////////////
  129. /*-----------------------------------------------------------------------*/
  130. void Put_AT_command(const unsigned char *atc, unsigned char atlen)
  131. {
  132.     unsigned char count;
  133.         
  134.         for(count = 0;count < atlen;count++)      // AT命令窜移入发送缓冲
  135.         {
  136.             TxBuf[count] = atc[count];
  137.         }
  138.         
  139.         TxBuf[atlen] = 0x0D;                      // 发送缓冲窜结尾加“回车”
  140.         TxBuf[atlen + 1] = 0x00;                  // 发送缓冲窜结束符号

  141.         OkFlag = 0;
  142.     TxStatus = 0;
  143.         TxIndex = 1;                              // 发送指针偏移1
  144.         TxEnable();                               // 激活发送
  145.     while(!TxStatus);                         // 等代发送结束,发送缓冲指针为零则可以发送
  146.         DelayMs(20);
  147.         while(!OkFlag);                           // 收到模块返回OK,命令结束
  148.         OkFlag = 0;

  149. }

  150. /*-----------------------------------------------------------------------*/
  151. /////////////////////////  从内存发送AT命令串  ////////////////////////////
  152. /*-----------------------------------------------------------------------*/
  153. void Put_AT_String(unsigned char *atc, unsigned char atlen)
  154. {
  155.     unsigned char count;
  156.                
  157.         for(count = 0;count < atlen;count++)
  158.         {
  159.             TxBuf[count] = *(atc+count);
  160.         }
  161.         
  162.         TxBuf[atlen] = 0x0D;                      // 发送缓冲窜结尾加“回车”
  163.         TxBuf[atlen + 1] = 0x00;                  // 发送缓冲窜结束符号

  164.     OkFlag = 0;
  165.     TxStatus = 0;
  166.         TxIndex = 1;                              // 发送指针偏移1
  167.         TxEnable();                               // 激活发送
  168.     while(!TxStatus);                         // 等代发送结束,发送缓冲指针为零则可以发送
  169.         DelayMs(20);
  170.         while(!OkFlag);                           // 收到模块返回OK,命令结束
  171.         OkFlag = 0;
  172. }
  173. /*-----------------------------------------------------------------------*/
  174. /////////////////////////  向串口发送一串数据  ////////////////////////////
  175. /*-----------------------------------------------------------------------*/
  176. void PutString(unsigned char *str, unsigned char length,unsigned char retflag)
  177. {
  178.     unsigned char count;

  179.         for(count = 0;count < length;count++)
  180.         {
  181.             TxBuf[count] = *(str+count);
  182.         }
  183.         
  184.         TxBuf[length] = 0x0D;                     // 发送缓冲窜结尾加“回车”
  185.         TxBuf[length+ 1] = 0x00;                  // 发送缓冲窜结束符号
  186.         
  187.     TxStatus = 0;
  188.         TxIndex = 1;                              // 发送指针偏移1
  189.         OkFlag = 0;
  190.         TxEnable();
  191.                                                   // 激活发送
  192.     while(!TxStatus);                         // 等代发送结束,发送缓冲指针为零则可以发送
  193.         DelayMs(20);
  194.     if(retflag)
  195.     {        
  196.         while(!OkFlag);                       // 收到模块返回OK,命令结束
  197.                 OkFlag = 0;
  198.         }
  199.         else
  200.         {
  201.         DelayMs(200);
  202.                 OkFlag = 0;
  203.         }
  204. }
  205. ////////////////////////////////////////////////////////////////////////////////

  206. /*-----------------------------------------------------------------------*/
  207. //////////////////////////         拨号         ///////////////////////////
  208. /*-----------------------------------------------------------------------*/
  209. void DialNum(void)
  210. {
  211.     unsigned char i,count=0,length=0;

  212.         while ((PhoneNum[count++] != 0))                  // 计算电话号码长度
  213.         {
  214.             length++;
  215.         }
  216.         
  217.         TxBuf[0] = 'A';
  218.         TxBuf[1] = 'T';
  219.         TxBuf[2] = 'D';
  220.         
  221.         i = 3;
  222.     for(count=0;count<length;count++)
  223.         {
  224.             TxBuf[i++] = PhoneNum[count];
  225.         }
  226.    
  227.         TxBuf[length+3] = ';';
  228.         TxBuf[length+4] = 0x0D;
  229.         
  230.     OkFlag = 0;
  231.     TxStatus = 0;
  232.         TxIndex = 1;                              // 发送指针偏移1
  233.         TxEnable();                               // 激活发送
  234.     while(!TxStatus);                         // 等代发送结束,发送缓冲指针为零则可以发送
  235.         DelayMs(20);
  236.         //while(!OkFlag);                           // 收到模块返回OK,命令结束        
  237.     OkFlag = 0;
  238. }

  239. /*-----------------------------------------------------------------------*/
  240. /////////////////////////////  比较两个串 /////////////////////////////////
  241. /*-----------------------------------------------------------------------*/
  242. unsigned char StringCompare(volatile unsigned char *str1,const unsigned char *str2,unsigned char strlen)
  243. {
  244.     while(strlen--)
  245.         {
  246.             if(*str1++ != *str2++) return(FALSE);    // 两个串不相等返回假
  247.         }
  248.         return(TRUE);
  249. }

  250. /*-----------------------------------------------------------------------*/
  251. /////////////////////////////    删除短信    //////////////////////////////
  252. /*-----------------------------------------------------------------------*/
  253. void Delete_SMS(unsigned char num)     // 删除SMS,=0删除所有SMS
  254. {
  255.     unsigned char count;

  256.         for(count = 0;count < AtcmgdLen;count++)      // AT命令窜移入发送缓冲
  257.         {
  258.             TmpBuf[count] = Atcmgd[count];
  259.         }
  260.                
  261.         if(num == ALL)
  262.         {
  263.            for(count = 1; count < 10; count++)
  264.            {
  265.                TmpBuf[AtcmgdLen] = count + 0x30;
  266.                Put_AT_String((unsigned char*)TmpBuf,(AtcmgdLen+1));

  267.                 }
  268.            TmpBuf[AtcmgdLen] = 0x31;
  269.        for(count = 0; count < 10; count++)
  270.            {
  271.                TmpBuf[AtcmgdLen+1] = count + 0x30;
  272.                Put_AT_String((unsigned char*)TmpBuf,(AtcmgdLen+2));

  273.             }

  274.         }
  275.         else
  276.         {
  277.             TmpBuf[AtcmgdLen] = num + 0x30;
  278.             Put_AT_String((unsigned char*)TmpBuf,(AtcmgdLen+1));

  279.         }
  280. }

  281. /*-----------------------------------------------------------------------*/
  282. ///////////////////////////  检查SMS返回  //////////////////////////////
  283. /*-----------------------------------------------------------------------*/
  284. unsigned char CheckSMS_in(void)
  285. {
  286.         while(!RxStatus);                            // 等待接收完成
  287.         DelayMs(100);

  288.         if(StringCompare(RxBuf,SMSin,SMSinLen))      // 如果收到OK完成    +CMTI: "SM", 1
  289.         {
  290.                 return (OK);
  291.         }
  292.         else
  293.         {
  294.             return (ERROR);
  295.         }

  296. }
  297. /*-----------------------------------------------------------------------*/
  298. ///////////////              将设置号码存入内存           /////////////////
  299. /*-----------------------------------------------------------------------*/
  300. void CheckSMS(void)
  301. {
  302.     unsigned char i=0,j=0,index,numlen=0;
  303.         for(;i<12;i++)
  304.         {
  305.             PhoneNum[i] = 0;
  306.         }
  307. /*    do
  308.         {
  309.             i++;
  310.                 j=i+1;
  311.         }
  312.         //while((Pdu[i] == 'G') && (Pdu[j] == 'H'));
  313.         
  314.         index = j+1;
  315.         i = index;
  316.         while(Pdu[i++] == '+')numlen++;
  317.         
  318.         j = 79; */
  319.         
  320.         index = 79;
  321.         for(i=0;i<11;i++)
  322.         {
  323.             PhoneNum[i] = Pdu[index++];
  324.                 PhoneNum_to_EEPROM();
  325.     }
  326.         
  327. }        
  328. unsigned char CheckPhoneNum(void)
  329. {
  330.     unsigned char i;
  331.         for(i=0;i<12;i++)
  332.         {
  333.             if( PhoneNum != 0) return (FALSE);
  334.         }
  335.         return (TRUE);
  336. }
  337. /*-----------------------------------------------------------------------*/
  338. //////////////////////////    接收处理短信息    ///////////////////////////
  339. /*-----------------------------------------------------------------------*/
  340. void RecSMS(void)
  341. {
  342.     unsigned char count,i=0,j=0,x,y;
  343.         
  344.     Put_AT_String("AT+CMGR=1",9);
  345.         
  346.     while(RxBuf[i] != 0x0D)
  347.         {
  348.             i++;
  349.         }
  350.         i = 76;
  351.         j = i;
  352.         if((RxBuf[i] == 'G') && (RxBuf[j+1] == 'H'))
  353.     {        
  354.         count = 0;
  355.             while(1)
  356.             {
  357.                 Pdu[count] = RxBuf[count];
  358.                         x = count;
  359.                         y = count;
  360.                     if((RxBuf[x-2] == 0x30) && (RxBuf[y-1] == 0x0D))
  361.                     {
  362.                     break;
  363.                 }
  364.                     count++;
  365.             }
  366.                 CheckSMS();
  367.                 Delete_SMS(1);
  368.                
  369.     }
  370.         else
  371.         {
  372.             Delete_SMS(1);
  373.         }
  374. }

  375. unsigned char DetQEITING(void)
  376. {
  377.     volatile unsigned char tmp;
  378.         
  379.     if(!(DetQT()))
  380.     {
  381.             release = 0;
  382.             DelayMs(10);
  383.                
  384.                 if(!(DetQT())) {DettqFlag = 1;}
  385.     }
  386.         else
  387.         {
  388.             release = 1;
  389.         }
  390.                         
  391.         if(release && DettqFlag)
  392.         {
  393.             DettqFlag = 0;
  394.                 CplLED();

  395.                 return (TRUE);
  396.                
  397.         }
  398.         return (FALSE);
  399. }

  400. void IGT(unsigned char n)
  401. {
  402.     if(n)
  403.         {
  404.             PORTD &= ~(1<<PD6);
  405.                 DDRD |= (1<<PD6);
  406.         }
  407.         else
  408.         {
  409.             DDRD &= ~(1<<PD6);
  410.         }
  411. }
  412.                         
  413. void work(void)
  414. {
  415.     while(1)
  416.         {
  417.             if(CheckSMS_in())
  418.                 {
  419.                     RecSMS();
  420.             }
  421.                 if(CallInFlag)
  422.                 {
  423.                     Put_AT_command(Ata,AtaLen);
  424.                     CallInFlag = 0;
  425.                 }
  426.                 if((BusyFlag) || (NoCarrierFlag))  
  427.                 {
  428.                     Put_AT_command(Ath,AthLen);
  429.                         CallOut = 0;
  430.                         BusyFlag = 0;
  431.                         NoCarrierFlag = 0;
  432.                 }
  433.                 if(DetQEITING() && (!CallOut))
  434.                 {
  435.                     CallOut = 1;
  436.                     DialNum();
  437.                 }
  438.         }
  439. }
  440. /*-----------------------------------------------------------------------*/
  441. /////////////////////////////  初始化MC55    //////////////////////////////
  442. /*-----------------------------------------------------------------------*/
  443. void InitMC55(void)
  444. {
  445.          unsigned char tmp;
  446.     IGT(OFF);                                   
  447.     DelayMs(500);                                                                  // 置低MC55 IGT口 200mS ,启动MC55模块
  448.         IGT(ON);
  449.     DelayMs(500);
  450.     IGT(OFF);                                   


  451. //        DelayMs(1000);                             // 等待模块启动
  452.         

  453.         ClrRTS();
  454.     DelayMs(50);                              // 激活MC55串口
  455.         SetRTS();
  456.         DelayMs(50);
  457.         ClrRTS();
  458.     DelayMs(50);                              // 激活MC55串口
  459.         SetRTS();

  460. //        DelayMs(1000);                              // 激活MC55串口
  461.                
  462.     TxIndex = 0;
  463.     RxIndex = 0;
  464.         
  465.         while(!DetQEITING());
  466.         
  467.         PutString("AT",2,0);

  468.         DelayMs(500);      
  469.   
  470.         PutString("AT",2,1);
  471.         
  472.         PutString("ATV0",4,1);

  473.         PutString("ATE0",4,1);

  474.         PutString("AT+CNMI=2,1",11,1);

  475.         PutString("AT+CMGF=1",9,1);

  476.         Delete_SMS(ALL);
  477.         
  478.         PhoneNum_to_EEPROM();
  479.         
  480.         EEPROM_to_PhoneNum();

  481. }

  482. /////////////////////////////////////////////////////////////////////////////////
  483. /////////////////////////////////////////////////////////////////////////////////
  484. /////////////////////////////////////////////////////////////////////////////////
  485. /////////////////////////////////////////////////////////////////////////////////

  486. /*
  487. #pragma interrupt_handler int0_isr:2
  488. void int0_isr(void)
  489. {
  490. //external interupt on INT0
  491. DialNum();

  492. }

  493. #pragma interrupt_handler int1_isr:3
  494. void int1_isr(void)
  495. {
  496. //external interupt on INT1
  497. }
  498. */
  499. ////////////////////////////////////////////////////////////////////////////////

  500. void port_init(void)
  501. {
  502. PORTB = 0x01;
  503. DDRB  = 0x01;
  504. PORTC = 0x00; //m103 output only
  505. DDRC  = 0x02;
  506. PORTD = 0x0C;
  507. DDRD  = 0x50;
  508. }

  509. //UART0 initialize
  510. // desired baud rate: 19200
  511. // actual: baud rate:19200 (0.0%)
  512. // char size: 8 bit
  513. // parity: Disabled
  514. //#ifdef XTAL == 3.6864

  515. void uart0_init(void)
  516. {
  517. UCSRB = 0x00; //disable while setting baud rate
  518. UCSRA = 0x00;
  519. UCSRC = BIT(URSEL) | 0x06;
  520. UBRRL = 0x0B; //set baud rate lo
  521. UBRRH = 0x00; //set baud rate hi
  522. UCSRB = 0xD8;
  523. }
  524. //#endif

  525. //#ifdef XTAL == 7.3728
  526. /*void uart0_init(void)
  527. {
  528. UCSRB = 0x00; //disable while setting baud rate
  529. UCSRA = 0x00;
  530. UCSRC = BIT(URSEL) | 0x06;
  531. UBRRL = 0x17; //set baud rate lo
  532. UBRRH = 0x00; //set baud rate hi
  533. UCSRB = 0xD8;
  534. }*/
  535. //#endif

  536. //call this routine to initialize all peripherals
  537. void init_devices(void)
  538. {
  539. //stop errant interrupts until set up
  540. CLI(); //disable all interrupts
  541. port_init();
  542. uart0_init();

  543. MCUCR = 0x00;
  544. GICR  = 0x00; //0xC0;
  545. TIMSK = 0x00; //timer interrupt sources
  546. SEI(); //re-enable interrupts

  547. InitMC55();
  548. }



  549. //
  550. void main(void)
  551. {
  552. DelayMs(1000);
  553. init_devices();
  554. work();
  555. /*
  556. while(1)
  557. {
  558.     DetQEITING();
  559. }*/

  560. }

复制代码
  1. ////////////////////////////////////////////////////////////////////////////////
  2. // ICC-AVR application builder : 2006-6-25 下午 06:02:39
  3. // Target : M8
  4. // Crystal: 3.6864Mhz
  5. // Author:  Anwarye
  6. // Title:   Detcetaphone
  7. ////////////////////////////////////////////////////////////////////////////////

  8. #include <iom8v.h>
  9. #include <macros.h>

  10. #define SetIGT()         (PORTD |= (1<<PD7))          // MC55模块点火控制脚,高有效
  11. #define ClrIGT()     (PORTD &= ~(1<<PD7))

  12. #define SetLED()     (PORTB |= (1<<PB0))     // LED
  13. #define ClrLED()     (PORTB &= ~(1<<PB0))

  14. #define SetRTS()     (PORTD |= (1<<PD6))     // LED
  15. #define ClrRTS()     (PORTD &= ~(1<<PD6))

  16. #define DetRING0()   (PORTD & (1<<PD2))

  17. #define FALSE      0
  18. #define TRUE       1

  19. #define DONE       1
  20. #define UNDONE     0

  21. #define OK         1
  22. #define ERROR      0

  23. #define ALL        0xFF

  24. #define RX_BUF_SIZE  256
  25. #define TX_BUF_SIZE  32

  26. volatile unsigned char          TmpBuf[16];                // 临时缓冲
  27. volatile unsigned char          Pdu[256];
  28. unsigned char                   RetCMGR[14];
  29. volatile unsigned char          PhoneNum[12];

  30. volatile unsigned char          RxBuf[RX_BUF_SIZE];                   // 串口接收缓冲
  31. volatile unsigned char   RxIndex = 0;                   // 串口接收缓冲指针
  32. volatile unsigned char   RxIndexTail = 0;               // 串口接收缓冲尾


  33. volatile unsigned char          TxBuf[TX_BUF_SIZE];                   // 发送缓冲
  34. volatile unsigned char   TxIndex = 0;                   // 发送缓冲指针


  35. volatile unsigned char RxStatus = 0;
  36. volatile unsigned char TxStatus = 1;

  37. volatile unsigned char OkFlag = 0;
  38. volatile unsigned char CallInFlag = 0;
  39. volatile unsigned char NoCarrierFlag = 0;
  40. volatile unsigned char BusyFlag = 0;

  41. /*-----------------------------------------------------------------------*/
  42. ///////////////////////////  串口发送使能  ////////////////////////////////
  43. /*-----------------------------------------------------------------------*/
  44. void TxEnable(void)
  45. {
  46.    
  47.     UDR = TxBuf[0];                            // 发送缓冲头送入串口发送寄存器,激活开始发送
  48.         UCSRB |= ((1<<TXCIE));//|(1<<TXEN));
  49. }

  50. /*-----------------------------------------------------------------------*/
  51. /////////////////////////////  发送AT命令 /////////////////////////////////
  52. /*-----------------------------------------------------------------------*/
  53. void Put_AT_command(const unsigned char *atc, unsigned char atlen)
  54. {
  55.     unsigned char count;
  56.         
  57.         
  58.         
  59.         for(count = 0;count < atlen;count++)      // AT命令窜移入发送缓冲
  60.         {
  61.             TxBuf[count] = *atc+count;
  62.         }
  63.         
  64.         TxBuf[atlen] = 0x0D;                      // 发送缓冲窜结尾加“回车”
  65.         TxBuf[atlen + 1] = 0x00;                  // 发送缓冲窜结束符号

  66.         OkFlag = 0;
  67.     TxStatus = 0;
  68.         TxIndex = 1;                              // 发送指针偏移1
  69.         TxEnable();                               // 激活发送
  70.     while(!TxStatus);                         // 等代发送结束,发送缓冲指针为零则可以发送
  71.         while(!OkFlag);                           // 收到模块返回OK,命令结束
  72.         
  73. }

  74. /*-----------------------------------------------------------------------*/
  75. /////////////////////////  从内存发送AT命令串  ////////////////////////////
  76. /*-----------------------------------------------------------------------*/
  77. void Put_AT_String(unsigned char *atc, unsigned char atlen)
  78. {
  79.     unsigned char count;
  80.         for(count = 0;count < atlen;count++)
  81. //        while(*atc)     // AT命令窜移入发送缓冲
  82.         {
  83.             TxBuf[count] = *(atc+count);
  84.         }
  85.         
  86.         TxBuf[atlen] = 0x0D;                      // 发送缓冲窜结尾加“回车”
  87.         TxBuf[atlen + 1] = 0x00;                  // 发送缓冲窜结束符号

  88.     OkFlag = 0;
  89.     TxStatus = 0;
  90.         TxIndex = 1;                              // 发送指针偏移1
  91.         TxEnable();                               // 激活发送
  92.     while(!TxStatus);                         // 等代发送结束,发送缓冲指针为零则可以发送
  93.         while(!OkFlag);                           // 收到模块返回OK,命令结束
  94. }
  95. /*-----------------------------------------------------------------------*/
  96. /////////////////////////  向串口发送一串数据  ////////////////////////////
  97. /*-----------------------------------------------------------------------*/
  98. void PutString(unsigned char *str, unsigned char length,unsigned char retflag)
  99. {
  100.     unsigned char count;
  101.         for(count = 0;count < length;count++)
  102.         {
  103.             TxBuf[count] = *(str+count);
  104.         }
  105.         
  106.         TxBuf[length] = 0x0D;                      // 发送缓冲窜结尾加“回车”
  107.         TxBuf[length+ 1] = 0x00;                  // 发送缓冲窜结束符号
  108.         
  109.     TxStatus = 0;
  110.         TxIndex = 1;                              // 发送指针偏移1
  111.         OkFlag = 0;
  112.         TxEnable();
  113.                                        // 激活发送
  114.     while(!TxStatus);                         // 等代发送结束,发送缓冲指针为零则可以发送
  115.     if(retflag)
  116.     {        
  117.         while(!OkFlag);                           // 收到模块返回OK,命令结束
  118.         }
  119. }
  120. /*-----------------------------------------------------------------------*/
  121. /////////////////////////////  比较两个串 /////////////////////////////////
  122. /*-----------------------------------------------------------------------*/
  123. unsigned char StringCompare(volatile unsigned char *str1,const unsigned char *str2,unsigned char strlen)
  124. {
  125.     while(strlen--)
  126.         {
  127.             if(*str1++ != *str2++) return(FALSE);    // 两个串不相等返回假
  128.         }
  129.         return(TRUE);
  130. }

  131. /*-----------------------------------------------------------------------*/
  132. /////////////////////////////    删除短信    //////////////////////////////
  133. /*-----------------------------------------------------------------------*/
  134. void Delete_SMS(unsigned char num)     // 删除SMS,=0删除所有SMS
  135. {
  136.     unsigned char count;

  137.         for(count = 0;count < AtcmgdLen;count++)      // AT命令窜移入发送缓冲
  138.         {
  139.             TmpBuf[count] = Atcmgd[count];
  140.         }
  141.                
  142.         if(num == ALL)
  143.         {
  144.            for(count = 1; count < 10; count++)
  145.            {
  146.                TmpBuf[AtcmgdLen] = count + 0x30;
  147.                Put_AT_String((unsigned char*)TmpBuf,(AtcmgdLen+1));

  148.                 }
  149.            TmpBuf[AtcmgdLen] = 0x31;
  150.        for(count = 0; count < 10; count++)
  151.            {
  152.                TmpBuf[AtcmgdLen+1] = count + 0x30;
  153.                Put_AT_String((unsigned char*)TmpBuf,(AtcmgdLen+2));

  154.             }

  155.         }
  156.         else
  157.         {
  158.             TmpBuf[AtcmgdLen] = num + 0x30;
  159.             Put_AT_String((unsigned char*)TmpBuf,(AtcmgdLen+1));

  160.         }
  161. }

  162. /*-----------------------------------------------------------------------*/
  163. //////////////////////////    接收处理短信息    ///////////////////////////
  164. /*-----------------------------------------------------------------------*/
  165. void RecSMS(void)
  166. {
  167.     unsigned char ch,count;
  168.         
  169.     Put_AT_String("AT+CMGR=1",9);
  170.         
  171.     count = 0;
  172.         while(1)
  173.         {
  174.             Pdu[count] = RxBuf[count];
  175.                 if((RxBuf[count-2] == 0x30) && (RxBuf[count-1] == 0x0D))
  176.                 {
  177.                     break;
  178.             }
  179.                 count++;
  180.         }
  181. }

  182. /*-----------------------------------------------------------------------*/
  183. ///////////////    检查SMS是否有用并将设置号码存入内存    /////////////////
  184. /*-----------------------------------------------------------------------*/
  185. void CheckSMS(void)
  186. {
  187.     unsigned char i;
  188.         i = 1;
  189. }        

  190. ////////////////////////////////////////////////////////////////////////////////

  191. /*-----------------------------------------------------------------------*/
  192. //////////////////////////         拨号         ///////////////////////////
  193. /*-----------------------------------------------------------------------*/
  194. void DialNum(void)
  195. {
  196.     unsigned char count=0,length=0;
  197.         while (PhoneNum[count++])                  // 计算电话号码长度
  198.         {
  199.             length++;
  200.         }
  201.         
  202.         TxBuf[0] = 'A';
  203.         TxBuf[1] = 'T';
  204.         TxBuf[2] = 'D';
  205.         
  206.     for(count=0;count<length;count++)
  207.         {
  208.             TxBuf[count+3] = PhoneNum[count];
  209.         }
  210.    
  211.         TxBuf[length] = ';';
  212.         TxBuf[length++] = 0x0D;
  213.         
  214.     OkFlag = 0;
  215.     TxStatus = 0;
  216.         TxIndex = 1;                              // 发送指针偏移1
  217.         TxEnable();                               // 激活发送
  218.     while(!TxStatus);                         // 等代发送结束,发送缓冲指针为零则可以发送
  219.         while(!OkFlag);                           // 收到模块返回OK,命令结束        
  220. }


  221. /*-----------------------------------------------------------------------*/
  222. /////////////////////////////  初始化MC55    //////////////////////////////
  223. /*-----------------------------------------------------------------------*/
  224. void InitMC55(void)
  225. {
  226.          unsigned char tmp;
  227.     SetIGT();                                   
  228.     DelayMs(200);                                                                  // 置低MC55 IGT口 200mS ,启动MC55模块
  229.         ClrIGT();

  230.         DelayMs(50);                             // 等待模块启动

  231.         ClrRTS();
  232.     DelayMs(50);                              // 激活MC55串口
  233.         SetRTS();
  234.         DelayMs(50);
  235.         ClrRTS();
  236.     DelayMs(50);                              // 激活MC55串口
  237.         SetRTS();

  238.         DelayMs(500);                              // 激活MC55串口
  239.         
  240.         
  241.     TxIndex = 0;
  242.     RxIndex = 0;
  243.         
  244.     Put_AT_command(At,AtLen);                 // 发送AT命令校准串口,如果失败尝试10次后结束

  245.         
  246.     Put_AT_command(Atf,AtfLen);               // 发送AT&F命令恢复MC55模块出厂设置
  247.         
  248.         
  249.         Put_AT_command(Atv1,Atv1Len);            // 设置模块返回码格式 V0 = 简单返回数字 V1=复杂返回文本

  250.         
  251.         Put_AT_command(Ate0,Ate0Len);            // 关闭MC55串口回显

  252.         
  253.         Delete_SMS(1);

  254. }        
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:195496 发表于 2024-3-1 22:06 | 只看该作者
吹牛吧,看看代码是读取短信的程序
回复

使用道具 举报

板凳
ID:101305 发表于 2024-4-2 17:05 | 只看该作者
这个AT指令不太靠谱
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表