从零开始,用 Python 写一个能和单片机对话的上位机
你有没有过这样的经历?手里的 STM32 或 Arduino 正在跑传感器数据,串口助手里一堆跳动的数字看得眼花缭乱,却没法保存、不能画图、也不够'专业'。你想做个专属监控界面,但听说要用 C# 写 WinForm,或者学 LabVIEW 这种重型工具——光安装就劝退了。
别急。今天带你只用 Python,从零开始做一个真正能用的简易上位机软件。不需要任何嵌入式基础,也不用懂复杂的 GUI 框架设计。只要你会一点点 Python 语法,就能做出带按钮、能连串口、实时显示数据的小程序。
而且这个程序将来还能扩展成波形图、导出 CSV、远程控制……一切,都从这一步开始。
先搞明白:什么是'上位机'?
简单说,上位机就是电脑上的控制中心,它负责和下位机(比如单片机)'聊天',发指令、收数据、做记录。
举个例子:你在 Arduino 上接了个温湿度传感器;它通过 USB 串口不停地往外发 Temp: 25.3°C, Humi: 60%;你想在电脑上看这些数据,最好还能点个按钮让它重启,或者把历史数据存下来。这时候你就需要一个图形化的上位机软件来完成这些事。
传统做法是用 C# + Visual Studio 或者 LabVIEW,但学习成本高、跨平台难。而 Python 不一样——它有现成的库帮你搞定串口通信和图形界面,代码简洁到几百行就能跑起来。
我们今天的任务,就是用 PySerial + PyQt5 搭建这样一个轻量又实用的系统。
第一步:让电脑找到你的开发板 —— 串口通信入门
所有通信的第一步,都是'握手'。就像打电话前得先拨对号码一样,我们的上位机必须准确找到那根连着开发板的 USB 线对应的串口号。
Windows 上通常是 COM3、COM4……Linux/Mac 则是 /dev/ttyUSB0 或 /dev/cu.usbserial-*。问题是:每次插拔可能变号,手动填太麻烦。
所以我们先写个函数,自动扫描当前可用的串口:
import serial
import serial.tools.list_ports
def find_available_ports():
ports = serial.tools.list_ports.comports()
return [port.device for port in ports]
一行命令就能列出所有可用串口设备。用户打开软件时自动刷新列表,再也不用手动猜哪个是目标端口。
接下来是连接。我们需要指定波特率(常见为 115200)、数据位、停止位等参数。只要两边一致,就能正常通信。
封装一个安全的打开函数:
def open_serial(port, baudrate=115200):
try:
ser = serial.Serial(port, baudrate, timeout=1)
print(f"成功连接至 {port},波特率:{baudrate}")
return ser
except Exception as e:
print()

