阅读序列号可得出十六进制的ascii转换

时间:2019-04-13 17:13:29

标签: python-2.7 communication pyserial uart

我正在使用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程序中打印出来。

2 个答案:

答案 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')