用pyqtgraph和pyserial接收串口数据并过滤部分数据后绘制动态图
时间: 2024-05-09 08:20:43 浏览: 243
使用Python串口实时显示数据并绘图的例子
下面是一个用pyqtgraph和pyserial接收串口数据并过滤部分数据后绘制动态图的示例代码:
```python
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
import serial
import time
# 打开串口
ser = serial.Serial('COM3', 9600, timeout=0.5)
# 创建绘图窗口
app = QtGui.QApplication([])
win = pg.GraphicsWindow(title="Serial Data")
win.resize(1000, 600)
win.setWindowTitle('Serial Data')
# 创建两个绘图区域
p1 = win.addPlot(title="Raw Data")
p2 = win.addPlot(title="Filtered Data")
# 设置绘图区域属性
p1.setLabel('left', 'Value')
p2.setLabel('left', 'Value')
# 创建曲线对象
raw_data_curve = p1.plot(pen='r')
filtered_data_curve = p2.plot(pen='b')
# 初始化数据
raw_data = []
filtered_data = []
# 定义过滤函数,只保留小于100的数据
def filter_data(data):
return [x for x in data if x < 100]
# 定义更新函数
def update():
global raw_data, filtered_data
# 读取串口数据
data = ser.readline().decode().strip()
if data:
# 将数据转换为数字
try:
value = float(data)
except ValueError:
return
# 将数据加入raw_data
raw_data.append(value)
# 如果raw_data太长,则删除前面的数据
if len(raw_data) > 1000:
raw_data = raw_data[-1000:]
# 过滤数据
filtered_data = filter_data(raw_data)
# 更新曲线数据
raw_data_curve.setData(raw_data)
filtered_data_curve.setData(filtered_data)
# 设置定时器,每50ms更新一次
timer = QtCore.QTimer()
timer.timeout.connect(update)
timer.start(50)
# 显示窗口
win.show()
# 运行程序
if __name__ == '__main__':
QtGui.QApplication.instance().exec_()
```
在上面的代码中,我们首先打开了串口并创建了一个绘图窗口。然后,我们创建了两个绘图区域和两个曲线对象,用于分别绘制原始数据和过滤后的数据。然后,我们定义了一个过滤函数,该函数只保留小于100的数据。接着,我们定义了一个更新函数,该函数从串口读取数据,将其转换为数字,并将其加入raw_data中。然后,我们过滤raw_data,并将其更新到filtered_data中。最后,我们更新两个曲线对象的数据。我们设置了一个定时器,每50ms调用一次更新函数。最后,我们显示窗口并运行程序。
阅读全文