2012-06-04 361 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'複製。 –

相關問題