使用PySerial从串口读取二进制数据

2 投票
2 回答
6028 浏览
提问于 2025-04-16 15:37

PyQT 4.7没有一个可以直接和串口通信的类(比如QSerialDevice)。所以我想,使用QProcess类可能更简单,我可以在一个不同的进程中实现实际的串口读写,然后通过QProcess接口和我的主QT应用程序进行交互。

现在的问题是,当我使用下面的代码时,发送和接收的字节数不一样。所以我想知道,如何正确地从串口读取二进制数据,然后把所有数据转发到标准输出(stdout)?

这是我主QT程序中创建QProcess的代码片段:

        self.micromouse_socket = QProcess()
        self.micromouse_socket.start("/home/ansis/Source/Perforce-pele/Pele/tools/console/comtalker.py", "")
        self.micromouse_socket.started.connect(self.on_micromouse_socket_started)
        self.label_8.setText("Starting COM...")

这是将与串口通信的进程(comtalker.py;非阻塞部分还没完成):

#!/usr/bin/python
import serial
import sys

if __name__ == "__main__":

    ser = serial.Serial(0)

    while 1 :
        x = ser.read(1)
        sys.stdout.write(x)
        sys.stdout.flush()

附注:问题可能出在别的地方,而不是PySerial。在另一台电脑上,我用这个命令向ttyS0写入数据:“./binary_data_generator > /dev/ttyS0”。当我只发送ASCII字符(文本+数字)时,同样的代码似乎工作得很好。

2 个回答

1

我觉得标准输出(stdout)默认不是以二进制模式工作。这就是为什么非ASCII字节好像会丢失。你可以看看这个问题,可能会对你有帮助。

如果我理解得没错,你是想用标准输入输出作为两个进程之间的通信管道。我建议你使用multiprocess模块来实现这个功能。

希望这些信息对你有帮助。

2

看起来PySerial(或者它依赖的某个库)把一个“0x0a”(也就是换行符\n)字符变成了两个字符“0x0d 0x0a”(也就是回车符\r和换行符\n)。两个通信端都在Linux上运行,所以我不太明白为什么会有人想要转换这些换行符……

这里的strace显示发送方只发送了\n到ttyS0:

write(1, "M\n", 2)                      = 2
write(1, "\n", 1)                       = 1
write(1, "M\n", 2)                      = 2
write(1, "\n", 1)                       = 1

在调试PySerial的输出时,我发现每个\n前面都有一个\r。

在确认这是否是个错误之前,我会进一步调查,看看是谁以及为什么要加这个回车符……

撰写回答