将整数转换为字符缓冲区以进行串行通信
Convert integer to a char buffer for serial communication...?
我有一个如下的结构
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终止符)。
相关文章:
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- Xaudio2在更改缓冲区或循环时弹出声音
- 是否可以使用winusb同时与多个相同的usb设备进行通信
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 混合int并在通信缓冲区中浮动
- 如何处理C++中的通信缓冲区
- ClearCommError中的串行通信在读取缓冲区中找不到任何数据
- 谷歌协议缓冲区与JSON:C++到C#通信
- 将整数转换为字符缓冲区以进行串行通信
- UCHAR或WCHAR用于通信缓冲区
- 用于通信的二进制缓冲区,c++
- 与Thrift或协议缓冲区的双向通信
- 协议缓冲区-Google protobuf:推荐使用C++库来处理通信