Pyserial格式 - 超过127的字节返回2个字节,而不是1个字节

时间:2013-01-22 09:10:43

标签: python utf-8 ascii arduino pyserial

我有一个在我的Arduino上运行的程序,它接受串行输入,并将其保存到变量中。有魅力。使用串行监视器内置的Arduino应用程序,我已成功发送和接收0-255之间的字节。

使用pyserial,发送高于127(或0b01111111)的任何字节,pyserial返回2 - 高于127的值的含义,比如0b10000000,将发送2个字节,不是一个。

因此,我认为我的问题出在pyserial上。

ser.write(chr(int('01000000', base=2)).encode('utf-8'))

效果很好,并且在Arduino端正确接收。

ser.write(chr(int('10000000', base=2)).encode('utf-8')) 
然而,

返回2 - 并且在Arduino上显示为0b110000100b10000000

1 个答案:

答案 0 :(得分:2)

正如NPE所说,这是UTF-8的编码 - 128到2047(8 - 11位)之间的字节转换为两个字节:如果原始的11位是abcdefghijk,则utf-8版本是110abcde 10fghijk。在您的示例中(填充左侧为0以生成11位),00010000000将转换为11000010 10000000或\ xc2 \ x80,这正是您所看到的。请参阅Wikipedia article on UTF-8 for more

你可以在python中看到这个代码(我用128替换int('10000000',base = 2):

>>> unichr(128).encode('utf-8')
'\xc2\x80' 

令我困惑的是你可以使用chr(int('10000000',base = 2))。encode('utf-8'),或等效chr(128).encode('utf-8) ”。当我这样做时,我得到:

>>> chr(int('10000000', base=2)).encode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal not in range(128)

您是否更改了默认编码?

您需要的是一个使用一个字节为0 - 255的编码,并匹配unicode。因此,请尝试使用'latin_1':

>>> unichr(128).encode('latin_1')
'\x80'