我目前正在研究一些C代码,以通过蓝牙转发CAN消息,反之亦然(µC东西)。问题是我配对的蓝牙设备使用“ 00”作为命令,而我的蓝牙库在从BT接收时使用char []来缓冲字符串。这不可避免地终止了字符串,因为它将命令解释为NULL字符。同样,CAN帧中的任何空数据字节都将导致相同的问题。
通过将CAN消息存储在字节数组中并向BT模块发送一系列字节后跟CR,我能够解决从CAN到BT时的问题,但是反之则不那么容易,因为BT库正在使用各种基于字符串的命令。
有没有一种简单的方法可以防止NULL导致不必要的终止,或者我必须将整个库重写为合适的数据类型,在这种情况下哪种方法最有效?任何想法表示赞赏!
C中没有“字符串”类型;您在C中所说的字符串实际上只是一个char *
,它也只是一系列字节。每当您将这样的一系列字节传递给字符串处理函数(无论是否为标准C库的一部分)时,这些函数都会将任何嵌入的NULL视为字符串终止,并在那里终止处理。但这并不意味着您的二进制数据在该位置结束。
您的问题不在于您的库为您获取了字符串,而是您正在将二进制数据与字符串混淆。您不是在处理字符串,而是在处理二进制数据。如果有帮助,可以将char *
变量转换为void *
变量;否则,可以将变量转换为变量。严格来说,这不是必需的,但可以帮助您记住它是二进制数据。然后,使用压缩包struct
(如果数据具有固定的偏移量)或编写自定义解析器函数(如果没有)来处理传入或传出CAN总线的数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句