首先,我有一个普遍的问题。我试图通过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"数据包末尾的字符,用于实现每个包的开始和结束。
以下是我的代码的简单版本:
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