如何使用 pyqtgraph 和 QSerialPort 创建实时图?

Posted

技术标签:

【中文标题】如何使用 pyqtgraph 和 QSerialPort 创建实时图?【英文标题】:How to use pyqtgraph and QSerialPort to create a real-time graph? 【发布时间】:2021-09-28 07:51:17 【问题描述】:

总的来说,我对 Qt 和 python 还是有点陌生​​,所以我想知道是否可以在我正在从事的项目中获得一些帮助。我想使用 pyqtgraph 创建一个实时图表,该图表使用 QSerialPort 绘制通过 RS232 连接接收到的数据。从理论上讲,用户应该单击开始,表示来自 RS232 连接单元的数据流在用户单击停止时停止。下面的代码打开和关闭端口;但是,数据并未绘制在图表上。提前谢谢!


class Graph(QtGui.QWidget):
    def __init__ (self):                    
        super(Graph, self).__init__()      
        self.initializeSpace()
        
    def initializeSpace(self):
        # Create basic buttons next to graph
        self.start = QtGui.QPushButton(
            text = "Start",
            clicked = self.send)
        self.stop = QtGui.QPushButton(
            text = "Stop",
            clicked = self.stop)
         
        # Create plot
        self.graph = pg.PlotWidget()

        # Add grid
        self.graph.showGrid(x = True, y = True)

        # Set X-axis and Y-axis range
        self.graph.setXRange(0, 10)
        self.graph.setYRange(0, 200)

        # Create Layout
        self.layout = QtGui.QGridLayout()
       
        # Add widgets to layout
        self.layout.addWidget(self.start, 0, 0)
        self.layout.addWidget(self.stop, 1, 0)
        self.layout.addWidget(self.graph, 0, 1, 3, 1)

        # Set layout
        self.setLayout(self.layout)

        # Define himmelstein serial
        self.serial = QtSerialPort.QSerialPort(
            'COM4',
            baudRate = QtSerialPort.QSerialPort.Baud9600,     
            dataBits = QtSerialPort.QSerialPort.Data8,
            parity = QtSerialPort.QSerialPort.NoParity,
            stopBits = QtSerialPort.QSerialPort.OneStop, 
            flowControl = QtSerialPort.QSerialPort.NoFlowControl,
            readyRead = self.receive
            )

    @QtCore.pyqtSlot()
    def receive(self):
        while self.serial.canReadLine():
            data = self.serial.readLine().data().decode()
            data = data.strip('\r\n')
            torque = data[0]
            speed = data[1]
            self.graph.plot(x = torque, y = speed)
    
    # Send command and receive data
    @QtCore.pyqtSlot()
    def send(self):
        self.serial.open(QIODevice.ReadWrite)
        print("Port is open!")
        self.serial.write(b'ACD0\r\n')
        self.receive()

    def stop(self):
        if self.serial.isOpen():
            self.serial.close()
        print("Port closed!")

【问题讨论】:

【参考方案1】:

不,这是不可能的。目前,正如this post 指出的那样,即使 Qt 还没有将 QSerialPort 模块包含到 Qt6 中:

对于 Qt 6.2,我们计划提供以下附加功能 图书馆:

Qt 蓝牙 Qt 数据可视化 Qt Lottie 动画 Qt 多媒体 Qt NFC Qt 定位 Qt 快速对话框:文件夹、消息框 Qt 远程对象 Qt 传感器 Qt 串行总线 Qt 串行端口 Qt 网络频道 Qt 网络引擎 Qt WebSockets Qt Web 视图

(强调我的)

目前只有 Qt 6.1.2 可用,PyQt6 6.1.1 使用 Qt 6.1.1。

【讨论】:

有没有办法同时使用Qt5和Qt6? 多么不幸,感谢您的帮助。 Qt6 可以使用 pyqtSlot 和 pyqtSignal 吗? @GillianGrace 是的,你为什么要指出来?在提出任何问题之前,请检查您所说的内容。再见

以上是关于如何使用 pyqtgraph 和 QSerialPort 创建实时图?的主要内容,如果未能解决你的问题,请参考以下文章

pyqtgraph绘图如何使用pyqtgraph

将 pyqtgraph 嵌入到 enaml 中......如何?

PyQtGraph & OpenGL:如何在两个坐标之间创建一个球体?

如何在pyqtgraph中绘制十字准线并绘制鼠标位置?

如何更新pyqtgraph中的绘图?

如何在 PyQtGraph 的一个图中绘制两个实时数据?