可以帮我写一个接收串口数据的同时可以将数据写入excel表,同时又可以实时绘制数据折线图的python代码吗?要求绘制的折线图能在pyqt5的ui界面上实时显示,每次接收的数据类型为0.012085 0.153882 0.010474 0.005640 1.390576 1.252002 0.078955 0.940210
时间: 2024-03-13 07:44:42 浏览: 76
当然可以,以下是一个可能的解决方案:
```python
import sys
import serial
import numpy as np
import matplotlib.pyplot as plt
from PyQt5.QtWidgets import QApplication, QMainWindow, QSizePolicy
from PyQt5.QtCore import Qt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import openpyxl
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.serial_port = None
self.serial_data = []
self.data_line = None
self.data_fig = Figure()
self.data_ax = self.data_fig.add_subplot(1, 1, 1)
self.data_canvas = FigureCanvas(self.data_fig)
self.xlsx_file = None
self.xlsx_sheet = None
self.xlsx_row = 1
# 设置主窗口的属性
self.setWindowTitle('Serial Data Recorder')
self.setGeometry(200, 200, 800, 600)
# 设置数据图的属性
self.data_ax.set_xlabel('Time (s)')
self.data_ax.set_ylabel('Data')
self.data_line, = self.data_ax.plot([], [], '-')
self.data_fig.tight_layout()
# 将数据图添加到主窗口上
self.data_canvas.setParent(self)
self.data_canvas.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
self.data_canvas.setMinimumSize(400, 300)
self.setCentralWidget(self.data_canvas)
# 打开串口连接
try:
self.serial_port = serial.Serial('COM1', 9600)
except serial.SerialException:
print('Failed to open serial port')
sys.exit(1)
# 打开Excel文件
self.xlsx_file = openpyxl.Workbook()
self.xlsx_sheet = self.xlsx_file.active
self.xlsx_sheet.cell(row=1, column=1, value='Time (s)')
for i in range(8):
self.xlsx_sheet.cell(row=1, column=i+2, value='Data {}'.format(i+1))
# 启动定时器,每100ms读取一次串口数据并更新图表
self.timer = self.startTimer(100)
def timerEvent(self, event):
# 读取串口数据
if self.serial_port.in_waiting > 0:
data_str = self.serial_port.readline().decode().strip()
data = [float(x) for x in data_str.split()]
# 将数据保存到Excel表格中
self.xlsx_row += 1
self.xlsx_sheet.cell(row=self.xlsx_row, column=1, value=self.xlsx_row-1)
for i in range(8):
self.xlsx_sheet.cell(row=self.xlsx_row, column=i+2, value=data[i])
# 将数据保存到内存中,并更新图表
t = np.arange(len(self.serial_data), len(self.serial_data) + len(data))
self.serial_data.extend(data)
self.data_line.set_data(t, self.serial_data)
self.data_ax.relim()
self.data_ax.autoscale_view(True, True, True)
self.data_canvas.draw()
def closeEvent(self, event):
# 关闭Excel文件和串口连接
self.xlsx_file.save('data.xlsx')
self.serial_port.close()
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
```
这个程序使用PyQt5创建了一个带有实时折线图的窗口,同时打开了一个串口连接(假设为COM1,波特率为9600)。每100ms,程序会读取一次串口数据,将数据保存到一个内存中的列表中,并实时绘制折线图。每次读取的数据会被追加到Excel表格的下一行中,并保存到磁盘上(假设保存为data.xlsx文件)。程序运行过程中,可以使用Ctrl+C或关闭窗口来停止程序,并关闭Excel文件和串口连接。
需要注意的是,这个程序只是一个示例,仅供参考。实际应用中,需要根据具体的需求和硬件设备来进行修改和优化。
阅读全文