如何在Linux中正确接收来自串行通信的hex数据

我一直在网上search这个类似的问题,但没有find任何好的解决scheme。 我在Ubuntu和我正在串行端口上接收串行hex数据。 我已经连接我的系统使用零调制解调器电缆到Windows系统和Windows系统正在运行docklight软件发送hex数据如下:

2E FF AA 4F CC 0D 

现在通过保存数据,我并不是说我要在terminal上打印数据。 我只是想保存这个数据,因为它在一个缓冲区,所以我稍后处理它。

阅读我正在做的数据

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

在阅读之后,buf包含一些随机字符。 从互联网上的一些链接,我有一种方法将其转换为hex:

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

现在这个hexData包含2EFFAA4FCC0D ,这对我的目的来说是可以的。 (我不知道这是否是正确的做法)。 现在让我们说我想从hex数据转换成十进制。 但在这一点上, E将被视为字符不是hex,所以可能会得到69而不是14。

如何将hex数据保存在variables中。 我应该将其保存为字符或int数组。 谢谢。

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

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

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

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

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

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

十六进制只是一个表示。 您正在接收的字节可以显示为十六进制对,如二进制八位字节或作为一系列(或多或少)可打印字符(如果您打印您的unsigned char数组,您将看到什么)。

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

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