3、串口烧录工具实战:MobaXterm、SecureCRT与Python pyserial
说到串口烧录,很多新手第一反应就是「找个工具,点一下发送文件」。嗯,理论上没错。但实际量产时你会发现——工具选不对,效率少一半;脚本写不好,加班到通宵。
今天我就把这三款工具掰开揉碎了讲。MobaXterm适合快速调试,SecureCRT适合稳定量产,Python pyserial则是自动化烧录的终极武器。咱们一个一个来。
3.1 用MobaXterm进行串口烧录
MobaXterm这工具,我个人很喜欢。它集成了终端、串口、SFTP,甚至还有个X服务器。做嵌入式开发时,一个窗口全搞定。
第一步:打开串口会话
点击「Session」→「Serial」,然后设置参数:
- 波特率:115200(常用,具体看芯片手册)
- 数据位:8
- 停止位:1
- 校验位:None
- 流控:None
第二步:进入烧录模式
大多数芯片需要先拉低某个引脚(比如BOOT0)再上电。我习惯在MobaXterm里先敲个回车,看看有没有反应。如果出现「C」或者「等待下载」之类的提示,说明芯片已经就绪。
第三步:发送固件
MobaXterm没有内置的YMODEM/XMODEM协议按钮?别急。你可以用外部工具配合。比如用lrzsz工具包:
# 在MobaXterm的本地终端里执行
sz -b firmware.bin > /dev/ttyUSB0 < /dev/ttyUSB0
或者直接用cat命令把二进制文件怼过去:
cat firmware.bin > /dev/ttyUSB0
不过说实话,MobaXterm更适合调试阶段。量产时用它一个个点,手会抽筋的。
3.2 用SecureCRT进行串口烧录
SecureCRT是老牌工具了。我十年前刚入行时就在用。它稳定、脚本功能强,很多工厂的产线都在用。
配置串口连接
打开SecureCRT,点击「Quick Connect」:
- Protocol: Serial
- Port: COM3(根据实际端口选)
- Baud rate: 115200
- 勾选「RTS/CTS」?不,量产时建议关掉流控,否则容易卡死
使用脚本实现自动烧录
SecureCRT支持VBScript和Python脚本。我一般用VBScript写个简单的循环:
# $language = "VBScript"
# $interface = "1.0"
Sub Main
Dim objTab
Set objTab = CRT.GetScriptTab
' 发送烧录指令
objTab.Screen.Send "loadbin 0x08000000" & vbCr
objTab.Screen.WaitForString "Ready to download"
' 发送固件文件
objTab.SendFile "firmware.bin", "YMODEM"
' 等待烧录完成
objTab.Screen.WaitForString "Download OK"
' 复位芯片
objTab.Screen.Send "reset" & vbCr
End Sub
这个脚本在产线上跑了两年,烧了十几万片芯片,没出过问题。稳定,是真的稳定。
3.3 用Python pyserial实现自动烧录脚本
如果你问我,量产烧录最推荐的方案是什么?我的答案是:Python + pyserial。原因很简单——可控、可定制、可集成到CI/CD流水线。
安装pyserial
pip install pyserial
基础烧录脚本框架
import serial
import time
import struct
def calculate_checksum(data):
"""计算校验和,很多芯片协议需要"""
return sum(data) & 0xFF
def send_firmware(port, baudrate, firmware_path):
"""
串口烧录固件
:param port: 串口号,如 'COM3' 或 '/dev/ttyUSB0'
:param baudrate: 波特率
:param firmware_path: 固件文件路径
"""
ser = serial.Serial(
port=port,
baudrate=baudrate,
bytesize=8,
parity='N',
stopbits=1,
timeout=5
)
# 等待芯片就绪
print("等待芯片进入烧录模式...")
time.sleep(2)
ser.write(b'\r\n')
response = ser.read(100)
if b'C' not in response:
print("芯片未就绪,请检查硬件连接")
ser.close()
return False
# 读取固件
with open(firmware_path, 'rb') as f:
firmware_data = f.read()
# 发送固件(以YMODEM协议为例)
# 实际协议需要根据芯片手册调整
print(f"开始发送固件,大小:{len(firmware_data)} 字节")
# 这里简化处理,实际需要实现完整协议
chunk_size = 128
for i in range(0, len(firmware_data), chunk_size):
chunk = firmware_data[i:i+chunk_size]
# 发送数据包
ser.write(chunk)
time.sleep(0.01)
# 读取ACK
ack = ser.read(1)
if ack != b'\x06': # ACK
print(f"发送失败,位置:{i}")
ser.close()
return False
print("固件发送完成")
ser.close()
return True
if __name__ == '__main__':
success = send_firmware('COM3', 115200, 'firmware.bin')
if success:
print("烧录成功!")
else:
print("烧录失败!")
- 协议实现要完整——很多芯片有握手、校验、重传机制
- 超时设置要合理——太短容易误判失败,太长浪费产线时间
- 日志要详细——出问题时能快速定位
量产增强版脚本
在实际产线中,我还会加入以下功能:
- 自动检测串口:遍历所有可用串口,找到目标芯片
- 烧录次数统计:记录成功/失败次数,生成报表
- 多线程并行烧录:一个工位同时烧4块板子
- 校验机制:烧录完成后读回校验,确保数据正确
def auto_detect_port(vid_pid_list):
"""自动检测指定VID/PID的串口"""
import serial.tools.list_ports
ports = serial.tools.list_ports.comports()
for port in ports:
for vid_pid in vid_pid_list:
if vid_pid in port.hwid:
return port.device
return None
三种工具对比总结
| 工具 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| MobaXterm | 开发调试、小批量 | 界面友好、集成度高 | 自动化能力弱 |
| SecureCRT | 中等批量、产线稳定 | 脚本稳定、支持协议多 | 收费、配置稍复杂 |
| Python pyserial | 大批量、自动化集成 | 完全可控、可定制 | 需要编程能力 |
我个人建议:调试用MobaXterm,产线用SecureCRT或Python脚本。如果你有编程基础,直接上Python——它给你最大的自由度。而且,当你看到几十块板子同时自动烧录时,那种成就感,嗯,很爽。
最后说一句: 不管用哪个工具,校验这一步绝对不能省。烧录完成后一定要读回数据对比,否则芯片跑到客户手里出问题,那代价就大了。
可可精品资料库