我正在使用STM32工具包从串行端口读取数据。问题是我需要为绘图ADC数据使用自己的时间戳。也就是说,x轴应该是我的RTC时间(用ms表示),y轴是ADC数据。有绘图串口程序,但正如我所说,我需要设置自己的图表时间。我为此尝试了matplotlib,但速度非常慢。然后使用pyqtgraph和以下脚本:
from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import pyqtgraph as pg
from pyqtgraph.ptime import time
import serial
app = QtGui.QApplication([])
p = pg.plot()
p.setWindowTitle('live plot from serial')
curve = p.plot()
data = [0]
raw=serial.Serial("/dev/ttyACM0",115200)
#raw.open()
def update():
global curve, data
line = raw.readline()
data.append(int(line))
xdata = np.array(data, dtype='float64')
curve.setData(xdata)
app.processEvents()
timer = QtCore.QTimer()
timer.timeout.connect(update)
timer.start(0)
if __name__ == '__main__':
import sys
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
QtGui.QApplication.instance().exec_()
这与mathplotlib相比太慢但太快。现在我找不到如何将时间戳和ADC数据拆分为x,y这样的绘图。我的数据是用“;”拆分的。你知道吗
谢谢你的回答。你知道吗
编辑时间:
我改变了我的代码读取速度寻找足够的了解。但要知道它正在绘制一些小故障,比如timetamp正在向前跳,然后返回,或者大量的x轴数据。我正在监视串口GUI上的数据,找不到任何错误的数据。我认为有些东西来自Python代码。我能忽略这些绘图程序上的小故障吗?你知道吗
立即编码:
import numpy as np
import pyqtgraph as pg
import serial
app = pg.Qt.QtGui.QApplication([])
p = pg.plot()
p.setWindowTitle('live plot from serial')
curve = p.plot()
data = [0]
tdata = [0]
temp = [0]
datax = [0]
datay = [0]
temp = 0
now = 0
k = 0
raw=serial.Serial("/dev/ttyACM0",115200, timeout=None)
while p.isVisible():
line = raw.readline().decode('utf-8').strip()
print("raw line:", line)
line = str(line)
print("str line:", line)
line = line.split(':')
print("splitted line:", line)
if len(line) >= 4:
print("line>4:", line)
tdata = line[0]
data = line[1]
print("line[0]; line[1]:", tdata, line)
tdata = int(tdata)
data = int(data)
print("int(tdata)", tdata)
print("int(line)", data)
datax.append(int(tdata))
datay.append(int(data))
xdata = np.array(datax, dtype='float64')
ydata = np.array(datay, dtype='float64')
p.setXRange(tdata-500, tdata+500, padding=0)
curve.setData(xdata, ydata)
# p.setYRange(0 ,data+30, padding=0)
print("now will refresh the plot")
app.processEvents()
else:
print("line<4:", line)
拆分数据
使用
Serial.readline()
时,读取的数据将在末尾包含换行符\n
(请参阅Python univeral newlines,如果从Windows发送,则可能是\r\n\
)。你知道吗首先解码接收到的字节并删除换行符:
然后在
:
处拆分字符串现在
data_split
是一个包含条目的列表你可以把它们转换成浮点数或者整数,然后放到Numpy数组中。你知道吗
速度提升
Serial.readline
可能会减慢代码的速度。使用这样的https://stackoverflow.com/a/56632812/7919597。你知道吗还可以考虑在固定的numpy数组中移动数据,而不是每次使用
xdata = np.array(data, dtype='float64')
创建一个新数组。你知道吗见Shift elements in a numpy array
我将这些函数与
Thread
类函数结合使用从串口读取。你知道吗
PyQtGraph示例中有一个非常有用的示例:
https://github.com/pyqtgraph/pyqtgraph/blob/develop/examples/scrollingPlots.py
显示了用Numpy数组绘制滚动图的三种不同方法。你知道吗
我最终使用了方法1和方法3的组合,同时移动了从串行端口读取的尽可能多的位置。你知道吗
相关问题 更多 >
编程相关推荐