Pyserial格式化-大于127的字节返回为2字节,而不是1字节



我有一个程序在我的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

正如NPE所说,这是UTF-8的编码- 128到2047(8 - 11位)之间的字节转换为两个字节:如果原始的11位是abcdefhijk,那么那么UTF-8版本就是110abcde10fghijk。在您的示例中(左侧填充0以生成11位),00010000000将转换为11000010 10000000或xc2x80,这正是您所看到的。参见维基百科关于UTF-8的文章了解更多

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

>>> unichr(128).encode('utf-8')
'xc2x80' 

让我感到困惑的是,你可以使用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'

最新更新