【问题标题】:send hex-values via serial port in C通过 C 中的串口发送十六进制值
【发布时间】:2015-07-25 08:47:45
【问题描述】:

我在理解以下方面有一些问题:

我将在 C 中实现一个真正的小协议。协商服务器和客户端必须通过十六进制值交换信息。

当我回答来自客户端的请求时,我发送以下数组:

char array[] = { 0x00, 0x02, 0x01, 0x2F, 0x02 }

使用 sizeof(array) 计算的长度为 5。 出于调试目的,我对数组进行了 printf。

for( i = 0; i < length; i++ ){
    printf("%x", *(array + i));
}

输出为 0212F2。客户如何知道哪些值属于一起? 还有更多的可能性,不是吗? 可能是 0x00、0x21、0x02、0x0F、0x02,但这是不正确的。

谁能解释一下?

非常感谢:)

弗洛里安

【问题讨论】:

  • 你不只是用纯字节而不是十六进制字符串说话有什么原因吗?
  • 您的输出正在打印“0”、“2”、“1”、“2F”和“2”。在我看来没问题 :) 如果您希望它打印“0x02”而不是“2”,请将格式说明符更改为“0x%02x”。
  • 如果您想将此数据作为文本编码发送,需要提供编码以了解如何在接收时重新组合它们。对于小于 0x10 (16) 的任何内容,前导 '0' 字符并确保接收器在重新组装期间每八位字节提取两个字符可能对您有用。但无论如何,我都同意马蒂。只需发送带有长度序言的数组内容,就可以结束了。
  • 顺便说一句:建议发送前缀和后缀 char 与您类似“!0002012F02\n”的消息。 _Far_` 更容易处理短、长、迟或其他令人不安的消息。
  • 我不确定您是要传输二进制值(将是 5 个字节)还是十六进制 ascii 字符串(将是 10 个字节,例如,0 变为二进制 0x3030)。你能澄清一下吗?

标签: c linux hex


【解决方案1】:

首先将您的数组声明为unsigned char 数组。 char 可以签名或未签名,具体取决于实现,在您的情况下,您需要未签名的情况。

然后使用:

   printf("%02hhx", array[i]);

如有必要,它将打印前导0

0002012F02

【讨论】:

【解决方案2】:

客户端在您循环时按i 的顺序打印您的数组,这是您的内容在数组中的顺序(除非我误解了这个问题)。如果你问它为什么按这个顺序打印它,那是因为它是你在数组中定义的顺序,并且每次增加数组索引一个值。

【讨论】:

    【解决方案3】:

    客户端将按照您发送它们的确切顺序获取字节。这将是:

    0x00
    0x02
    0x01
    0x2F
    0x02
    

    使用新行 (\n) 和 ouah 建议的 %02x 一起使用会更容易看到。目前还不清楚,因为所有信息都集中在一起。

    printf("%02x\n", *(array+i));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 2014-05-15
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多