单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:5650|回复:2
打印上一主题下一主题

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

[复制链接]
跳转到指定楼层
楼主
ID:293738发表于 2018-3-19 16:35|只看该作者|只看大图回帖奖励
实现监听(使用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. }      
复制代码

评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

沙发
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 单片机教程网