2012-06-04 368 views
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,[email protected]") ==0) 
     { 
     ES0=0; 
     Serial_txString("AT+UCAST:[email protected]"); 
     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 
    } 

这是应该的缓冲区将接收尤卡斯特,然后用它是否是相同的字符串比较它,返回0 然而,这只是一个时间进行比较之后,我收到了下一个UCAST它根本不会比较。

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

回答

0

问题是buff[]在进行字符串比较之前没有NUL字符。所以strcmp()没有意识到收到的字符串的结尾,你认为它应该(而不是看到之前在数组中留下的),所以它永远不会匹配。

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

随着那此外,strcmp()■找工作,如果一切都很好的机会。

而且,我敢肯定,你可以neaten和优化的代码序列

Serial_txString("AT+UCAST:[email protected]"); 
    tx(0x0D); 
    tx(0x0A); 

Serial_txString("AT+UCAST:[email protected]\x0d\x0a"); 
+0

我试过把buff [++ buff_count] ='\ 000';但它重复了很多时间意味着不断打印。另外,读取数据后呢?如果是,它根本不起作用。 – JiaYuan

+0

@佳园:对不起。我忘了提及删除循环底部的增加'buff_count'的语句。 – wallyk

0

通过分配方式,您有:

buff[buff_count] = rawrxd[buff_count]; 

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

由于,都具有相同的缓存器大小,刚好等于两个基指针这样的:

buff = rawrxd; 

,然后执行的strcmp(),或更好地,使用STRNCMP()以来的字节数(元素)是固定的。

希望它有帮助。

干杯!

+0

也可以,你可以直接使用rawrxd来做到这一点。 – Anshul

+0

你不能指定'buff',因为它是一个不是指针的数组。按照Anshul的建议直接使用'rawrxd',或使用'strncpy'或'memcpy'复制。 –

相关问题