2015-06-24 39 views
0

我目前正在研究一些C代碼通過藍牙轉發CAN消息,反之亦然(μC的東西)。問題是,我的配對藍牙設備使用'00'作爲命令,而我的藍牙庫使用char []來緩存從BT接收到的字符串。這不可避免地終止字符串,因爲它將該命令解釋爲NULL字符。而且,CAN幀中的任何空數據字節都會導致相同的問題。什麼是最簡單的方法來防止空字符終止我的字符串?

我可以通過將CAN消息存儲在一個字節數組中,然後將一串字節和一個CR發送到BT模塊來解決從CAN到BT的問題,但反過來說不是這樣容易,因爲BT庫正在使用各種基於字符串的命令。

是否有一種簡單的方法來防止NULL導致不必要的終止,或者我是否必須將整個庫重寫爲合適的數據類型,以及哪種方法在此情況下效果最好?任何想法讚賞!

+0

不使用C將是最好的,但使用一個理智的API庫會很好。一個使用以null結尾的數組作爲二進制流的lib只是很爛:( –

+0

不幸的是,這不是一個選項,但我可以看到你的觀點,我想BT庫的原作者有其他想法 –

回答

1

C中沒有「字符串」類型;你在C中調用的字符串實際上只是一個char *,它也只是一系列的字節。無論何時將這樣的一系列字節傳遞給字符串處理函數(無論是否爲標準C庫的一部分),這些函數都會將任何嵌入式NULL視爲字符串終止,並在那裏結束處理。但是,這並不意味着您的二進制數據會在該位置結束。

你的問題不在於你的函數庫獲取了字符串,而是因爲你將二進制數據與字符串混淆了。你不處理字符串,你正在處理二進制數據。如果有幫助,您可以將char *變量轉換爲void *變量;這不是絕對必要的,但它可以幫助你記住它是二進制數據。然後,使用打包的struct(如果數據具有固定的偏移量)或編寫自定義分析器功能(如果不是)來處理進出CAN總線的數據。

+0

是的,我想我的措辭有些偏差,但是要感謝澄清,我知道二進制數據在那裏,但它被誤解了。當你說偏移時,你的意思是在數組中的固定位置嗎?所以我猜我不得不更深入地瞭解數據庫並更換數據處理部分? –

+0

嗯,我並不完全相信我明白你的問題是什麼,你談論藍牙和CAN,但是你沒有解釋如何解決問題。你的藍牙庫和你的CAN庫都能理解二進制數組嗎?也就是說,你可以給它們一個指針和一個長度,並且它們將與數據一起前進?如果不是,你需要和誰寫這個庫並讓它們修理它。 –

+0

就是這樣,BT lib顯然不能處理流內的空字節。我會給作者一個電話,看看他有什麼要說的。簡而言之,問題是任何空字符都會切斷消息的結尾。無論如何感謝您的反饋!我會贊成,但顯然我不能,直到我達到某個代表。 –

相關問題