我有一个如下的结构
struct msg {
uint16_t data1;
int data2;
}
将结构数据转换为字符串(字符缓冲区)后,我通过串行端口发送它。
我实际上使用memcpy将内容复制到缓冲区(使用PRAGMA进行结构包装)
我面临的问题是放置我的板的功能,一旦遇到NULL字符(即如果1 bye为0,作为ASCII等效十进制0为NULL),将停止
如果data2 = 12,则memcpy后的内存将为00 000 000 0C (HEX)。当看到第一个00时,它停止并返回。
我不能改变我的串口设置或puts函数。什么是最好的方法来转换成4字节的字符缓冲区中没有任何字节为0
puts()
是为发送空终止字符串而设计的。这不是用来发送二进制数据的正确函数:
- 二进制数据不保证null终止,导致
puts()
发送的数据比需要的多。 - 二进制数据可能嵌入' '字符,这会提前结束输出 如果您的标准输出以文本模式打开,则
- 二进制数据可能嵌入其他可能造成危害的特殊字符,这取决于您的系统/环境。
正确的解决方案取决于您正在为微控制器使用的环境/编译器/库。串行I/O通常有一些特殊的功能(通过UART/USART)。但是如果允许使用puts()
,当然可以使用putchar()
逐个字节输出。
msg m;
int sz = sizeof(m);
for (char*p=reinterpret_cast<char*>(&m); sz--; p++)
putchar(*p);
如果你不得不不惜一切代价使用puts()
,一种方法是将缓冲区转换为可打印的十六进制数字并发送此字符串。十六进制数字需要消息大小的两倍(+1 null终止符)。