pyqt4 和 pyserial

4 投票
1 回答
3529 浏览
提问于 2025-04-15 11:11

我想做一个应用程序,它可以不断监控串口,并根据从串口接收到的输入来改变用户界面。我已经在Linux下用pyserial成功读取了串口的数据,但我不太确定该怎么做才能保持这个过程的正常进行:是创建一个单独的线程,还是通过定时器事件来检查输入?我怎么才能确保不会漏掉任何信息呢?(实现某种握手或协议似乎有点过于复杂了……)最重要的是:我该如何在qt4的环境下做到这一点?

编辑:这是我现在正在做的(我想让这个过程定期进行,同时让应用的其他部分继续运行,而不是等待)

class MessageBox(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        ser = serial.Serial('/dev/ttyS0', 9600, bytesize=serial.EIGHTBITS,
        parity=serial.PARITY_NONE,     
        stopbits=serial.STOPBITS_ONE, 
        timeout=None,           
        xonxoff=0,              
        rtscts=0,
        interCharTimeout=None)

        self.label = QtGui.QLabel(ser.readline(), self)
        self.label.move(15, 10)
        ser.close()
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Authentication')

        self.color = QtGui.QColor(0, 0, 0) 

        self.square = QtGui.QWidget(self)
        self.square.setGeometry(120, 20, 100, 100)
        self.square.setStyleSheet("QWidget { background-color: %s }" % self.color.name())

1 个回答

4

你不会漏掉任何字节,所有待处理的输入都会被缓存起来。

你有几种选择:

  1. 使用一个线程,通过PySerial的inWaiting()来轮询串口。

  2. 在主线程中使用一个定时器,通过PySerial的inWaiting()来轮询串口。

  3. 找到串口的句柄,然后把它传给QSocketNotifier。这种方法只在Linux上有效,但这样QSocketNotifier会监控与你的串口相关的文件,并在有新数据时发送信号。

方法2和3更好,因为你不需要额外的线程。

撰写回答