使用PySerial从串口读取二进制数据
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。
在确认这是否是个错误之前,我会进一步调查,看看是谁以及为什么要加这个回车符……