我在Raspberry Pi中使用Python,我的数据包是十六进制值,如"0x750x010x010x060x000x08"
。我想在UART和Raspberry Pi之间进行串行通信,所以我在Raspberry Pi中使用Python编写了一个程序,我在终端上检查数据,但是当我在终端中选择ASCII选项时,它显示在输出下面:
75
01
01
06
00
08
当我在终端中选择了十六进制选项时,它没有显示上面的输出。现在,当我选择hex选项但不选择ASCII选项时,我想要上面的输出。那怎么样呢?如果我需要将其转换为十六进制或字节或除了告诉我Python中的代码之外的任何其他内容。
答案 0 :(得分:0)
import serial
port=serial.Serial("/dev/ttyAMA0",baudrate=115200,timeout=3.0)
while True:
a="0x750x010x010x060x000x08"
b=a.replace("0x"," ")
#print b
alist = b.split(" ")
for element in alist
port.write("\r\n"+str(element))
这会提供您想要的所需格式数据
答案 1 :(得分:0)
首先,您的for
循环和if
声明在此处使用错误,并且不需要它们。 while
循环可以等效地重写为:
a = "0x750x010x010x060x000x08"
b = a.replace("0x", " ")
while True:
port.write("\r\n"+b)
您的主要误解是您认为Python理解您想要迭代十六进制数字。但事实并非如此。在原始循环中,它只是逐个字母地迭代a
字符串。事实上,在for
循环的每次迭代中,您只需将原始a
字符串更改为“75 01 01 06 00 08”并将其作为字符串发送。
如果需要发送字节,则应将字符串拆分为每个字节信息的单独记录,并将这些记录转换为字节。 这是
的代码a = "0x750x010x010x060x000x08"
b1 = a.split("0x")
# b1 is ["", "75", "01", "01", "06", "00", "08"], the values are still strings
b2 = [int(x, 16) for x in b1[1:]]
# b2 is a list of integers, the values calculated from strings assuming they are hex (16-bit) numbers
# use b1[1:] to cut the first blank string
b = str(bytearray(b2))
#b joins values list into a bytes string (each interger transformed into one byte)
while True:
port.write("\r\n" + b)
评论中的问题更新:
如果a
格式为“0x750101060008”,则只需将其拆分为2个字母:
b1 = [a[2*i:2*i+2] for i in range(len(a)/2)]
答案 2 :(得分:0)
import serial
port=serial.Serial("/dev/ttyAMA0",baudrate=115200,timeout=3.0)
while True:
a="0x750x010x010x060x000x08"
b=a.replace("0x"," ")
#print b
alist = b.split(" ")
for element in alist
port.write("\r\n"+str(element))
这个