无法解码来自Python串行输入的£符号

时间:2019-03-18 19:27:53

标签: python pyserial

我在一个装有SIM卡的项目中使用SIM7100模块。 在发送AT + USD命令以请求SIM卡上的当前余额之前,我可以毫无问题地发送和接收文本。 如果我使用minicom发送命令,则会收到(正确)响应:

AT + CUSD:0,“ O2:您的余额为£10.84”“

我在程序开始时使用“导入序列号”。 当我通过Python程序发送相同的消息并尝试读取答案时,当字符串达到“£”符号时,我会收到解码错误:

“无法解码位置0的字节Oxa3。无效的起始字节。”

我尝试使用以下两种方式解码,使用代码如下:

while port.inWaiting()>0:
response+=str(port.read(1).decode())

还有:

while port.inWaiting()>0:
response+=str(port.read(1).decode(utf-8))

这两种方法均无效,并且错误相同。我不知道如何找到SIM7100使用的编码方法,也没有其他尝试的选择。 有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

该流被编码为latin-1,因此像这样从latin-1进行解码:

port.read(1).decode('latin-1')

编辑:

编码为latin-1(以及其他一些8位编码,例如cp1252)的

'£'是b'\xa3',而作为'uf-8'则是b'\xc2\xa3'。如果流被编码为UTF-8,则一次读取一个字节来建立响应,并且如果流包含一个被编码为一个以上字节的字符,则解码将不起作用。在这种情况下,最好的方法是在解码之前收集所有字节:

response = b''
while port.inWaiting()>0:
    response += port.read(1)
response = response.decode('utf-8')

答案 1 :(得分:0)

此问题和答案应与您的情况足够相似

UnicodeDecodeError: 'utf8' codec can't decode byte 0xa3 in position 3: invalid start byte

如此处建议的那样,要打印诸如0xa3之类的字符,请将其转换为空白或对其进行解密。

答案 2 :(得分:0)

我添加了一些代码来打印每次一次收到一个字符的内容,并得到包括问题“£”的完整字符串。 经过一番摸索之后,我意识到对AT + CUSD命令的响应分为两个部分,第一个部分是“ OK”,然后,几秒钟后,便是完整的响应: AT + CUSD = 1,依此类推... 解码结果为“您的余额为£20.74”,显示为:

您的余额为2 59 0.74

我意识到这是一个解码问题,因此使用了latin-1解码。然后,如果命令为“ AT + CUSD”并且嘿,Presto,我从缓冲区读取中添加了4秒的延迟!问题解决了。 感谢所有提供线索和有用的建议/信息的人。