读取串行并将 HEX 转换为 DEC

Posted

技术标签:

【中文标题】读取串行并将 HEX 转换为 DEC【英文标题】:Read Serial and Convert HEX to DEC 【发布时间】:2018-08-17 12:19:44 【问题描述】:

读取序列

使用 PySerial 创建了以下程序:

import serial


class comunicacao():
    def __init__(self, porta, baud):
        s = serial.Serial(porta, baud)
        data = s.read(18)
        data = data
        print("Data: ", (data))

comunicacao('COM7', 57600)

它正在接收十进制数字10000进行测试,打印输出为:Data: b'\x020000000000002710\x03'

因为 HEX 中的 2710 是 DEC 中的 10000。

转化

所以尝试通过以下方式进行转换:

print("Data: ", int(data, 16)) 给出错误:

print("数据:", int(data, 16))

ValueError: int() 基数为 16 的无效文字:b'\x020000000000002710\x03'

使用data = s.read(18).decode(),打印输出为Data: 0000000000002710,尝试使用int() 进行转换会出现错误:

print("数据:", int(data, 16))

ValueError: int() 基数为 16 的无效文字:'\x020000000000002710\x03'

data = data.lstrip("0")data = s.read(18).decode() 没有去除前导零。 而data = data.lstrip("0")data = s.read(18) 给出了错误:

print("数据:", (data.lstrip("0")))

TypeError:类似字节的对象是 必需,而不是“str”

问题

如何将这种数据类型(我认为是ASCII,但是是HEX数字)转换为DEC?

【问题讨论】:

int(data[1:-1], 16) 之类的内容是否足以满足您的需求? 就像一个魅力!你能解释一下吗?有了答案,我就可以接受了。 我想正确的方法是 \x02 可能表明下一个 N 字节块是 int 的十六进制表示(在这种情况下为 16 个字符),以使其更多健壮...它被称为切片 - 值得一试:***.com/questions/509211/… 您可能还想查看内置的 struct 模块 - 它可能/可能不会对您在这里所做的有用... 是的,如果你可以从另一端发送数据的二进制表示,我也推荐结构或数组模块。更强大和更好的协议来处理。 【参考方案1】:

这个呢:

data = '\x020000000000002710\x03'
# If we say that "\x02" opens an hexadecimal representation of an integer,
# and that "\x03" ends it, then for any number of ints in hex form in data, do:
converted = [int(x, 16) for x in data.replace("\x02", "").split("\x03") if x]
print(converted)
print(converted[0])

您将获得从端口读取的所有数字的列表。 这段代码的作用是删除 \x02 字符,以免混淆 int(),然后按 \x03 拆分数据。 然后它使用 int(x, 16) 转换每个元素。 如果您希望混入一些其他数据,则使用添加了 try 语句的经典方式会更加健壮:

converted = []
for x in data.replace("\x02", "").split("\x03"):
    try:
        converted.append(int(x, 16))
    except: pass

如果 "\x03" 不是 int 分隔符,可以将 \x02 当作一,并结合切片提取需要的位数。

如果 "\x03" 仍然是十六进制终止符,但数字不跟随,则使用如下内容:

data = '\x020000000000002710\x03blahblah\x0200ff\x03mmmm'
converted = []
for x in data.split("\x02"):
    end = x.find("\x03")
    if end==-1: continue
    x = x[:end]
    try:
        converted.append(int(x, 16))
    except: pass

现在打印转换后的列表:

[10000, 255]

如您所见,即使十六进制数字没有用零填充,这也将起作用。 您可以使用类似的代码公式获得漂亮且可靠的代码。

【讨论】:

是的。此外,如果我将代码更改为:data = s.read() 我将逐字节接收并可以在 STX (\x02) 和 ETX (\x03) 之间对数据进行分组。不错的提示,如果我知道字节数并为两个数据包更改data = s.read(36),我可以使用您告诉的多数据数据的方式。将进行一些测试。 好的,但是如果你这样做 s.read() 确保设置了超时,否则你可能会无限期地等待数据。

以上是关于读取串行并将 HEX 转换为 DEC的主要内容,如果未能解决你的问题,请参考以下文章

excel里将16进制转换为IP地址

在R中将十六进制转换为十进制

在 SciLab 中将十六进制转换为浮点数

VBA Excel:Dec2Hex不止一个地方

在R中将十六进制转换为十进制

进制转换 二-八-十-十六 Bin-Oct-Dec-Hex