微控制器和AT调制解调器接口的C库

3
我正在开发一些嵌入式系统,使用低端微控制器Atmega128。我的系统还包括一个通过AT指令驱动的调制解调器。我尝试寻找适用于GCC的任何适当的C库,但没有找到。虽然我知道将“所有”可能的AT命令集放入uC存储器中以获得“通用”库是不合理的(我只需要大约30个命令来完成整个操作),但我只需要一些适当的(即轻量级、稳健)控制机制来处理在uC中传输和接收的UART字符串。是否有人知道任何经过验证的库或函数?或者有人能否向我指出一些好的资源/建议?

你是否需要与RS-232接口通信的能力,或者你已经具备这种能力并需要捕获UART字符串? - Robert Harvey
我不需要关于UART的帮助,我已经让它工作了。我需要关于程序设计的帮助。 :) - TomiL
请参见:http://git.ozlabs.org/?p=ppp.git;a=blob;f=chat/chat.c;hb=HEAD。您没有说明许可证。我认为`chat.c`是BSD许可证。 - artless noise
AT指令只需要简单的串行传输,因此不需要库文件。我自己使用SIM900模块和XBee等进行了很多操作,从未考虑过需要它。 - Naaz
1个回答

0

我希望您正在使用GSM或GPRS调制解调器进行接口,因为您没有指定应用程序。

简介:GSM、GPRS调制解调器也使用AT命令接口与外部控制器通信。

在此处查看详细说明:

Microchip AN1373 - 使用PIC32 MCU开发GSM/GPRS/GPS解决方案

void UART_Buf(void)
{
        ch=SCI2D;
        if(rx_buffer[2] == 'O' && rx_buffer[3] =='K')
        {   
          rx_buffer[5] = '\0';
          msgindex=2;    // code for OK
          rx_wr_i=0;    
        }
        if(rx_buffer[2] == 'B' && rx_buffer[3] =='U' && rx_buffer[4] == 'S' && rx_buffer[5] =='Y')
        {   
          msgindex=3;    // Code for Busy
          rx_wr_i=0;    
        }
        
        if(rx_buffer[2] == 'N' && rx_buffer[3] =='O' && rx_buffer[4] == ' ' && rx_buffer[5] =='C' && rx_buffer[6] =='A' && rx_buffer[7] =='R'&& rx_buffer[8] =='R' && rx_buffer[9] =='I' && rx_buffer[10] =='E' && rx_buffer[11] =='R')
        {   
          msgindex=3;    // Code for  No Carrier
          rx_wr_i=0;    
        }
        if(rx_buffer[2] == 'E' && rx_buffer[3] =='R' && rx_buffer[4] == 'R' && rx_buffer[5] =='O' && rx_buffer[6] =='R' )
        {   
          msgindex=4;    // Code for Error
            rx_wr_i=0;  
        } 
         if(rx_buffer[2]=='+' && rx_buffer[3]=='C' && rx_buffer[4] == 'M' && rx_buffer[5] =='S' )
        {   
          msgindex=3;
        } 
         if(rx_buffer[2]=='+' && rx_buffer[3]=='C' && rx_buffer[4] == 'M' && rx_buffer[5] =='E' )
        {   
          msgindex=3;
        }     
        if(rx_buffer[2]=='+' && rx_buffer[3]=='C' && rx_buffer[4] == 'M' && rx_buffer[5] =='G' && rx_buffer[6]== 'R')
        {   
          msgindex=6;
        }
        
        if(rx_buffer[2]=='E' && rx_buffer[3]=='R' && rx_buffer[4] == 'R' && rx_buffer[5] =='O' && rx_buffer[6] == 'R')
        {   
          msgindex=3;
        } 
        
        if(rx_buffer[2]=='+' && rx_buffer[3]=='C' && rx_buffer[4] == 'S' && rx_buffer[5] =='Q' )
        {
          msgindex=7;
        }
        
        if(rx_buffer[2]=='+' && rx_buffer[3]=='C' && rx_buffer[4] == 'O' && rx_buffer[5] =='L'&& rx_buffer[6] =='P' )
        {
         msgindex=8;
        }
        if(ch == '\r')
          linefeed++;
}

并且在ISR中

__interrupt void isrVsci2rx(void)
{
      SCI2S1_RDRF = 0;
      rx_buffer[rx_ack++]= SCI2D;
      if(rx_ack>RX_BUFFER_MASK)
        rx_ack=0;
      UART_Buf();
      rx_length++;
  
}

检查 msgindexlinefeed 以了解接收到的响应。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接