Python 将字节解码为ascii字符串

Python 将字节解码为ascii字符串,python,decode,pyserial,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>” 这是通过以下代码(代码段)完成的: 因此,我希望以如下形式将其打印为文本: S SN 00 SC 00 FC 00 RI 00 MF 00006643 TS 0000BA39 TB 00000000 CB FFFFFFFF CL 002 I>

我使用pyserial从外部设备接收字节,格式如下:

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

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

因此,我希望以如下形式将其打印为文本:

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>002ffff


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

回车字符
'\r'
移动到行首而不移动到下一行,因此行将被覆盖。只需使用换行符替换回车符:

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

我假设您使用的是Unix/Linux-不确定它在Windows上是否不同。

回车字符
'\r'
移动到行首而不移动到下一行,因此这些行将被覆盖。只需使用换行符替换回车符:

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

我假设您使用的是Unix/Linux-不确定它在Windows上是否不同。

您的字符串具有嵌入的回车符,您的终端将其解释为将光标移回当前行开头的指令,从而导致后续文本覆盖上一文本

您将看到最后一行的
I>
,然后是前一行的
002
,以及前一行的
FFFFF
(较短的序列不会完全覆盖该行当前的内容)

解决方案(我不在这里;wjandrea已经发布了)是用适当的行替换回车
提要。

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

您将看到最后一行的
I>
,然后是前一行的
002
,以及前一行的
FFFFF
(较短的序列不会完全覆盖该行当前的内容)

解决方案(我不在这里;wjandrea已经发布了)是用适当的行替换回车
feed.

BTW,
pprint.pprint
可能有助于解决此类调试问题。在这种情况下,
从pprint导入pprint;pprint(output.decode())
->以可读的格式显示整个字符串。谢谢,这是一个非常好的工具。顺便说一句,
pprint.pprint
可能有助于解决此类调试问题。在这种情况下,
从pprint导入pprint;pprint(output.decode())
->以可读的格式显示整个字符串。谢谢,这是一个非常好的windows工具,请使用
output.decode()。替换('\r','\r\n')
愚蠢的我。。。出于某种原因,我选择了\r作为新行@韦克正啊,当然。因此跨平台选项是
…replace('\r',os.linesep)
对于windows,请使用
output.decode().replace('\r','\r\n')
。。。出于某种原因,我选择了\r作为新行@韦克正啊,当然。因此,跨平台选项是
…replace('\r',os.linesep)