我正在使用python3,但没有找到我的小问题的答案。我的问题是用我的raspberry 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!出什么问题了!谢谢你的回答。
2条答案
按热度按时间slhcrj9b1#
UTF-8规范规定,1字节/八位字节的单词从0开始。因为0x 80在二进制中是“10000000”,所以需要在其前面加一个C2,“11000010 10000000”(2字节/八位字节)。0x 7 F是01111111,所以在阅读它时,它知道它只有1字节/八位字节长。
UTF-16表示所有单词都表示为2字节/八位字节,并有一个字节顺序标记,它本质上告诉读者哪个是最重要的八位字节(或字节序)。
检查UTF-8以获得完整的规范,但实际上您是从1字节范围的末尾移动到2字节范围的开头。
我不明白你为什么要发送你自己的自定义1字节的单词,但你真正要寻找的是任何SBCS(单字节字符集),它有一个字符为这些字节你指定. UTF-8/UTF-16是MBCS,这意味着当你编码一个字符,它可能会给予你一个以上的单字节.
在UTF-?沿着之前,一切都是SBCS,这意味着您选择的任何代码页都使用8位编码。当256个字符不够时,问题就出现了,他们不得不制作像IBM 273(IBM EBCDIC德国)和ISO-8859-1(ANSI Latin 1;西欧)来解释“0x 2C”的含义。发送方和接收方都需要将其代码页标识符设置为相同的,否则他们无法理解对方。由于这些SBCS代码页并不总是使用完整的256个字符,因此“0x 7 F”可能甚至不存在/没有含义,这会导致进一步的混乱。
你能做的就是把它编码成类似于737/IBM 00737的代码页,发送“Α”(希腊字母)字符,它应该把它编码成0x 80。
如果它不起作用,我不确定是否可以通过pyserial发送原始字节,因为write()方法似乎需要编码,您可能需要查看源代码以查看较低级别的细节。
uttx8gqw2#
a=0x80
服务器写入(字节(字符(a),“ISO-8859- 1”))