1. 先说清楚:为什么我非要把串口log“强制”自动保存
干嵌入式、单片机、物联网调试这行的朋友,应该都有过这种经历:拿着一块开发板,接上USB转TTL模块,打开某个串口调试助手,对着设备一顿操作,调了一下午,终于把问题复现出来了。结果呢?日志刷屏刷得太快,往上翻翻了半天,好不容易定位到关键报错信息,手一抖,清屏了。或者更惨——设备重启、断电、电脑蓝屏、串口被其他软件占用,一整天的工作记录就这么没了,只能重头再复现一遍。
我自己踩过最大的一个坑,是在调试一块4G模组的通信协议时,设备每隔几分钟会打印一次异常心跳包。当时用串口手工具手动复制日志,复制了几十次,漏了好几段,最后分析数据时发现缺失了关键的报错序列,导致我整整白查了两天。从那以后我就下定决心,凡是接串口调设备,第一件事就是先把日志自动保存打开,不管后面用不用得上,先落盘再说。
MobaXterm这个工具,很多人对它的印象是“Windows下连Linux服务器的神器”。它确实集成了SSH、FTP、X11转发这些功能,但很多人忽略了它在串口调试上的能力。MobaXterm自带串口会话功能,能直接连接COM口(也就是你电脑上的USB转串口,比如常见的CH340、CP2102芯片方案),而且它的日志自动保存能力比传统串口调试助手强太多——支持颜色保留、时间戳、自动文件名、按会话隔离,最关键是它是后台自动落盘的,不需要你手动点保存。
这篇文章我直接把自己平时在Windows下用MobaXterm做串口日志自动保存的3套方案完整写出来。第一套适合新手,点几个设置就行;第二套适合经常要远程调试Linux开发板的人;第三套适合喜欢轻量命令行的人。三套方案各有取舍,我会把配置参数、适用场景、踩坑点都讲透,你照着抄就能用。
2. 方案一:MobaXterm自带日志功能,两分钟配置好
这是最推荐入门使用的方法,因为MobaXterm把日志功能做成了一个可勾选的开关,不需要额外安装任何插件,也不用写脚本。
2.1 新建串口会话前,先把全局日志参数配好
打开MobaXterm主界面,先别急着连串口,点击顶部菜单栏的Settings(设置),然后进Configuration(配置)。在左侧导航找到Terminal选项卡,里面有一个Logging区域,这里就是所有日志保存的全局默认参数。
你需要确认以下几个选项:
- Log terminal output:勾选这个,终端输出才会写入文件。如果不勾选,后面一切白搭。
- Log type:建议选Plain text(纯文本)。另一个选项是ANSI color,能把终端里的颜色码以转义序列形式存进文件。说实话,ANSI color模式在回看日志时很痛苦,里面全是
\x1b[31m这种字符,可读性极差,所以我默认选纯文本。 - Log file name:这里支持宏变量,你可以用
%Y-%m-%d_%H-%M-%S这种日期时间占位符。比如写成D:\serial_logs\%Y-%m-%d_%H-%M-%S.log,那么每次新建会话都会生成一个以当前时间命名的文件,不会互相覆盖。 - Save logs on demand:这个不建议勾。它的意思是“你按一下按钮才保存”,这就又回到手动保存的老路上了,违背了我们全自动的初衷。
- Append logs to same file:勾选的话,所有会话的输出都堆积到同一个文件末尾;不勾选的话,每个会话单独一个文件。我建议不勾选,每回调试一个独立主题,就让它生成独立文件,后续回看归档都好处理。
配置好之后,点OK保存。以后每个新建的串口会话都会自动套用这个日志规则。
2.2 串口会话级别再检查一遍参数
在MobaXterm主界面点击Session(会话)图标,在弹出的窗口里选择Serial选项卡。这里填入你实际的串口参数:Serial port选择COM口编号,Baud rate选择波特率,其余如数据位8、停止位1、校验位None一般保持默认即可。
关键点来了:很多人在这一层找不到日志设置。你需要点击下方那个Advanced Serial settings按钮,展开之后会多出几个选项,其中就包括Log filename。这里可以单独指定当前这个串口会话的日志文件名,覆盖全局设置。
我个人的习惯是:全局设置只负责“开启日志”这个总开关,具体文件名放在会话级别配置。因为不同设备的调试记录想分开放,比如GPS模块的log放一个目录,4G模组的放另一个目录,互不干扰。在会话级别写路径时,可以用相对路径,也可以写绝对路径,建议写绝对路径,MobaXterm对相对路径的解析在某些版本下不太稳定。
注意:MobaXterm的串口会话日志功能,在旧版本(比如v10.x)里藏在会话建立之后右键标签页的"Edit session"里。如果你找不到Advanced Serial settings,右键左侧会话列表里的会话,选择Edit session,同样能看到日志相关配置。
2.3 实测效果与常见误区
配置好后,正常打开串口会话,MobaXterm窗口下方状态栏会看到一个小红点或者日志文件名显示,说明已经在记录了。此时设备输出的所有内容会实时写入到你指定的log文件里。
我实测过很多次,这个记录过程有几个特点:
- 写入是实时的,不是缓存到内存等退出时才flush,所以你大可放心,设备死机、电脑断电之前的内容基本已经在磁盘上了。
- 日志文件在Windows下编码默认是UTF-8。如果你的设备输出的是GBK/GB2312中文,用记事本打开可能乱码。没关系,用VS Code或者Notepad++打开时手动切换编码即可。
- 如果中途改了波特率,MobaXterm不会自动重新适配,也不会在log里标注“波特率已更改”,这个需要你自己在测试时注意。
方案一最省事,但有个限制:它只能在MobaXterm这个窗口界面里工作。如果你同时想干别的,比如一边看log一边在另一个终端敲命令,一旦串口会话被误关或者软件崩溃,日志写入也会中断。对于长期运行的设备(比如连续压测几天几夜),会存在风险。这时候就需要方案二了。
3. 方案二:Linux screen + logfile,把日志留在设备端
这个方法适合什么场景?就是你的开发板或设备本身就是Linux系统,你用MobaXterm的SSH功能登录到设备上,设备的串口(比如/dev/ttyUSB0、/dev/ttyAMA0)需要你通过命令来读取。这种情况下,日志已经不属于MobaXterm的终端界面,而是由Linux系统里的工具在管理,所以我们要在Linux端实现自动保存。
3.1 一条命令搞定:screen的log功能
Linux下读取串口最常用的命令之一就是screen。它的本职工作是一个终端复用器,但自带一个很实用的参数叫-L,意思是把终端所有输出写入到日志文件里,配合-Logfile指定路径。
连串口的完整命令是:
screen -L -Logfile /var/log/serial_ttyUSB0.log /dev/ttyUSB0 115200拆开解释一下:
-L:开启日志记录。-Logfile:指定日志文件的绝对路径。如果不指定,默认在当前目录生成一个screenlog.0文件。/dev/ttyUSB0:串口设备名,如果用的是CH340方案,通常是ttyUSB0或ttyUSB1;如果是树莓派板载串口,一般是ttyAMA0或ttyS0。115200:波特率,这个必须跟你的设备一致,不然全是乱码。
运行后,设备输出的所有内容都会实时写入/var/log/serial_ttyUSB0.log。想退出串口查看界面时,按Ctrl + A再按K,然后按Y确认杀掉会话。日志文件会保留在设备里。
实际使用中我踩过几个坑,需要单独说一下:
- 如果提示
screen: command not found,说明系统没装screen。Devuan/Ubuntu/Debian系执行sudo apt install screen就能装。但要留意,嵌入式Linux如BusyBox环境通常没有screen命令,那么这条方案就要换成busybox自带的microcom工具,不过microcom本身不直接支持记日志,需要配合管道处理,就没那么方便了。 - 每次Ctrl+A然后按K退出时,一定要等日志文件size不再变化了再拷贝。有时候文件系统和进程之间还有缓冲,立刻scp拷贝会得到截断的文件。建议退出后等两秒,然后再拷贝。
- 日志写到
/var/log目录需要root权限。不想开root的话,把路径改到用户目录,比如~/serial_logs/$(date +%Y%m%d).log这种写法也可以。
3.2 大招:用空白输出自动滚动,配合cron做日志切割
screen的log功能默认是“一个文件写到地老天荒”,如果设备持续运行几个月,log文件会膨胀到几个GB甚至几十GB,到时候打开文件都费劲。所以在方案二里我习惯配合logrotate做日志切割。
在设备的/etc/logrotate.d/目录下新建一个配置文件,内容类似:
/var/log/serial_ttyUSB0.log { daily rotate 7 compress missingok notifempty copytruncate }这个配置的意思:每天切割一次,保留7份历史文件,旧的压缩成.gz,日志文件不存在时跳过,空文件不切割,copytruncate参数很关键——它先复制一份当前log再清空原文件,这样就算screen进程还在向原文件写数据也不会报错。
配置好之后,logrotate的切割是自动触发的,不需要人工干预。每天凌晨你得到的是一个带日期的历史归档,比如serial_ttyUSB0.log-20250315.gz,今天运行产生的数据还在主文件里。这个方案对“长时间、无人值守”的调试场景非常友好。
3.3 为什么推荐screen而不是cat直接重定向
有的朋友会问:我直接执行cat /dev/ttyUSB0 > log.txt &不也一样吗?从“能记录”这个角度确实一样,但差别在于:
cat > log.txt是纯输出重定向,你没法实时看屏,一旦想看当前输出状态就得另开一个终端去tail。- screen提供了一个可视化交互界面,你能看到输出,也能用scrollback翻页查看历史(用
Ctrl + A然后Esc进入复制模式再翻页)。 - 最重要的是,screen支持detach:当你需要暂时离开终端,按
Ctrl + A再按D,会话会在后台继续跑,串口数据不会断。这在你需要临时腾出MobaXterm窗口去处理其他任务时太有用了。
这里补充一个小知识点:MobaXterm本身连接串口时是可以直接保存日志的,但它的实现是“你本地Windows的一个窗口连到了串口”。而方案二把日志存到了Linux设备端,两边都有独立的记录文件,等于做了一层双保险。我实际调试时经常两边同时开着,本地留一份,设备端留一份,哪边出问题都有备份。
4. 方案三:Minicom + 脚本定时导出,轻量无依赖
第三种方法适合那些不喜欢screen那一堆快捷键、也不喜欢GUI设置的人。minicom是最老牌的Linux串口工具了,基本上所有Linux发行版的软件源里都有,安装也方便:
sudo apt install minicom4.1 minicom的基础配置与日志开启
先用minicom -s进入设置模式,选择Serial port setup,在里面把串口设备和波特率填对:
A对应串口设备路径,比如/dev/ttyUSB0E对应波特率,可以手动输入,比如115200- 确认硬件流控Hardware Flow Control改为No,否则有时会卡住
设置完成后选“Save setup as dfl”,保存默认配置。以后直接执行minicom就会用这套参数连串口。
minicom的日志保存设置默认是不开启的。在运行界面里按Ctrl + A然后按L,它会提示你输入一个日志文件名。输入完成后,minicom就会开始把所有输出写入这个文件。
这个方法有个明显的好处:日志文件是即时落盘的。minicom写日志用的是fprintf配合缓冲,虽然没有做到每次字符都flush,但你在设备端随时tail文件,基本能实时看到新内容。如果你用screen的log模式,数据是分批写入的,实时tail时往往有一小段延迟。
4.2 脚本化:自动记录+自动加时间戳
minicom的日志功能虽说简单,但有一个痛点:每次按Ctrl + A然后按L手动输入文件名,还是麻烦。我习惯写一个小脚本,把“启动minicom并带出日期文件名”的逻辑封装起来:
#!/bin/bash LOG_DIR="$HOME/serial_logs" mkdir -p "$LOG_DIR" LOG_FILE="$LOG_DIR/$(date +%Y%m%d_%H%M%S)_minicom.log" exec minicom -D /dev/ttyUSB0 -b 115200 -C "$LOG_FILE"把这段保存成一个run_minicom.sh,然后chmod +x run_minicom.sh。以后只要执行这个脚本,minicom就会自动启动,日志文件自动按当前时间命名存放在~/serial_logs目录下。
这里用exec替换当前shell进程执行minicom,好处是以后你Ctrl+A再X退出minicom时,整个脚本进程也会一并退出,不会留下后台僵尸进程。
4.3 minicom日志场景的两个隐藏技巧
minicom的日志记录有个小毛病,它把整个终端的输出包括一些控制字符都原样写入文件了。比如说你在minicom界面里按了上下键浏览历史,这些按键对应的转义序列也会混进log文件里。没关系,我们后期处理一下就行:
sed -i 's/\x1b\[[0-9;]*[a-zA-Z]//g' "$LOG_FILE" sed -i 's/\x1b\][^\x07]*\x07//g' "$LOG_FILE"这两条sed命令,第一条干掉常见的ANSI颜色/光标移动转义序列,第二条干掉操作系统命令序列(OSC),跑完再打开log文件就干净多了。
另一个技巧是:minicom的日志文件中,每行末尾可能是\r\n而不是\n,这在后续用Python脚本分析log时可能导致解析问题。处理方式也很简单,用Python读的时候带上newline=''或者先统一替换一下\r\n为\n即可。
5. 三套方案横向对比与我的选型建议
很多第一次接触串口日志自动保存的朋友,看了三种方案可能会有些迷惑。我用一张表格把它们的核心差异列出来,方便你根据自己的实际情况来选。
| 对比维度 | 方案一:MobaXterm GUI | 方案二:screen + logfile | 方案三:Minicom + 脚本 |
|---|---|---|---|
| 适用平台 | Windows本地,MobaXterm内 | 远程Linux设备,通过SSH | 已登录Linux或本机有minicom |
| 配置难度 | 低,点几个选项 | 中,需熟悉screen快捷键 | 中高,需配置minicom参数 |
| 日志落盘位置 | 本地Windows磁盘 | 远程Linux设备磁盘 | Linux本地磁盘 |
| 是否支持日志切割 | 不支持,需自己定时清理 | 可以配合logrotate | 手动移动或写脚本 |
| 实时性 | 较好,基本实时写入 | 分批写入,略有延迟 | 基本实时 |
| 断线/崩溃风险 | 软件崩溃会中断 | screen后台运行更稳 | 依赖终端,关了就断 |
| 适合场景 | 快速调试、临时记录 | 长期压测、无人值守 | 轻量环境、无GUI依赖 |
5.1 如果你只想要最简单的方法
那就直接用方案一。打开MobaXterm,全局设置里勾上Log terminal output,路径填好,完事。这个方法最适合Windows下临时接一块板子,快速看输出、留个底。它的弱点是切割和归档能力差,日志文件会越来越大。我的做法是每次调试前手动给log文件名加上日期,比如D:\logs\20250315_uart.log,这样同一个文件里不会有跨天的数据搅在一起。
5.2 如果你要长时间挂机测试
那就用方案二。把screen跑在后台,配合logrotate做切割,哪怕你关了MobaXterm也没关系,设备端照样在记录。等你过两周再打开看,归档文件都按天压缩好了,拿下来慢慢分析。这个方案也是我目前做连续可靠性测试时的首选。
5.3 如果你的设备环境非常简陋
没有screen,也没有systemd,甚至连Python都不想装,那就用方案三。minicom在BusyBox环境里可能没有,但在标准的Debian/Ubuntu系统里一定装得上,脚本简单,无依赖,日志文件也干净。
5.4 我的实际选择组合
说下我真实的调试习惯:本地Windows开着MobaXterm的GUI串口会话,开日志保存作为现场记录;同时SSH连进Linux设备,在设备上挂一个screen会话,把日志写到设备端的/var/log目录,配好logrotate。这样做的原因是,就算我在本地乱操作导致MobaXterm崩了,设备端的数据仍然在,而且不依赖网络稳定性。
6. 绕不开的坑与排查技巧
不管用哪种方案,串口日志保存这块始终有几个高频问题,我每个都实际遇到过,整理成速查表方便你排查。
| 故障现象 | 可能原因 | 解决办法 |
|---|---|---|
| MobaXterm连不上COM口 | CH340/CP210x驱动没装好 | 设备管理器看是否识别为COM口,没有就装对应驱动,比如CH340芯片方案要安装ch340串口驱动 |
| 日志文件是空的 | Log terminal output没勾选,或路径无写权限 | 取消勾选Save logs on demand,检查磁盘目录是否真实存在 |
| 日志内容全是乱码 | 波特率不匹配,或设备为8E1等不规则格式 | 核对设备的实际波特率、校验位、数据位,逐项调整 |
| log文件打开是乱码(中文) | UTF-8与GBK编码不匹配 | 用VS Code/Notepad++切换编码打开 |
| 日志文件一直不涨 | 串口数据进了内核缓冲但没被工具读取 | 检查连接的USB转TTL模块上的TX/RX是否接对,板上是否共地 |
| screen退出后文件不完整 | 文件系统尚未flush | 不要马上杀进程,用sync命令刷盘再拷贝 |
| MobaXterm退出时日志丢失 | 软件崩溃导致缓冲区丢失 | 尽量用正常流程关闭会话而不是任务管理器强杀 |
6.1 关于log文件编码的一个补充
调试设备时,很多国产模块比如GPS、4G模组会直接输出中文提示。MobaXterm默认保存为UTF-8是没问题的,但如果你用老式串口助手生成的日志(GB2312)做对照分析,两边的编码可能不一致。我的经验是:在分析时统一用VS Code打开,右下角手动切换文件编码,看到不乱码就算好。
6.2 关于USB转TTL模块的坑
如果你发现日志数据忽断忽续,或者MobaXterm提示“Access denied”,排查顺序是:先拔掉USB线重新插,确认没有其他软件占用串口;再检查模块本身,CH340这类便宜模块在高速率大流量下偶尔会有丢包现象,换成带屏蔽的成品线能缓解。日志保存本身不会导致丢包,但如果串口收到的数据本身断了,log里自然对应少一段。
6.3 关于MobaXterm版本差异
MobaXterm的免费版(Home Edition)和付费版在日志功能上是一致的,没有阉割。但有一点要注意:免费版在某些系统上会有“标签页数量限制”和“会话数量限制”的提示,不影响单个串口日志保存。另外,新版MobaXterm的界面语言为英文,如果想改成中文,网上有汉化教程,但建议还是用英文原版,因为汉化补丁偶尔会导致设置界面无法打开,遇到这种情况不要慌,重装原版即可。
7. 最后分享一点我的经验心得
从最开始手动复制日志,到现在三套方案随手切换,最直观的感受就一句话:日志保存这步越自动化,调试效率越高。你永远不知道一个bug什么时候会复现,但如果你随时都有一份完整日志在手,复现问题、定位根因的速度会快好几倍。
我自己的习惯是,每次接一块新设备或者新板子,第一件事不是打开调试助手,而是先把日志目录和命名规则定好。宁可这轮调试没任何问题,日志文件只是个空文件,也不要等到出问题才发现自己什么记录都没留。哪怕是一模一样的代码,不同批次硬件上的表现都不一样,有日志才有对比,有对比才能定位变量。
这套思路并不仅限于串口日志,很多类似的电脑端日志保存也适用。只要记住“先落盘再说”这个原则,你会发现很多调试焦虑都会消失。希望这篇文章能帮你省掉那些因为日志丢失而被迫重来一遍的工作量。