ローエンドのuC、つまりAtmega128を使用する組み込みシステムに取り組んでいます。私のシステムには、AT コマンドで駆動されるモデムも含まれています。適切な C ライブラリ (GCC 用) を探してみましたが、見つかりませんでした。可能な AT コマンド セットを「すべて」uC メモリに配置し、「汎用」ライブラリを使用するのは不合理であることはわかっていますが (そして、全体の操作に約 30 個のコマンドが必要です)、適切なものを取得する必要があります (つまり、軽量、堅牢な) uC で送受信された UART 文字列を処理するための制御メカニズム。実績のあるライブラリや関数を知っている人はいますか? または、誰かが私にいくつかの良いリソース/提案を教えてくれるでしょうか?
質問する
3987 次
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++;
}
msgindexとlinefeedをチェックして、受信した応答を確認してください。
于 2014-02-07T09:14:30.840 に答える