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。但是,它只比较一次,之后我收到下一个UCAST,它根本不比较.

此外,它的第一次比较必须相同才能工作。如果收到错误的字符,然后收到正确的字符,它将无法工作。由此看来,是指针问题吗?因为我的缓冲区是一个字符数组,我试图将它与一个字符串进行比较。

4

2 回答 2

0

通过分配您拥有的方式:

buff[buff_count] = rawrxd[buff_count];

您只是将 rawrxd 缓冲区的第一个元素分配给 buff 变量。它是变量赋值,而不是指针赋值。

因为,两者都具有相同的缓冲区大小,所以就等于两个基指针,如下所示:

buff = rawrxd;

然后执行 strcmp(),或者更好的是,使用 strncmp(),因为字节(元素)的数量是固定的。

希望能帮助到你。

干杯!

于 2012-06-04T03:52:38.753 回答
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 回答