2

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

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

这是我创建 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()

PS 这可能是问题出在其他地方,而不是在 PySerial 中。在另一台计算机上,我正在使用此命令“./binary_data_generator > /dev/ttyS0”写入 ttyS0。当我只发送 ASCII 字符(文本+数字)时,相同的代码似乎工作正常

4

2 回答 2

2

似乎 PySerial(或 Pyserial 依赖的库)正在将单个“0x0a”(\n)字符转换为两个字符“0x0d 0x0a”(\r\n)。两个通信端点都在 Linux 上运行,所以我不知道为什么有人甚至想翻译这些行尾......

这里 strace 表示发件人只向 ttyS0 发送\n:

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 为前缀。

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

于 2011-04-13T18:39:56.757 回答
1

我认为标准输出默认不是二进制模式。这就是为什么非ascii字节似乎丢失了。看到这个问题,它可能会有所帮助。

如果我理解正确,您想使用 std i/o 作为两个进程之间的通信管道。我建议为此使用多进程模块之一

我希望它有帮助

于 2011-04-13T06:15:31.180 回答