读取串行并将 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的主要内容,如果未能解决你的问题,请参考以下文章