【问题标题】:How to properly receive hex data from serial communication in linux如何在linux中正确接收来自串行通信的十六进制数据
【发布时间】:2017-10-15 03:24:07
【问题描述】:

我一直在互联网上搜索类似的问题,但没有找到任何好的解决方案。我在 ubuntu 中,我在串口上接收串行十六进制数据。我已经使用空调制解调器电缆将我的系统连接到 Windows 系统,并且 Windows 系统正在运行 docklight 软件,该软件正在发送如下所示的十六进制数据:

2E FF AA 4F CC 0D

现在通过保存数据,我并不是说我想在终端上打印数据。我只想将这些数据保存在缓冲区中,以便以后处理它。

读取我正在做的数据

res = read (fd, buf, sizeof buf)
//where buf is 
unsigned char buf[255];

此时阅读后,buf包含一些随机字符。从互联网上的一些链接,我得到了一种将其转换为十六进制的方法:

unsinged char hexData[255];
for (int i = 0; i < res; i++)
{
    sprintf((char*)hexData+i*2, "%02X", buf[i]);
}

现在这个 hexData 包含2EFFAA4FCC0D,这对我来说没问题。 (我不知道这是否是正确的做法)。现在假设我想将 hexData 中的 E 转换为十进制。但此时,E 将被视为字符而不是十六进制,所以我可能会得到 69 而不是 14。

如何将十六进制数据保存在变量中。我应该将它保存为字符数组还是 int 数组。谢谢。

【问题讨论】:

  • 不清楚你收到了什么或你想从中得到什么。似乎对等方正在发送 ASCII 十六进制数据,但不清楚 char 流中是否有空格 - '2E FF AA 4F CC 0D' 建议用空格分隔的 ASCII 十六进制字节,而 'hexData+i* 2' 表示没有空格。 '如何将十六进制数据保存在变量中。我应该将它保存为 chars 数组还是 int' 是没有意义的,因为你可以使用串行字节,或者两者都没有,或者其他东西。

标签: c linux hex


【解决方案1】:

buf 中已经有二进制形式的数据

但如果还需要将十六进制转十进制,可以使用sscanf

sscanf(&hexBuf[i],"%02X",&intVar);// intVar is integer variable

它将由hexBuf[i]hexBuf[i+1]形成的十六进制字节转换为intVar中的二进制,当你打印intVar%d你会看到十进制值

您可以将intVar 存储为unsigned character 数组的元素

【讨论】:

    【解决方案2】:

    您可能想考虑一下您要实现的目标。

    十六进制只是一种表示。您收到的字节可以显示为十六进制对、二进制八位字节或一系列(或多或少)可打印字符(打印unsigned char 数组时会看到什么)。

    如果您只需要存储这些字节的十六进制表示,请将它们转换为十六进制,但请记住,您需要一个两倍于缓冲区大的数组(因为单个字节将由两个转换后的十六进制字符)。

    通常,最好的做法是将它们保存为一个字节数组(chars),也就是你的buf数组,只在需要显示十六进制表示时才转换它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      相关资源
      最近更新 更多