做过嵌入式或者软硬件联调的朋友,一定都遇到过这种场景:手头设备功能验收的时候怎么测都正常,可一到客户现场或者量产抽测,就时不时冒出一个莫名其妙的毛病——串口偶尔读不到数据、蓝牙用着用着就断开、烧录的时候十块板子总有那么一两块死活下载不进去。你说它坏了吧,重启一下又好了;你说它没问题吧,复现的时候它又给你脸色看。这种偶发 bug,最折磨人的地方不是修本身,而是定位——你连它怎么出现的都说不清楚,谈什么修?
这篇内容,我就把近期处理过的三个典型偶发问题串起来讲:串口假故障的换机排除、蓝牙断开的录屏取证,以及“新旧批次对照”的烧录排查。三个案例覆盖了硬件、软件、工具链三个层面,但背后的排查思路是通用的,后面遇到类似问题可以直接照着试。
1. 偶发 bug 的底层逻辑:先固定现场,再谈修复
1.1 偶发问题为什么这么难搞
偶发 bug 难搞,不在于问题本身有多深奥,而在于它出现的条件太苛刻,你往往只有一次观察机会。串口偶发丢数据,可能背后的原因是 USB 口接触不良、驱动被系统自动更新换掉、电平转换芯片时序不对,甚至仅仅是某根线在这个温度下恰好阻抗超标;蓝牙偶发断开,可能是手机锁屏后蓝牙被系统挂起、天线附近有人走动改变了反射路径、固件里某个定时器在特定时间片竞争;烧录偶发失败,可能是批次的 flash 芯片型号不同、板子电源纹波偏大、调试器线缆太长导致 SWD 信号沿变差。
这些问题的共同特点是:链路太长。从手机软件到蓝牙协议栈,从射频前端到天线,从 USB 枚举到驱动再到串口芯片,中间任何一环出现微小异常,最终都表现为一个偶发症状。如果你直接抓住“串口没数据”这个现象去查代码,大概率一无所获——因为代码可能根本没执行到那里,数据压根就没到芯片的串口引脚。
所以遇到偶发 bug,先别急着打开 IDE 和示波器,先问自己三个问题:它是什么时候出现的?出现的环境是什么?有没有任何现场记录?这三个问题回答不了,后面所有调试都可能是盲人摸象。
1.2 排查前先做好三件准备工作
第一,建立事件日志意识。从怀疑有偶发问题那一刻开始,所有操作都要留痕。我习惯用手机备忘录记,简单到只记时间、操作、现象三条。比如“10:23 插上 USB 线,电脑提示无法识别设备”“10:25 换了一根线,正常,但 11:02 又断”。别小看这种流水账,偶发问题的规律往往就藏在时间、温度、操作序列这些看似无关的细节里。很多次我以为自己是“凭经验”找到问题的,回头看其实就是日志里某个条目反复出现。
第二,区分现象和原因。串口读不到数据是现象,原因可能是驱动、线材、电平、软件开串口失败、对方的芯片根本没启动。蓝牙断开是现象,原因可能是射频环境、协议栈降级、手机省电策略、对端电压掉电。新手容易把现象和原因混为一谈,一说串口不通就去改代码,改完还是不通,因为根子根本不在代码里。
第三,控制变量。偶发问题必须用“单一变量”原则去试。一次只换一个东西,换了之后记录结果,再换下一个。这个原则看起来简单,但实际操作中特别容易被忽略——一着急就同时换线、换电脑、换驱动、换固件,结果问题确实没了,但你永远不知道是哪个操作生效的,下次再遇到还是没辙。
2. 串口假故障:换机排除法怎么用才不白折腾
2.1 先认清什么是“假故障”
串口问题里有一大类是“假故障”——设备本身没坏,但表现出来就是通信不稳定。典型症状包括:设备管理器里能认出 COM 口,但发数据过去石沉大海;串口调试助手收