不止于cutecom:在Ubuntu 20.04上配置CH340后,还有哪些好用的串口工具和自动化脚本?

张开发
2026/4/11 11:42:20 15 分钟阅读

分享文章

不止于cutecom:在Ubuntu 20.04上配置CH340后,还有哪些好用的串口工具和自动化脚本?
超越cutecomUbuntu 20.04下CH340串口工具进阶指南当你成功在Ubuntu 20.04上配置好CH340驱动后cutecom可能只是你串口调试旅程的起点而非终点。对于追求效率的开发者而言掌握多样化的串口工具和自动化技巧能够将繁琐的手动操作转化为高效的自动化流程。本文将带你探索cutecom之外的串口工具世界并教你如何通过脚本实现串口数据的自动化处理。1. 串口工具的多维选择cutecom以其简洁的图形界面受到许多初学者的青睐但在实际开发中我们往往需要更强大、更灵活的工具。以下是几款值得尝试的替代方案1.1 minicom终端环境下的全能选手minicom是Linux环境下历史最悠久的串口通信程序之一完全在终端中运行适合远程SSH连接或没有图形界面的环境。安装只需一行命令sudo apt install minicom配置minicom时建议使用-s参数进入设置菜单sudo minicom -s在设置界面中你需要关注几个关键参数串口设备如/dev/ttyUSB0波特率常用115200数据位通常8校验位通常无停止位通常1minicom的高级技巧使用CtrlA后按Z可以查看所有快捷键CtrlA后按O可以快速进入配置菜单通过-C参数可以自动记录日志到文件1.2 screen简单快速的临时方案你可能已经熟悉screen作为终端复用工具但它也可以作为轻量级串口终端使用screen /dev/ttyUSB0 115200退出screen会话只需按CtrlA然后按k最后确认即可。screen特别适合快速检查串口输出但功能相对简单缺乏流控制等高级特性。1.3 picocom轻量级但功能完备picocom介于minicom和screen之间比screen功能丰富比minicom更轻量sudo apt install picocom启动picocom的基本命令picocom -b 115200 /dev/ttyUSB0picocom的特色功能包括支持十六进制显示灵活的流控制设置可配置的本地回显简洁的退出方式按CtrlA然后CtrlX1.4 工具对比与选择建议工具特性cutecomminicomscreenpicocom界面类型图形终端终端终端学习曲线简单中等简单中等日志记录支持支持有限支持脚本友好差一般差好流控制支持支持不支持支持适合场景初学者专业调试快速查看平衡型对于长期开发项目建议掌握minicom或picocom如果只是临时查看输出screen最为便捷而cutecom适合偏好图形界面的用户。2. 自动化脚本开发实战手动操作串口工具效率低下特别是在需要反复执行相同操作或长时间监控的场景中。通过编写脚本我们可以实现串口通信的自动化。2.1 Shell脚本基础最基础的串口自动化可以通过简单的Shell命令实现。例如实时显示串口输出并保存到文件stty -F /dev/ttyUSB0 115200 raw -echo cat /dev/ttyUSB0 | tee serial.log这个简单的组合实现了使用stty配置串口参数使用cat读取串口数据使用tee同时输出到屏幕和文件2.2 使用expect实现交互自动化对于需要发送命令并获取响应的场景expect是不错的选择。以下是一个自动登录串口设备并执行命令的示例#!/usr/bin/expect set timeout 20 set port /dev/ttyUSB0 set baud 115200 spawn screen $port $baud expect login: send username\r expect Password: send password\r expect $ send ls -l\r expect $ send exit\rexpect脚本的关键点spawn启动串口会话expect等待特定字符串send发送命令\r表示回车2.3 Python与pyserial的高级应用对于更复杂的串口应用Python的pyserial库提供了强大支持。安装pyserialpip install pyserial基础读写示例import serial ser serial.Serial(/dev/ttyUSB0, 115200, timeout1) ser.write(bAT\r\n) response ser.readline() print(response.decode(utf-8)) ser.close()数据记录与解析import serial from datetime import datetime ser serial.Serial(/dev/ttyUSB0, 115200) log_file open(serial_data.csv, a) while True: line ser.readline().decode(utf-8).strip() if line: timestamp datetime.now().strftime(%Y-%m-%d %H:%M:%S) log_entry f{timestamp},{line}\n log_file.write(log_entry) log_file.flush()这个脚本实现了实时读取串口数据为每条数据添加时间戳保存到CSV格式文件立即写入磁盘避免缓冲区延迟多线程串口处理对于需要同时读写的情况可以使用多线程import serial import threading class SerialManager: def __init__(self, port, baudrate): self.ser serial.Serial(port, baudrate, timeout1) self.running True def reader(self): while self.running: if self.ser.in_waiting: line self.ser.readline().decode(utf-8).strip() print(fReceived: {line}) def writer(self): while self.running: cmd input(Enter command (or quit to exit): ) if cmd.lower() quit: self.running False else: self.ser.write(f{cmd}\r\n.encode(utf-8)) def start(self): read_thread threading.Thread(targetself.reader) read_thread.start() self.writer() read_thread.join() self.ser.close() manager SerialManager(/dev/ttyUSB0, 115200) manager.start()3. 常见问题排查与性能优化即使配置正确串口通信中仍可能遇到各种问题。以下是常见问题的解决方案和优化建议。3.1 权限问题解决方案默认情况下普通用户可能无法访问串口设备。可以通过以下方法解决临时解决方案每次重启后需要重新执行sudo chmod 666 /dev/ttyUSB0永久解决方案推荐将用户加入dialout组sudo usermod -a -G dialout $USER创建udev规则/etc/udev/rules.d/99-ch340.rulesSUBSYSTEMtty, ATTRS{idVendor}1a86, ATTRS{idProduct}7523, MODE0666重新加载udev规则sudo udevadm control --reload-rules sudo udevadm trigger3.2 连接稳定性优化串口连接不稳定时可以尝试以下调整降低波特率从115200降到9600检查物理连接确保线缆质量良好添加适当的延迟特别是在发送大量数据时在Python脚本中使用time.sleep()控制发送速率import time for i in range(100): ser.write(bdata packet\r\n) time.sleep(0.1) # 100ms延迟3.3 数据解析技巧串口数据常常需要解析处理以下是几种常见情况的处理方法固定格式数据如TEMP:25.5Cline TEMP:25.5C if line.startswith(TEMP:): temp float(line[5:-1]) print(fTemperature: {temp}°C)CSV格式数据import csv with open(serial_data.csv, newline) as csvfile: reader csv.reader(csvfile) for row in reader: timestamp, value row # 处理数据二进制数据data ser.read(4) # 读取4字节 value int.from_bytes(data, byteorderlittle)4. 高级应用场景掌握了基础工具和脚本后可以尝试将这些技术应用于更复杂的场景中。4.1 串口数据可视化将串口数据实时可视化可以更直观地理解数据变化。使用Python的matplotlib可以实现import serial import matplotlib.pyplot as plt from collections import deque import time ser serial.Serial(/dev/ttyUSB0, 115200) plt.ion() # 交互模式 fig, ax plt.subplots() x deque(maxlen100) y deque(maxlen100) line, ax.plot([], []) while True: try: data ser.readline().decode(utf-8).strip() if data: value float(data) x.append(time.time()) y.append(value) line.set_data(x, y) ax.relim() ax.autoscale_view() fig.canvas.draw() fig.canvas.flush_events() except ValueError: continue4.2 多设备管理当需要同时管理多个串口设备时可以扩展之前的SerialManager类class MultiSerialManager: def __init__(self, ports): self.serials {port: serial.Serial(port, 115200) for port in ports} self.running True def monitor(self, port): while self.running: if self.serials[port].in_waiting: line self.serials[port].readline().decode(utf-8).strip() print(f{port}: {line}) def start(self): threads [] for port in self.serials: t threading.Thread(targetself.monitor, args(port,)) t.start() threads.append(t) try: while True: cmd input(Enter command (or quit to exit): ) if cmd.lower() quit: self.running False break finally: for t in threads: t.join() for ser in self.serials.values(): ser.close() manager MultiSerialManager([/dev/ttyUSB0, /dev/ttyUSB1]) manager.start()4.3 与Web应用集成通过Flask等框架可以将串口数据暴露为Web APIfrom flask import Flask, jsonify import serial import threading app Flask(__name__) ser serial.Serial(/dev/ttyUSB0, 115200) latest_data None def read_serial(): global latest_data while True: if ser.in_waiting: latest_data ser.readline().decode(utf-8).strip() app.route(/api/data) def get_data(): return jsonify({data: latest_data}) if __name__ __main__: thread threading.Thread(targetread_serial) thread.daemon True thread.start() app.run(host0.0.0.0, port5000)这个简单的Web服务会在后台线程中持续读取串口数据通过/api/data端点提供最新数据可以轻松扩展为控制接口

更多文章