未识别的 \r\n 行为

Unidentified \r\n behavior

我正在使用 PySerial 3.0.1 和 Python3。

下面是我的代码。

port.send_break()
while (1):
    sys_reply = port.read(1)
    sys_reply_str = sys_reply.decode('cp437')
    print (sys_reply_str);
    if sys_reply_str == '>':
        break;

回复如下:

...
V
e
r
s
i
o
n
...

>

这很奇怪,因为如果我这样写代码,

port.send_break()
while (1):
    sys_reply = port.read(100)
    sys_reply_str = sys_reply.decode('cp437')
    print (sys_reply_str);
    if sys_reply_str == '>':
        break;

我得到的结果是:

...Version...

我的第一个代码示例如何在每个输入中都有一个换行符?我的传感器反馈中根本没有“\n”或“\r”。

在您的第一个示例中,您在每个循环中读取并打印一个字节。
换行符由每个 print.

添加

在第二个中,您一次阅读整个句子,因为它短于 100 个字节,并打印它,所以最后只有一个换行符。

您可以使用 end 参数更改 print 的默认行尾 (\n),如:

while (1):
    sys_reply = port.read(1)
    sys_reply_str = sys_reply.decode('cp437')
    print (sys_reply_str, end='');
    if sys_reply_str == '>':
        break;

回答您的评论:常见的方法是将每个字符附加到列表中,并在末尾将它们连接成一个字符串。原因是 Python 中的字符串是不可变的,因此在末尾添加一个字符(如 s = s + c 中)将涉及在每次添加时创建一个新的 s 字符串。

received_chars = []
while (1):
    sys_reply = port.read(1)
    sys_reply_str = sys_reply.decode('cp437')
    received_chars.append(sys_reply_str)
    if sys_reply_str == '>':
        break;
received_string = ''.join(received_chars)
print(received_string)