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字符(文本+数字)
时,相同的代码似乎工作正常答案 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模块
我希望它有所帮助