2011-04-13 164 views
2

PyQT 4.7没有从QIODevice继承的允许直接与串口通信的类(例如QSerialDevice)。所以我认为使用QProcess类并实现从不同进程实际读取/写入到串行端口将会更容易,该进程将使用QProcess接口与我的主要QT应用程序进行交互。使用PySerial从串口读取二进制数据

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

这是我的主要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() 

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

回答

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

声称,这是一个错误,我会做进一步的调查,以查明是谁,为什么会将此回车之前...

1

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

如果我的理解正确,您希望使用std i/o作为两个进程之间的通信管道。我会建议使用该

我希望它可以帮助multiprocess模块的一个

+0

的问题是不是STDOUT(至少目前还没有)。我刚刚证实pyserial给了我更多的字节,而实际上在另一端使用以下命令“./binary_data_gen>/dev/ttyS0”写入了字节。基本上我发送一个大小不变的信息。当消息中的某些字节发生变化时,我将开始在另一端接收更多的字节。 – 2011-04-13 16:55:22