首页 文章

将整数转换为char缓冲区以进行串行通信......? [关闭]

提问于
浏览
-2

我的结构如下

struct msg {  
uint16_t data1;
int data2;
}

在将结构数据转换为字符串(char缓冲区)后,我通过串口发送它 .

我实际上使用 memcpy 将内容复制到缓冲区(使用PRAGMA进行结构打包)

我面临的问题是我的电路板的 puts 功能,一旦遇到NULL字符就会停止(即如果1再见为0,则ASCII等效于o十进制0为NULL)

如果data2 = 12则memcpy之后的内存将为00 00 00 0C(HEX) . 一个看到它停止并返回的第一个00 .

我无法更改串口设置或置位功能 . What is best method to convert int into 4 byte's in char buffer without any byte being 0

1 回答

  • 2

    puts()用于发送空终止字符串 . 它不是用于发送二进制数据的正确函数:

    • 二进制数据不保证为空终止,导致 puts() 发送的数据超出需要的数量 .

    • 二进制数据可能会嵌入'\0'个字符,这会过早地结束输出
      如果标准输出在文本模式下打开,

    • 二进制数据可能会嵌入可能造成伤害的其他特殊字符,具体取决于您的系统/环境 .

    正确的解决方案取决于您用于微控制器的环境/编译器/库 . 串行I / O通常有一些特殊功能(通过UART / USART) . 但是如果你被允许使用 puts() ,你当然可以使用putchar()来逐字节输出 .

    msg m;  
     int sz = sizeof(m); 
     for (char*p=reinterpret_cast<char*>(&m); sz--; p++) 
         putchar(*p);
    

    如果你不得不不惜一切代价使用 puts() ,一种方法可能是convert the buffer in printable hex digits并发送这个字符串 . 十六进制ditigts将需要两倍于您的消息(1 null终止符) .

相关问题