从串口读取PySerial的二进制数据

时间:2011-04-13 03:02:13

标签: python qt serial-port pyqt qprocess

PyQT 4.7没有来自QIODevice的继承类,它允许直接与串口通信(例如QSerialDevice)。所以我认为使用QProcess类并从不同的进程实现对串口的实际读/写操作将更容易,该进程将使用QProcess接口与我的主QT应用程序连接。

现在的问题是,当我使用下面的代码时,发送和接收的字节数量是不一样的。 所以我的问题是如何从串口正确读取二进制数据,然后将所有内容转发到stdout?

这是我创建QProcess的主要QT程序的摘录:

        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()

P.S。可能是问题出在其他地方而不是在PySerial中。在另一台计算机上,我使用此命令“./binary_data_generator> / dev / ttyS0”写入ttyS0。当我只发送ASCII字符(文本+数字)

时,相同的代码似乎工作正常

2 个答案:

答案 0 :(得分:2)

似乎PySerial(或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。

为前缀

在声称这是一个Bug之前我会做进一步的调查,以找出谁和为什么添加这个回车...

答案 1 :(得分:1)

我认为默认情况下stdout不是二进制模式。这就是非ascii字节似乎丢失了。看到这个question,它可能会有帮助。

如果我理解正确,您希望将std i / o用作两个进程之间的通信管道。我建议使用其中一个multiprocess模块

我希望它有所帮助