读取串行并将HEX转换为DEC

时间:2018-08-17 12:19:44

标签: python python-3.x pyserial

读取串口

使用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'

因为十六进制中的2710在DEC中为10000。

转化

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

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

print(“ Data:”,int(data,16))

     

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

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

print(“ Data:”,int(data,16))

     

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

  • data = data.lstrip("0")data = s.read(18).decode()并没有去除前导零。
  • 然后将data = data.lstrip("0")data = s.read(18)一起给出错误:
  

print(“ Data:”,(data.lstrip(“ 0”)))

     

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

问题

如何将此数据类型(我认为是ASCII,但是十六进制数字)转换为DEC?

1 个答案:

答案 0 :(得分: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]

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