Python GUI中的滞后,用于显示来自微控制器的传感器数据

时间:2018-05-11 16:21:39

标签: python user-interface pyqt microcontroller lag

首先,我有一个普遍的问题。我试图通过USB在python中显示来自微控制器的传感器数据。我见过很多例子,这些例子中的大部分都显示了非常慢的数据流。我尝试了matplotlib,pyqt5,但它们都有高数据速率滞后。我可以使用python以任何速度轻松地接收和打印数据。我在显示数据时遇到问题。

最佳性能是使用pyqt,但我的速度不能超过9600 bit /秒(这对我的项目来说还不够)。我想知道是否有更快的GUI甚至示例代码。感谢。

其次我可能在我的代码中做错了。这是我的项目的描述和我的代码的简单版本:

我正在读取3位,12位ADC的数据,并通过USB(UART)将数据不断地传输到计算机。它具有来自3个ADCS的6个字节的数据,每个ADC的8位LSB在一个字节中,其余4位MSB在另一个字节中。另外,有2个字节," z"和" y"数据包末尾的字符,用于实现每个包的开始和结束。 enter image description here

以下是我的代码的简单版本:

from PyQt5 import QtCore, QtGui, QtWidgets
from ECMO_GUIUI import Ui_ECMO
import serial


class ECMO_GUI_BASE(Ui_ECMO):
    # Baudrate of the microcontroller
    _baud = 9600
    # Serial port of the microcontroller
    _ser = serial.Serial(None, _baud, timeout=1, )
    # Length of data array
    _dataLength = 500

    _translate = QtCore.QCoreApplication.translate

    def __init__(self, dialog):
        Ui_ECMO.__init__(self)
        self.setupUi(dialog)

        self.app = QtWidgets.QApplication(sys.argv)  # QApplication eats argv in constructor
        self.port = ''


        self.OpenButton.clicked.connect(self.on_OpenButton_clicked)

    def on_OpenButton_clicked(self):
        self.SpeedGroupBox.setEnabled(True)
        fftCount = 0
        self.clearCharts()
        self.initializeDataPlots()
        print(self._ser.is_open)

        if self._ser.is_open:
            return

        if self._ser.port == '':
            return

        serial_Start = True
        start = False
        temp = 0
        xx = 0
        yy = 0
        zz = 0
        tempOld = 0
        iii = 1
        y = [0, 0, 0]

        self._ser.open()

        while True:
            if not self._ser.is_open:
                break
            temp = self._ser.read()

            # unpacking the receiving data
            if start:
                if iii % 2:
                    xx = int.from_bytes(temp, byteorder='little')
                elif not iii % 2:
                    yy = int.from_bytes(temp, byteorder='little') << 8
                    zz = xx + yy

                    y[int(iii / 2) - 1] = zz
                    if iii == 6:
                        start = False
                        #shifitng the list and removing the last data
                        self.data1[:-1] = self.data1[1:]
                        self.data2[:-1] = self.data2[1:]
                        self.data3[:-1] = self.data3[1:]
                        # Adding the new data to the data List of 500 elements
                        self.data1[-1] = y[0]
                        self.data2[-1] = y[1]
                        self.data3[-1] = y[2]
                        #plotting the data
                        self.curve1.setData(self.data1)
                        self.curve2.setData(self.data2)
                        self.curve3.setData(self.data3)
                        self.xpos1 += 1
                        self.xpos2 += 1
                        self.xpos3 += 1

                        self.app.processEvents()

                iii += 1
            if temp == b'y' and not (start):
                tempOld = temp

            if temp == b'z' and not (start):
                if tempOld == b'y':
                    start = True
                    iii = 1



if __name__ == '__main__':
    import sys

    app = QtWidgets.QApplication(sys.argv)
    ecmo = QtWidgets.QDialog()
    ui = ECMO_GUI_BASE(ecmo)
    ecmo.show()
    sys.exit(app.exec_())

并且瓶颈在这里:

                    #plotting the data
                    self.curve1.setData(self.data1)
                    self.curve2.setData(self.data2)
                    self.curve3.setData(self.data3)

感谢您的时间和帮助。

以下是dropbox中完整代码的链接: https://www.dropbox.com/sh/fahdpoc5uhprzn1/AABjvs3_FOuS3Oh4ccLOkrLna?dl=0

0 个答案:

没有答案