0

こんにちは、89c52 と sim548c モジュールを通信しようとしています。AT コマンドを送信してから、マイクロコントローラーにすべての応答を配列に格納させ、検索機能を実行して、適切な応答が送信されたかどうかを確認し、次の AT コマンドに移動できるようにします。これには、双方向のシリアル転送が必要です。最初に AT コマンドをシリアルに送信し、次に受信を有効にし、モジュールからのすべての応答を配列に格納する必要があります。私はこのプログラムを使用していますが、マイクロコントローラーに着信データを受け入れて配列に保存させることができません。正常に転送されますが、受信されません。何が問題なのか特定できますか?

int check=0;
int out=0;
unsigned char info[20]={"00000000000000000000"};
unsigned char  *s;
unsigned char a[3],b[3];

void transmit_data(unsigned char str)        
{
    SBUF=str;                                  
    while(TI==0);
    TI=0;                          
}

void send_serial(unsigned char *s)
{
    delay(50);
    while(*s!=0x0)
    {
        SBUF=*s;
        while(TI==0)
        {
        }
    TI=0;
    s++;
    }
}

void receive_data()            interrupt 4                      
{
    if(RI)
    {
        info[check++]=SBUF;
        RI=0;
    }
    if(TI)
        TI=0;
}

void search(unsigned char b[])
{
    int l=0;
    for(l;l<18;l++)
    {
        if(info[l]==b[0] && info[l+1]==b[1] && info[l+2]==b[2])
        {
            out=1;
            break;
        }
    }
}

void compare(unsigned char *s, unsigned char a[]) //for CIPSEND
{
    while(1)
    {
        out=0;
        check=0;
        delay(50);
        send_serial("AT+CIPSEND\r");
        delay(100);
        send_serial(s);
        transmit_data(0x0D);
        transmit_data(0x0A);
        transmit_data(0x1A);
        IE=0x90;
        delay(200);
        IE=0x88;
        search(a);  
        if (out==1)
        break;
    }
}
4

2 に答える 2

1

私はこれを数回見ましたが、間違いはあなたのシリアル受信が割り込みで動作し、それは無効な機能ではないということです。INTERRUPT4に接続されているVOIDを削除してコードを

 receive_data()            interrupt 4                      
{
    if(RI)
    {
        info[check++]=SBUF;
        RI=0;
    }
    if(TI)
        TI=0;
}
于 2012-07-25T23:25:50.467 に答える
0

データを(割り込みによって)受信し、LEDを点滅させるか、エコーバックするか、他の方法で確実に受信できることを示すだけの、より小さな(できるだけ単純な)プログラムを作成することをお勧めします。それを使用して、端末エミュレーターまたは別の既知の動作インターフェースと通信します。可能なすべての仲介業者と未知のものを切り取ります。

UART エラー レジスタと構成もチェックして、クロック/パリティ/データ設定が両端で一致していることを確認します。最初は低速から始めます。

一度に 1 つずつ確実に機能するようにしてから、それらを組み合わせます。

于 2012-03-01T10:38:47.410 に答える