Python串口通信:实时数据显示与绘图教程

37 下载量 115 浏览量 更新于2024-08-30 5 收藏 169KB PDF 举报
“使用Python串口实时显示数据并绘图的例子,通过pyserial库实现串口通信,结合数据处理和可视化工具如pyqtgraph。” 在Python编程中,串口通信是连接硬件设备和软件的重要手段,尤其在嵌入式系统、物联网(IoT)和自动化项目中常见。`pyserial`是一个方便的库,它提供了Python接口,允许开发者与串行端口进行交互。在本例中,我们将详细介绍如何使用`pyserial`进行串口通信,并实时显示接收到的数据,甚至将这些数据进行绘图。 首先,确保你正确地安装了`pyserial`库。在命令行环境中,可以运行`pip install pyserial`进行安装。如果遇到“‘E:\Anaconda3\Scripts\pip-script.py’ is not present.”的错误,你可以使用`easy_install pip`命令解决后再尝试安装。 `pyserial`的基本用法包括打开、写入、读取和关闭串口。例如,`ser = serial.Serial(0)`会打开默认的第一个串口(在Windows系统下通常是`COM1`)。使用`ser.write("hello")`可以向串口发送数据,而`ser.close()`则用于关闭串口。为了查看串口状态,可以使用`ser.isOpen()`。 串口的一些关键属性包括: - `name`: 设备名称 - `portstr`: 已废弃,现在推荐使用`name`代替 - `port`: 读写端口号 - `baudrate`: 波特率,例如9600、115200等 - `bytesize`: 字节大小,通常为8 - `parity`: 校验位,如`serial.PARITY_NONE` - `stopbits`: 停止位,通常为1或2 - `timeout`: 读取超时设置 - `writeTimeout`: 写入超时 - `xonxoff`: 软件流控 - `rtscts`: 硬件流控 - `dsrdtr`: 硬件流控 - `interCharTimeout`: 字符间隔超时 在实际应用中,你需要根据串口设备的具体设置来配置这些属性。例如,以下是最基础的串口通信代码片段: ```python import serial port = "COM5" # 串口名称 bps = 9600 # 波特率 timeout = 5 # 超时时间 # 初始化串口 ser = serial.Serial(port, int(bps), timeout=1, parity=serial.PARITY_NONE, stopbits=1) if ser.isOpen(): print("打开成功") # 向串口写入数据 ser.write("hello".encode()) # 需要编码为字节字符串 # 读取数据 data = ser.readline().decode() # 以/n结束的数据行 # 关闭串口 ser.close() ``` 对于实时显示和绘图,可以结合其他Python库如`matplotlib`或`pyqtgraph`。`pyqtgraph`是一个强大的实时图形库,适合实时数据显示和交互。你可以定期读取串口数据,然后将其传递给`pyqtgraph`的绘图函数,如`plot()`,以动态展示数据变化。 下面是一个简单的例子,展示了如何使用`pyqtgraph`实时绘制接收到的串口数据: ```python import time import pyqtgraph as pg from PyQt5.QtWidgets import QApplication import serial app = QApplication([]) win = pg.GraphicsWindow(title="实时串口绘图") plotWidget = win.addPlot(title="串口数据") dataSeries = plotWidget.plot() ser = serial.Serial(port, bps, timeout=1) while True: if ser.isOpen(): data = ser.readline().decode().strip() try: value = float(data) dataSeries.setData(x=[time.time()], y=[value]) # 更新数据 except ValueError: pass time.sleep(0.1) # 控制更新速度 app.exec_() ser.close() ``` 这段代码创建了一个实时更新的图表窗口,不断从串口读取数据并将其作为Y轴值,X轴值对应于时间戳。注意,你需要根据实际串口数据格式处理数据转换(这里假设接收到的是浮点数)。 通过以上介绍,你应该能够理解如何使用Python的`pyserial`库进行串口通信,以及如何结合`pyqtgraph`库实现实时数据的图形化展示。在实际项目中,你可能需要根据具体需求调整代码,比如添加错误处理、数据缓存、多线程等高级功能。