0

私のプログラムは、Zigbee からデータを受け取り、それをフィルタリングして必要なものを取得することです。

unsigned char idata buff[100];            //To read data from rawrxd[] and process data
unsigned char count=0;                    //To store counter for rawrxd[]
unsigned char buff_count=0;               //store counter for buff[], read counter for rawrxd[]
if(buff_count!=count)                   //checking Is there any unread data?
    {
        if(buff_count==100)                 //go back to start position of array
        buff_count=0;

        buff[buff_count] = rawrxd[buff_count];  //read the data

        if(strcmp(buff, "UCAST:000D6F0000A9BBD8,06=!221~@") ==0)
        {
        ES0=0;
        Serial_txString("AT+UCAST:000D6F0000A9BBD8=!222~@");
        tx(0x0D);
        tx(0x0A);
        ES0=1;
        }

        if(strcmp(buff, "UCAST:000D6F0000A9BBD8,06=!221#@") ==0)
        {
        ES0=0;
        Serial_txString("AT+UCAST:000D6F0000A9BBD8=!222#@");  
        tx(0x0D);
        tx(0x0A);
        ES0=1;
        }

        buff_count++;                           //increase the read_count
    }

これは、バッファが UCAST を受信し、それを文字列と比較して同じ場合は 0 を返す方法です。ただし、比較は 1 回だけで、その後は次の UCAST を受信して​​もまったく比較されません。 .

また、最初の比較は、機能するために同じでなければなりません。間違った文字を受け取ってから正しい文字を受け取った場合、機能しません。このことから、ポインタの問題でしょうか。私のバッファはcharの配列なので、それを文字列と比較しようとしています。

4

2 に答える 2

0

問題はbuff[]、文字列比較を行う前に NUL 文字がないことです。そのstrcmp()ため、受信した文字列の末尾が本来あるべき場所であると認識されず (代わりに、以前に配列に残っていたものを確認します)、一致することはありません。

     buff [buff_count] = rawrxd[buff_count];  //read the data
     buff [++buff_count] =  '\000';       /*  you need to add this */

その追加により、他strcmp()のすべてがうまくいけば、 s が機能する可能性があります。

また、コードシーケンスを整理して最適化できると確信しています

    Serial_txString("AT+UCAST:000D6F0000A9BBD8=!222~@");
    tx(0x0D);
    tx(0x0A);

の中へ

    Serial_txString("AT+UCAST:000D6F0000A9BBD8=!222~@\x0d\x0a");
于 2012-06-04T03:00:21.170 に答える
0

あなたが持っている方法を割り当てることによって:

buff[buff_count] = rawrxd[buff_count];

rawrxd バッファーの最初の要素を buff 変数に割り当てているだけです。これは変数の割り当てであり、ポインターの割り当てではありません。

両方とも同じバッファ サイズであるため、次のように 2 つのベース ポインタが等しくなります。

buff = rawrxd;

次に、strcmp() を実行するか、バイト数 (要素) が固定されているため、strncmp() を使用することをお勧めします。

それが役に立てば幸い。

乾杯!

于 2012-06-04T03:52:38.753 に答える