将整数转换为字符缓冲区以进行串行通信

Convert integer to a char buffer for serial communication...?

本文关键字:通信 缓冲区 整数 转换 字符      更新时间:2023-10-16

我有一个如下的结构

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终止符)。