将字节解码为ASCII字符串

时间:2019-08-22 16:41:27

标签: python decode pyserial

我从外部设备以pyserial形式接收字节:

b'S\rSN 00\rSC 00\rFC 00\rRI 00\rMF 00006643\rTS 0000BA39\rTB 00000000\rCB FFFFFFFF\rCL 002\rI> '

这是通过代码(代码段)完成的:

while ser.in_waiting > 0:
    output = ser.read(ser.in_waiting)
    print(output)

所以我希望将其打印为以下形式的文本:

S
SN 00
SC 00
FC 00
RI 00
MF 00006643
TS 0000BA39
TB 00000000
CB FFFFFFFF
CL 002
I>

但是当我尝试使用print(output.decode())print(output.decode('ascii'))对其进行解码时,我只能得到全部(84)个字符的一部分:

I> 002FFFFF

怎么了?如何获取所有已解码的文本?

2 个答案:

答案 0 :(得分:4)

回车符'\r'移动到该行的开头而没有下一行,因此这些行被覆盖。只需将换行符替换为换行符即可:

print(output.decode().replace('\r', '\n'))

我假设您使用的是Unix / Linux-不知道Windows上是否有所不同。

答案 1 :(得分:2)

您的字符串中嵌入了回车符,终端将其解释为将光标移回当前行开头的指令,从而导致随后的文本覆盖先前的文本。

您会在最后一行看到I>,然后在前一行看到002,而在前一行看到FFFFF(较短的序列不会完全覆盖当前在线的内容是什么。

解决方案(我这里不会repeat; wjandrea已经发布了)是用正确的行替换回车符 提要。