我有一个NRF52芯片连接到我的覆盆子Pi。我想通过UART将我的覆盆子pi中的hex文件发送到NRF,这样我就可以制作一个甜蜜的bootloader。我正在研究一个python脚本,它逐行读取hex文件并将其发送出去。我现在的问题是像020000040000FA这样的行被发送为0x3A,0x30,0x32等。我不想发送ASCII,我想发送原始数据..所以0x02,0x00等我想要基本上是0x2而不是0x30,0x32,但不知道如何...任何人都可以帮助或给出一些想法吗? 我的python技能远远低于标准...我试图添加行[1] +行[2]并将其编码为十六进制但它只给出3032 ...这是我现在的代码。任何想法或帮助都会很棒。
干杯,
埃里克
1 #! /usr/bin/python
2 import binascii
3 import time
4 import serial
5 import codecs
6
7 PORT = '/dev/ttyUSB0'
8 BAUD_RATE = 9600
9
10 print 'opening serial port'
11 time.sleep(1)
12 myshit = []
13 ser = serial.Serial(PORT, BAUD_RATE)
14 i = 1
15 with open("blinkybootloader.hex", "rb") as file:
16 for line in file:
18 for l in line:
19 print line[i],
20
21 i+=1
22 time.sleep(.5)
23 print line
24 time.sleep(.1)
25 ser.write(myshit)
〜
答案 0 :(得分:0)
我不确定我是否正确理解你的问题。但似乎你想要每行文本:XXxxXXxxXX ... 并将每行上的第一个字符解释为十六进制字符对,然后将它们转换为字符串然后,您可以通过串口将这些字节发送到Raspberry Pi。
在这种情况下,我会使用正则表达式包“编译”以下正则表达式:
import re
chunk = re.compile('..')
# ... chunk.findall(x) returns a sequence of x broken into 2-character chunks
然后在你的例子中的第16行之后我会做这样的事情:
for line in file:
data = b''.join(chr(int(x, 16)) for x in chunk.findall(line[1:])])
print data
ser.write(data)
time.sleep(0.1)
注意将线切片分成数字对的技巧,然后使用额外(可选)base =参数将这些数字从文本转换为整数到 int()函数,并使用结果整数作为内置 chr()(转换为字符)函数的参数。
此联接的 b''文字语法是指定这是字节字符串。这在Python 2.7中并不是特别重要(在Python 2.7之前甚至不支持)。您只需使用旧版本的旧版本Python即可。但是在Python 3.x中你必须使用字节字符串或 bytearray 对象,因为Python 3“字符串”是Unicode,必须明确编码和解码。