如何从linux中的串行通信中正确接收十六进制数据

时间:2017-05-16 07:16:32

标签: c linux hex

我一直在网上搜索这个类似的问题,但没有找到任何好的解决方案。我在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,这对我来说是好的。 (我不知道这是否是正确的做法)。现在假设我想将E从hexData转换为十进制。但此时,E将被视为字符而不是十六进制,所以我可能会得到69而不是14。

如何在变量中保存十六进制数据。我应该将它保存为chars或int数组。感谢。

2 个答案:

答案 0 :(得分:1)

您已在buf

中以二进制形式获得数据

但是如果您仍然需要将十六进制转换为十进制,则可以使用sscanf

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

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

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

的元素

答案 1 :(得分:1)

你可能想要考虑你想要达到的目标。

十六进制只是一种表示。您接收的字节可以显示为十六进制对,二进制八位字节或一系列(或多或少)可打印字符(如果您打印unsigned char数组,则会看到的内容)。

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

通常,最好的办法是将它们保存为一个字节数组(char s),即你的buf数组,并且只在需要显示十六进制时转换它们表示。