使用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?
答案 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]
如您所见,即使十六进制数字没有用零等号填充,这也将起作用。 您可以使用类似的代码公式获得美观而可靠的代码。