我正在使用python 2.7中的pyserial读取串行数据 数据如下:
static uint8_t dataArray[] =
{
0x01, 0x31, 0x31, 0x31, 0xf1, 0xa9, 0xc3, 0x03,
0x1c, 0x02, 0xe1, 0xb2, 0x3f, 0x50, 0x7d, 0xfe,
0x7e, 0x3e, 0x8e, 0x1f, 0x91, 0x1d, 0x80, 0xd1,
0x67, 0x5b, 0x8f, 0x5f, 0x50, 0x53, 0xcd, 0xf1,
0x7b, 0xa8, 0x46, 0x73, 0x9e, 0x31, 0xf1, 0x93,
0x65, 0xee, 0xb8, 0x27, 0xc3, 0xec, 0x6d, 0x81,
0x2e, 0xa7, 0x8b, 0x15, 0x51, 0x61, 0xdc, 0x5f,
0xa1, 0x1a, 0xd9, 0xf6, 0x50, 0xac, 0x2b, 0x33,
0x3c,0x23
};
现在,当我尝试在python中读取它时。它被接收为每个字节的ascii转换。 python代码如下:
uart= serial.Serial()
uart.baudrate= 19200
uart.port = 'COM8'
uart.parity= serial.PARITY_NONE
uart.bytesize= serial.EIGHTBITS
uart.stopbits= serial.STOPBITS_ONE
uart.timeout = 40
if(uart.is_open!=1):
uart.open()
while uart.is_open:
byte = uart.read(1) #Read one byte in each iteration
if(byte):
#dencoded_byte = byte.decode('Ascii')
dencoded_byte = byte.decode('utf-8')
print dencoded_byte
在获得异常之前我得到的输出
UnicodeDecodeError: 'utf8' codec can't decode byte 0xf1 in position 0: unexpected end of data
如下:
utf-8
1
1
1
我尝试使用byte.decode('Ascii')
,当传入数据大于128时也会得到异常(它也不会转换发送时的数据,仅再次给出ascii),还尝试转换为int等,但是没有成功。
有人可以建议一些简单的解决方案吗?它可以使我读取来自uart的任何字节,最大字节数为256 = 2 ^ 8 而且我应该能够以数字的形式编写它,或者从串行发送它吗?例如,从串行发送的第一个十六进制数字是数组中的0x01-我想在python程序中打印出来。
答案 0 :(得分:2)
如果您希望每个1字节字符串对应的数字,请使用ord
:
if(byte):
byte_num = ord(byte)
print byte_num
如果您使用的是Python 3,将有另一种解决方案,因为可以为bytes
实例建立索引以获取数值,因此byte[0]
与调用ord(byte)
相同。
当然,在Python 2中,您收到的字节已经是str
实例,因为在该版本的Python中没有区别字节和8位字符串(您的decode
调用它们起作用,返回unicode
个实例)。因此,也许一种解决方案是根本不尝试解码该字节,而只是像print byte
那样将其原始打印出来。我不确定这样做是否明智,因为打印一些控制字符可能会弄乱您的控制台。但是,如果要执行除打印数据以外的其他操作(例如将其存储在某种数据结构中),这可能是一个更合理的选择。
答案 1 :(得分:0)
感谢大家的回应。
最后,设法解决了这个问题。只需使用以下命令即可:
#these **first three lines are for only python2**
#as Python 3 is default utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
dencoded_byte = byte.encode('hex')
而不是:
dencoded_byte = byte.decode('utf-8')