2015-06-24 40 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显然不能处理流内的空字节。我会给作者一个电话,看看他有什么要说的。简而言之,问题是任何空字符都会切断消息的结尾。无论如何感谢您的反馈!我会赞成,但显然我不能,直到我达到某个代表。 –

相关问题