我正在研究一些C代码来通过蓝牙转发CAN消息,反之亦然(μC的东西)。问题是我的配对蓝牙设备使用'00'作为命令,我的蓝牙库正在使用char []来缓冲从BT接收时的字符串。这不可避免地终止了字符串,因为它将命令解释为NULL字符。此外,CAN帧中的任何空数据字节都会导致同样的问题。
通过将CAN消息存储在字节数组中并将一系列字节后跟CR发送到BT模块,我能够解决从CAN到BT的问题,但反之则不是那么容易,因为BT库正在使用各种基于字符串的命令。
是否有一种简单的方法可以防止NULL导致不必要的终止,或者我是否必须将整个库重写为合适的数据类型,哪种方法在这种情况下效果最好?任何想法都赞赏!
答案 0 :(得分:1)
没有"字符串"输入C;你在C中称为字符串的真正只是一个char *
,它也只是一系列字节。无论何时将这一系列字节传递给字符串处理函数(无论是否是标准C库的一部分),这些函数都会将任何嵌入的NULL视为字符串终止,并在那里进行结束处理。但这并不意味着您的二进制数据在该位置结束。
您的问题不在于您的图书馆会为您提供字符串,而是您将二进制数据与字符串混淆。您不处理字符串,而是处理二进制数据。如果有帮助,您可以将char *
变量转换为void *
变量;这不是必须的,但它可以帮助您记住它的二进制数据。然后,使用压缩struct
(如果数据具有固定的偏移量)或编写自定义解析器函数(如果没有)来处理进出CAN总线的数据。