背景:串口数据需要图形化实时显示,直观查看
-
导入模块:
import time import pyqtgraph as pg import serial from pyqtgraph.Qt import QtCore, QtGui
time:用于处理时间相关的操作。
pyqtgraph:用于绘制图形界面和图表。
serial:用于串口通信。
QtCore和QtGui:PyQtGraph的Qt模块,用于创建GUI。 -
创建GUI窗口:
win = pg.GraphicsLayoutWidget(show=True) win.setWindowTitle('实时监测') win.setBackground('w')
创建一个名为"实时监测"的GUI窗口,并设置背景颜色为白色。
-
添加绘图区域:
axis = pg.DateAxisItem(orientation='bottom') p2 = win.addPlot(labels={'left': '总用电量kwh'}, axisItems={'bottom': axis})
创建一个带有日期轴的绘图区域,并设置左边的y轴标签为"总用电量kwh"。
-
初始化变量:
data1 = [] time_stamps = [] bar_graphs = [] # 存储条形图项的列表 text_items = [] # 添加文本标签项 ser = serial.Serial('COM4', 9600)
初始化用于存储数据、时间戳、条形图和文本标签的列表,并打开串口。
-
更新函数:
def update1(): global data1, time_stamps, bar_graphs if ser.in_waiting > 0: # 检查串口中是否有数据 line = ser.readline().decode('ascii').strip() print(line) data_point = float(line) data1.append(data_point) time_stamps.append(time.time()) ...
定义一个更新函数
update1()
,在其中读取串口数据,并更新数据列表、时间戳等。如果串口中有数据,将其添加到data1
列表中,并创建一个新的条形图项并添加到绘图区域中。同时更新文本标签的位置和文本内容。 -
定时器:
timer = pg.QtCore.QTimer() timer.timeout.connect(update1) timer.start(50)
创建一个定时器,每50毫秒调用一次
update1()
函数,用于实时更新数据。 -
主程序:
if __name__ == '__main__': import sys if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): QtGui.QGuiApplication.instance().exec_()
在非交互式模式下运行程序,创建GUI应用实例。
-
完整代码如下(根据自身需求可自行修改):
import time import pyqtgraph as pg import serial from pyqtgraph.Qt import QtCore, QtGui win = pg.GraphicsLayoutWidget(show=True) win.setWindowTitle('实时监测') win.setBackground('w') axis = pg.DateAxisItem(orientation='bottom') p2 = win.addPlot(labels={'left': '总用电量kwh'}, axisItems={'bottom': axis}) data1 = [] time_stamps = [] bar_graphs = [] # List to store BarGraphItems text_items = [] # 添加文本标签项 ser = serial.Serial('COM4', 9600) def update1(): global data1, time_stamps, bar_graphs if ser.in_waiting > 0: # 检查串口中是否有数据 line = ser.readline().decode('ascii').strip() print(line) data_point = float(line) data1.append(data_point) time_stamps.append(time.time()) if len(data1) > 12: data1.pop(0) time_stamps.pop(0) # Create a new BarGraphItem for each data point new_bar_graph = pg.BarGraphItem(x=[(time_stamps[-1], time_stamps[-1])], height=[data1[-1]], width=1, brush=(68, 114, 196)) p2.addItem(new_bar_graph) bar_graphs.append(new_bar_graph) # 更新文本标签位置和文本 for item in text_items: p2.removeItem(item) text_items.clear() for i in range(len(data1)): text_item = pg.TextItem(text=str(data1[i]), color=(255, 0, 0), anchor=(0.5, 1)) text_item.setPos(time_stamps[i], data1[i]) text_items.append(text_item) p2.addItem(text_item) # Remove old BarGraphItems if len(bar_graphs) > 12: old_bar_graph = bar_graphs.pop(0) p2.removeItem(old_bar_graph) timer = pg.QtCore.QTimer() timer.timeout.connect(update1) timer.start(50) if __name__ == '__main__': import sys if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): QtGui.QGuiApplication.instance().exec_()