Python串口数据实时绘图

简介

随着物联网的发展,串口通信在数据传输方面扮演着重要的角色。而Python作为一种功能强大且易于学习的编程语言,具有广泛的应用领域,也可以用来实现串口数据的实时绘图。本文将介绍如何使用Python通过串口接收数据,并实时将数据可视化为图表。

准备工作

在开始之前,我们需要安装PySerial库,它是Python中用于串口通信的标准库。可以使用以下命令在终端中安装PySerial:

pip install pyserial

接收串口数据

首先,我们需要确定要接收串口的设备名称。可以通过以下代码查看当前可用的串口设备:

import serial.tools.list_ports

ports = serial.tools.list_ports.comports()
for port, desc, hwid in sorted(ports):
    print(f"{port}: {desc} [{hwid}]")

上述代码将输出所有可用的串口设备以及它们的描述信息。

接下来,我们将使用PySerial库来打开串口并接收数据。以下是一个示例代码:

import serial

port = 'COM1'  # 替换为实际的串口设备名称
baud_rate = 9600

ser = serial.Serial(port, baud_rate)

while True:
    if ser.in_waiting > 0:
        data = ser.readline().decode('utf-8').rstrip()
        print(data)

上述代码中,我们使用serial.Serial函数打开了一个串口,并指定了波特率。然后,我们进入了一个无限循环,在每次循环中检查是否有数据可读取。如果有数据可读取,我们将读取数据并将其转换为字符串格式,然后打印出来。

实时绘图

要将串口数据实时绘制为图表,我们将使用Matplotlib库。Matplotlib是一个用于绘制2D图形的Python库,可以生成各种类型的图表。

以下是一个示例代码,演示如何实时绘制一个折线图:

import serial
import matplotlib.pyplot as plt

port = 'COM1'  # 替换为实际的串口设备名称
baud_rate = 9600

ser = serial.Serial(port, baud_rate)

x_data = []
y_data = []

plt.figure()

line, = plt.plot(x_data, y_data)

plt.xlabel('Time')
plt.ylabel('Value')

plt.title('Real-time Data')

while True:
    if ser.in_waiting > 0:
        data = ser.readline().decode('utf-8').rstrip()
        value = float(data)
        
        x_data.append(len(x_data))
        y_data.append(value)
        
        line.set_xdata(x_data)
        line.set_ydata(y_data)
        
        plt.xlim(0, len(x_data))
        plt.ylim(min(y_data), max(y_data))
        
        plt.pause(0.01)

上述代码中,我们首先创建了一个空的折线图,并设置了横轴和纵轴的标签以及标题。然后,我们进入了一个无限循环,在每次循环中检查是否有数据可读取。如果有数据可读取,我们将读取数据并将其转换为浮点数格式。接下来,我们将新的数据点添加到数据列表中,并更新图表的数据。最后,我们使用plt.pause函数来暂停0.01秒,以便能够实时显示图表。

总结

通过使用PySerial和Matplotlib库,我们可以轻松地实现Python串口数据的实时绘图。首先,我们使用PySerial库来接收串口数据,并使用Matplotlib库来实时绘制图表。这种方法可以帮助我们可视化串口数据并更好地理解数据的变化。同时,我们还可以根据实际需求,对代码进行修改和扩展,以满足不同的应用场景。

状态图

下面是一个使用mermaid语法绘制的状态图,展示了整个数据接收和绘图的流程:

stateDiagram
    [*] --> 接收数据
    接收数据 --> 绘制图表
    绘制图表 --> 接收数据

以上