我正在使用python3并且找不到我的小问题的答案。 我的问题是使用我的覆盆子pi在串口上发送大于0x7F的字节。
示例:
import serial
ser=serial.Serial("/dev/ttyAMA0")
a=0x7F
ser.write(bytes(chr(a), 'UTF-8'))
工作正常!接收器获得0x7F
如果a等于0x80
a=0x80
ser.write(bytes(chr(a), 'UTF-8'))
接收器获得两个字节:0xC2 0x80
如果我将类型改为UTF-16,则接收器读取
0xFF 0xFE 0x80 0x00
接收器应该只有0x80! 怎么了!谢谢你的回答。
答案 0 :(得分:0)
UTF-8规范说1字节/字节的字以0开头。因为0x80是二进制的“10000000”,所以它需要在C2之前,“11000010 10000000”(2字节/八位字节)。 0x7F是01111111,所以在读取它时,它知道它只有1个字节/八位字节长。
UTF-16表示所有单词都表示为2字节/八位字节,并且有一个字节顺序标记,它基本上告诉读者哪一个是最重要的八位字节(或字节顺序。
检查UTF-8是否有完整的规格,但基本上你是从1字节范围的末尾移动到2字节范围的开始。
我不明白你为什么要发送自己的自定义1字节字,但你真正想要的是任何SBCS(单字节字符集),它具有你指定的那些字节的字符。 UTF-8 / UTF-16是MBCS,这意味着当您对字符进行编码时,它可能会为您提供多个字节。
在UTF之前?一切都来了,一切都是SBCS,这意味着你选择的任何代码页都是用8位编码的。当256个字符不够时,问题出现了,他们不得不制作像IBM273(IBM EBCDIC Germany)和ISO-8859-1(ANSI Latin 1; Western European)这样的代码页来解释“0x2C”的含义。发送方和接收方都需要将其代码页标识符设置为相同,否则它们将无法相互理解。还有一些混乱,因为这些SBCS代码页并不总是使用完整的256个字符,因此“0x7F”可能甚至不存在/具有意义。
您可以做的是将其编码为代码页737/IBM 00737,发送“Α”(希腊字母)字符,它应将其编码为0x80。
如果它不起作用,我不确定你是否可以通过pyserial发送原始字节,因为write()方法似乎需要编码,你可能需要查看源代码以查看较低级别的信息。