从Rasberry pi通过UART发送十六进制

时间:2017-04-28 01:07:38

标签: python uart

我有一个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)   

1 个答案:

答案 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,必须明确编码和解码。