资讯动态

CAN总线超时丢包抖动排查:深入理解协议容错机制

发布时间:2026/9/13 15:30:52 来源:尧图企业网站定制
做整车联调这些年我有个越来越深的体会CAN总线上十次“故障”里至少有三四次是被人为放大的假故障。去年做某款商用车项目中控屏频繁弹“雷达数据超时”我拿着示波器在底盘总线上蹲了两天波形干净得像教科书终端电阻也卡在60Ω出头波特率逐位比对没有偏差可超时告警就是阴魂不散。后来一查问题出在雷达节点自己的状态上——它的错误计数器已经涨到128进入错误被动模式每次发帧都要在总线上“低声下气”等多出8个隐性位再加上应用层超时门限定得太死一帧晚到20毫秒就判定超时。说白了这不是硬件故障是没搞懂CAN协议那套容错机制在工作时会产生什么宏观表现。这篇文章我就把这几年处理CAN报文超时、丢包、抖动的排查思路和根治方法摊开聊适合刚入门的嵌入式工程师、做ECU测试的朋友以及被总线疑难杂症折磨过的人。看懂这套“容错”逻辑很多问题你自己就能定位不用总怀疑接触不良。1. 先认清协议自带的容错保险很多“异常”其实是它正常工作1.1 差错检测与应答机制CAN在物理层就有“免疫系统”很多人以为CAN报文发出去就完事了但实际上CAN控制器在发帧时做了极其严密的差错检测比你想象中要“较真”得多。一帧标准CAN数据帧从SOF到EOF除了数据场还夹着CRC校验、应答位和帧结束标记。发送节点在发送过程中会同时监控总线电平它发的是显性位总线反馈回来的也是显性位这才能通过位错误检测CRC计算对不上直接标记CRC错误格式不符合规范记格式错误应答槽里没有其他节点拉低立即报应答错误。这套机制里最容易被忽略的是应答机制。很多新手以为发送成功就是“消息送达了”但CAN协议里所谓的成功只是指总线上至少有一个节点对你这帧数据做了应答。至于接收节点软件层面有没有处理协议管不着。所以你会看到一种现象总线负载正常发送端发送成功计数一直涨但某个接收方就是没反应这时候问题基本出在接收方的软件处理上跟总线无关。1.2 错误计数器与三种错误状态从主动到被动再到Bus-OffCAN控制器内部有一个错误计数器机制发送错误计数器和接收错误计数器分开累计规则有点像“功过相抵”的信用分体系成功发送或接收一帧计数器减1出错一次根据错误类型加8或加1。这个信用分直接决定节点的工作状态。当两个计数器都小于128时叫错误主动状态节点犯错后会积极发送错误帧用显性位重创总线让所有人都知道这帧有问题。一旦某个计数器达到128节点跌入错误被动状态这时候它就“低声下气”了不能主动发错误帧只能发被动错误标志而且每次要发送数据前必须在总线空闲后额外等8个位时间。你想想在500kbps的CAN总线上8个位时间差不多就是16微秒短吗平时看着短但如果总线上有一堆优先级高的报文在排队这个节点可能会连续错过好几个发送窗口帧间间隔被拉长从应用层看就是“偶尔晚到”。发送错误计数器超过255节点直接进入Bus-Off状态彻底和总线断开不发送不接收除非软件手动复位或者满足协议规定的128次总线空闲监测。Bus-Off在实车上很常见很多ECU在受到强烈电磁干扰后发送错误计数器飙升导致离线这时候报文在应用层看起来就是“超时超得死透”。1.3 自动重发机制为什么“看起来丢了一帧”其实是“自动补了一帧”CAN协议明确规定发送节点在仲裁丢失或发送出错的情况下会在总线变成空闲后自动重发这帧报文整个重发过程由硬件完成应用层和CPU都不知情。这个设计的初衷是保证实时性和可靠性但也带来了一个副作用你从CANalyzer或者PCAN上看到的“丢帧”很多根本不是丢而是第一帧没发出去隔了很短时间补发了一帧。具体来说如果上位机软件按周期统计报文到达时间比如DBC里定义某报文周期10ms你要求10ms必须来一帧。当发送端因为仲裁失败或者错误被动多等了几个位时间帧到达间隔变成12ms接收端统计时就会认为“这一帧超时没到下一帧反而早了”。如果没有在应用层设计好“允许一次精伸”的判断逻辑就会误报丢帧。老工程师嘴里常说的“CAN报文不承认丢包只承认重发”说的就是这一层机制。1.4 仲裁机制低ID优先排队重发正是抖动的重要来源CAN是CSMA/CA的带仲裁总线多个节点同时抢总线时ID数值越小显性位越靠前越优先。仲裁失败的节点不会收到错误帧而是立即停止发送并等待总线空闲后自动重发。这个仲裁过程是CAN协议最优雅的设计之一但它也是抖动不可忽视的来源。举个例子500kbps总线上0x123周期10ms、0x456周期10ms、0x789周期20ms三帧之间没有做相位错开设计每次都在同一小段时间里扎堆出现那0x789只能等前面0x123和0x456发完再排上队。平时看总线上每帧之间的间隔可能只有几十微秒不影响什么但要是网络里再加入诊断报文或者一堆事件型报文队列排长了优先级低的事件报文可能延迟几百微秒到几毫秒才发出去。对高实时性控制报文来说这毫秒级延迟就是抖动。所以处理抖动问题先看ID分配和报文发送时刻表比改软件参数重要得多。2. 超时问题排查顺序先分清是“协议在容错”还是“真的断了”2.1 超时本质上是对时间预期的落空三种报文的预期模型不同我排查超时问题第一步永远是先给这个报文定性它是周期报文、事件报文还是诊断请求/应答报文。三种报文的超时预期模型完全不同。周期报文比如转速、车速、电池SOC它的特点是无论数据变不变每个周期都必须来一帧超时判据是“期望间隔的N倍还没收到帧”。事件报文比如碰撞信号、故障码上报平时可能一整年都不出现它的超时判据是“一旦请求后多长时间没响应”没有固定周期。诊断类报文就更特殊了比如UDS诊断请求发出去后ECU在物理层正常但没有及时应答可能是ECU正在处理其他高优先级任务也可能是ECU压根没收到请求帧。这三类混在一起排查时先定性再动手否则会把周期报文的抖动问题误判成硬件问题把诊断超时当丢包处理。2.2 第一步在发送端确认帧是否真的发出处理超时的标准动作是从发送端看起而不是先怀疑线缆。拿CANoe抓一下发送节点所在的总线通道用硬件时间戳看这个报文是否真的被发出来了。注意这里要看的是“发送成功计数器在不在涨”不是看CANoe能不能抓到。CANoe抓到的帧意味着总线上确实有节点应答发送节点才可能完成发送。如果发送节点本身已经Bus-Off它会静默CANoe上自然收不到如果发送节点一直在错误重发但总不成功错误计数器会一路涨到Bus-Off。这个环节最常见的坑是发送节点用的是同一个MCU上的CAN外设硬件已经重发了但你能看到的只是应用层在“尝试发送”然后卡住。得用MCU的寄存器或者调试接口确认发送完成标识位有没有置起。如果发送完成位置起了CANoe却没抓到那问题就在物理层或者工具配置上不在软件层。2.3 第二步在接收端确认是否被过滤或丢弃发送端明明在发接收端应用层却没有数据进来这就要检查接收通道了。先查CAN控制器的验收滤波配置。很多芯片的验收滤波默认是不过滤的但工程师经常在配置时不小心把某个ID写成了掩码模式导致实际只接收段范围内的帧其他全被硬件丢弃。这个问题发生率极高尤其是复用别人的初始化代码时ID号修改不彻底调试了两天最后发现是滤波配错了。再查接收中断有没有被更高优先级的中断饿死接收FIFO有没有溢出标志。我曾经遇到一个项目MCU上中断负载很重CAN接收中断的服务函数里又做了很多位运算当总线负载率升高时一帧还没处理完下一帧就来了硬件FIFO溢出老帧被新帧覆盖应用层看起来就是“丢了一个周期的信号”。这种软件层面的处理不及时在CAN层抓包根本看不出来因为帧确实到达了只是被内核丢弃了。2.4 第三步检查节点错误状态和总线质量如果发送正常、接收滤波也没问题那就要看节点自己的错误计数器。很多MCU的库函数提供了读取CAN外设错误计数器的接口把发送错误计数器和接收错误计数器的值打出来看看是不是一直在涨。如果某个节点长期处于错误被动状态它发帧前要多等8个位时间应用层看起来就是超时偶发。导致错误被动的原因常见的有两个一是节点自己的收发器出现问题比如电容老化导致发送时总线电平不稳二是总线上其他节点在发错误帧把状态“污染”了。总线质量这块不要只看示波器波形“是不是方波”更要测量隐性电平和显性电平的幅值。正常的CAN_H对CAN_L的差分电压显性应该是2V左右隐性应该接近0V。如果隐性电平漂移到0.5V以上说明总线上某个节点的收发器有拉偏问题这种状态下长距离传输很容易产生位错误进而触发重发和错误计数器上涨。示波器上波形再“干净”也掩盖不了直流电平漂移。2.5 应用层超时阈值怎么定才稳妥这里直接给经验值然后解释理由。对常见的10ms周期报文我一般把超时阈值定为30ms也就是连续丢失3帧才报超时。为什么不是20ms因为20ms对应“连续丢2帧”在总线稍微拥堵或者错误被动节点介入时很容易因为仲裁延迟和位时间等待产生20ms的间隔。你也别把阈值卡死在协议规定的“最小期望时间”上那是理论值工程上要留足重发、仲裁、被动等待的余量。诊断请求这块UDS协议里P2默认是50msP2是5000ms。很多人直接把应用层超时设成P2结果频繁误报。实际上P2是服务器响应请求的“目标时间”不是说超过50ms就算失败而是ECU要在不超过P2的时间内给出响应P2只是请求方期望的响应速度。工程上把应用层诊断超时设成P2*比较安全或者设成P2的两倍并配合重发机制。3. 丢包CAN在很多情况下“物理上不该丢”丢了一定有原因3.1 为什么说CAN报文正常情况下不会丢理解丢包问题前必须先建立这个认知在CAN协议的正常工作范围内一帧报文要么成功发送得到至少一个节点的应答要么硬件反复重发直到成功或者节点进入Bus-Off不存在“发出去就石沉大海”的情况。这与以太网的UDP完全不同。所以当你发现某个节点周期性丢帧时不要直接想着“总线太忙丢包”要追问发送成功了吗发送后接收端收到了吗接收端处理了吗实际项目中我遇到过无数次“丢包”追到根因后有的是接收节点FIFO溢出有的是应用层逻辑重复处理导致丢信号有的是示波器触发设置不对没看到帧。真的由于总线“繁忙”导致CAN控制器丢弃帧的场景极少除非你把控制器配置成了只接收模式并且禁止自动重发——这种配置在工程里很少见。3.2 软件层的真实丢包点缓冲区溢出、中断阻塞、滤波配置错乱丢包根因排第一的是接收缓冲区溢出。CAN控制器硬件FIFO一般都做了一定深度比如经典CAN是3个存储单元CAN FD的M_CAN是32个。当总线负载率高且MCU中断响应不及时FIFO满了之后新帧会覆盖老帧或被丢弃。这时候抓包工具显示帧是连续的但应用层看到的数据就是不连贯。排第二的是接收中断服务函数写了太多代码。我见过有人在CAN接收中断里做里程积分、跑PID、写Flash中断服务函数一执行就是几百微秒下一帧来了只能等。在500kbps、10ms周期报文的场景下可能还能凑合但总线负载率一旦超过50%事件型报文一多必丢。正确做法是接收中断里只做时间戳记录和FIFO搬运复杂逻辑全放到主循环或低优先级任务里。排第三的是验收滤波配置错乱像前面说的掩码模式配置问题。这个问题隐蔽性极强因为抓包工具挂在总线上能看到帧而目标ECU却收不到。经验是排查时不仅仅要查ID号还要把掩码的每一位展开看看0和1是否把所有需要的ID都覆盖了。3.3 物理层“隐性丢包”终端电阻、分支、接地、线缆长度物理层丢包的典型表现是短距离测试没问题线一拉长就丢或者整车环境下偶发丢帧实验室里怎么复现都复现不出来。终端电阻是最常见的坑。我测过不少线束厂送来的成品线束标称120Ω终端电阻实际用万用表在总线两端量出来却是150Ω甚至更高。阻抗匹配不到位高速位流在总线末端产生反射导致隐显电平跳变时有振铃。振铃幅度大时采样点刚好采到错误的电平位错误出现发送节点默默重发——应用层看起来就是帧延迟和偶发丢失。分支线也是大忌。CAN总线要求“手拉手”菊花链拓扑每个节点用短截线接入总线截线长度在1Mbps下最好不超过30cm。但实车上为了布线方便经常出现“T星”接法反射叠加总线信号导演异常。我用示波器测过一根5米长的分支线末端波形显性跳变成隐性的地方震铃跑过了阈值整整持续了几个位时间。这种问题查分集终端电阻没用必须改拓扑。还有一个被人忽略的是接地问题。CAN收发器需要参考地网络里多个节点如果地电位差过大共模电压超出发收器承受范围总线电平会被干扰。地电位差的来源一般是不同ECU的电源地和车身地之间接触电阻偏大或者是搭铁点被油漆覆盖接触不良。用万用表量不同节点之间的地电位差超过0.3V就值得警惕超过1V基本必出问题。3.4 一个完整丢包案例从现象到根因的复盘去年给某客户排查一个丢包问题现象是仪表上偶尔弹出“左前雷达信号丢失”但仪表本身没有报故障码。先在总线挂CANoe抓了40分钟统计后发现左前雷达报文ID 0x0F010ms周期一共应该来24万帧左右实际只来了23.8万帧整体丢帧率0.8%不低但也不高。接下来按顺序排查先把盗取脚放在雷达节点控制器引脚让雷达自身完成发送用示波器看每一次发送后有没有应答位。结果发现有几个帧确实没有出现在总线上说明雷达的发送路径没有成功完成问题出在雷达节点到总线连接这一段。再看雷达节点的错误计数器发现接收错误计数在缓慢上涨。最后用大电流注入法测试发现节点上有一个线束连接器的端子压接不良接触电阻在车辆颠簸时偶发增大导致信号幅度不稳定进而产生位错误。接触不良问题是整车环境下最难抓的一类“丢包”它的隐蔽性在于万用表量静态电阻正常示波器看静态波形也没问题只有在振动和负载变化时才表现出来。这类问题没有捷径只能靠故障注入、振动测试加长时间录波三管齐下才能定位。4. 抖动比丢包更隐蔽的敌人藏在五个地方4.1 先理解抖动的两种形态周期抖动与延迟抖动比起超时和丢包抖动是更能恶心人的一类问题。所谓抖动就是报文到达时间相对期望时间的偏差。它分两种形态一种是周期报文每次到达的间隔时长时短叫周期抖动一种是某一帧总是比预期晚到一点叫延迟抖动。后者在同步控制场景里最致命比如雷达输出的目标列表数据如果延迟不稳定融合算法算出来的目标位置就可能跳变严重的会引发AEB误触发。从工程上看抖动和超时并不是两个孤立的问题。抖动积累到一定程度就会演变成超时超时往往只是抖动极端情况下的“表象”。所以排查超时问题如果阈值设置合理但还频繁报警十有八九是抖动在作祟。4.2 仲裁延迟总线排队的时间成本这是CAN协议固有特性决定的抖动源。多节点同时发送时低优先级帧必须等仲裁胜出的帧发完总线空闲后才能重发。如果网络里周期报文和事件报文没有做相位错开每次都在同一批时间段扎堆抢总线优先级低的帧延迟就会随机变化。这个延迟范围取决于前面排队的帧长总和一帧经典CAN标准帧大约占130到150位时间取决于数据场长度在500kbps下就是260到300微秒。看起来不大但如果你控制环路周期是5ms这几个帧排队的时间就是不可忽视的百分比。处理仲裁延迟一是增大低优先级报文的周期或者拆分数据长度二是做发送时刻表优化也就是常说的“相位错开”。很多ECU的CAN发送逻辑只是简单地在定时器里到点就发完全没有错峰意识导致每帧都跟别人抢。你可以在CANalyzer上打开“实时总线运行”视图观察各帧实际到达时刻的分布图很容易看出扎堆情况。4.3 调度抖动与中断抢占软件定时器有没有“准点发车”抖动还大量藏在发送节点的软件调度里。很多ECU是用一个基础定时器驱动周期性任务来发送CAN报文但任务的优先级设计不合理比如被其他任务抢占、或者定时器中断和主循环任务同步不好发帧的时间戳就会比预期的晚。我举一个实际案例某ECU用FreeRTOSCAN发送任务优先级设成2但有一个传感器读取任务优先级设成3且每次执行要占80us任务调度时CAN发送被打断帧发出时间晚了几十微秒到上百微秒不等。从接收端看报文的time stamp就是一路抖动。这类问题的排查手段比较直接在发送节点里用逻辑分析仪抓一下发送定时器触发的IO翻转信号和总线上的实际帧时间戳对比偏差值就是调度抖动。处理上要么提升发送任务优先级要么把CAN发送放到高优先级的定时器中断里。4.4 时钟漂移标称相同波特率的两个节点其实没同步这是很多工程师没意识到的问题。CAN的位时序是基于节点本地时钟两帧之间的时间长度完全取决于两个节点的晶振误差。比如一个节点晶振精度是±0.5%另一个是±0.2%10ms周期报文积累下来两帧到达间隔的期望值会在9.95ms到10.05ms之间飘。如果总线很长、帧很多这个漂移还会叠加在仲裁延迟和软件调度延迟上。时钟漂移引起的抖动单看一两帧感觉不出问题但用统计工具算长时间的平均间隔就能发现它有规律地在10ms上下波动。处理上提升晶振精度当然有作用但更实际的做法是让接收端不要完全依赖绝对周期而是用滑动窗口计算平均周期再结合允许误差范围做个动态判断也就是把时间基准从“硬同步”转为“软同步”。4.5 采样点与位时序抖动隐患在物理层就埋下了位时序设置不当是经典的“看起来一切正常但就是有零星错误”的元凶。CAN控制器在每位时间里采样总线电平采样点在位时间的75%左右比较理想。如果采样点太靠前总线信号在长线缆的延迟还没有稳定采样到的可能是跳变沿导致误判为错误位如果太靠后接近下一位的开始也容易采到边缘。换一个角度理解CAN总线上每个节点都用本地时钟来采样节点间的晶振差异累计到每位上会造成采样点偏移。采样点放在75%左右就给这种偏移留下了最充足的安全余量。实用经验是在项目初期就把总线各节点的采样点统一配到75%~80%的范围内不要各配各的。实测过一个车队两辆车用了不同版本的固件采样点一个在65%一个在80%单独跑都没问题两车的总线互连后偶发CRC错误调成统一75%后错误帧消失。4.6 用工具量化不要只靠感觉说“有点抖”排查抖动的第一步是把它量化。具体做法是把总线抓包数据按报文ID分组计算每个到达间隔的均值、标准差、最大值和最小值。CANoe里有现成的统计窗口能直接显示每个报文的最小间隔、最大间隔、平均间隔、间隔标准差。PCAN的第三方软件也能通过导出CSV再做分析用Excel或者简单的Python脚本算一下标准差一目了然。时间戳精度很关键。用MCU内部软件时间戳来统计抖动没有意义精度太差得用硬件时间戳。Vector的VN系列接口卡硬件时间戳精度在10微秒量级测量毫秒级的抖动完全够用。如果手头只有不带硬件时间戳的廉价工具那你测出来的“抖动”可能有一大半是工具自己引入的测了也是白测。5. 应用层容错设计的实操方案把车规级的“容错”落到实处5.1 区分“帧丢失”与“信号超时”是容错设计的第一步处理CAN报文异常应用层设计必须先做两个概念的切割帧丢失和信号超时是不同的东西应对方式完全不同。帧丢失指接收节点在一段时间内完全没有收到某个ID的任何一帧可以判定为通信链路故障信号超时指接收到了帧但帧内某个信号的值已经失效比如因为上游传感器更新周期变慢导致信号携带的还是旧值。这个区分很重要因为很多应用层故障处理逻辑把两者混在一起一报超时就把信号清零、置故障码。结果传感器只是暂时更新慢了一点应用层却把整车切到降级模式故障扩大化。我在做底盘域控制器时收到的需求明确写着连续3帧没收到报文判定通信超时但信号值保持最后有效值连续5帧没收到才判定通信故障进入降级状态。这种设计比那种一帧没收到就跳降级的策略要稳健得多。5.2 超时阈值与失效安全值从“3帧原则”说起“3帧原则”是工程上比较通行的做法一个新信号到达后把它标记为有效如果连续3个周期没有新的更新宣布该信号超时在应用层使用预先定义的替代值。为什么是3因为1帧的间隔波动太正常了仲裁延迟、时钟漂移、调度抖动都可能让某一帧晚到但绝对不会连续3帧都晚到——除非真的出问题了。替代值的设计也要讲究不能想当然地设成0。比如车速信号超时替代值设成0意味着“认为车停住了”在巡航控制里可能触发急刹车更好的做法是保持最后有效值同时置一个超时标志让上层控制策略自行决定怎么处理。如果信号用于安全功能比如AEB的目标碰撞时间建议把替代值设成一个极大或者极小值让算法能识别出这个数据不可信而不是当成一个正常值参与计算。5.3 状态机设计初始化、正常、降级、故障四态切换一个健壮的接收节点信号状态至少要有四个状态初始化、正常、降级、故障。初始化状态发生在ECU上电后还没收到第一帧有效报文时此时所有信号都标为不可信正常状态表示通信稳定、信号有效降级状态表示已经检测到偶发超时或丢帧但还在可接受范围内仍输出最后有效值故障状态表示通信严重异常必须触发告警或者关闭依赖该信号的功能。状态切换的触发条件要有滞回特性避免边界抖动导致状态反复跳变。也就是说从正常降级到降级状态可能只需要连续丢2帧但从降级回到正常需要连续收到5帧。这个滞回设计看起来简单但很多项目没有做导致故障码时而出现时而消失给售后带来大量误判。5.4 诊断报文超时UDS P2与J1939 TP超时别搞混诊断场景下的超时处理和普通周期报文有本质区别。UDS诊断请求发出后服务器应该在50msP2内给出响应如果预计要更长时间必须先回复一个NRC 0x78。但要注意P2是“目标时间”不是说超过50ms客户端就可以直接判定失败。客户端往往设置了P2*默认5000ms作为硬超时门槛P2只是触发“继续等待”状态的参考阀值。商用车领域常用的J1939传输协议TP超时逻辑也容易踩坑。TP.CM报文发出后应该在200ms内收到对方的TP.CM或TP.DT响应TP.DT的每个数据包之间不应超过750ms否则传输中段。很多工程师把这两组超时值记混导致调了很久的UDS多帧传输很稳定但J1939的跨包传输却总在最后几包掉链子。我的建议是建一个超时参数表按协议类型、阶段、超时值三列维护联调时查表避免拍脑袋。5.5 用CAPL在CANoe里做超时、丢包、抖动监控我在项目里是这么写的手动抓包看到问题是一回事整车跑路试时不可能全程盯屏幕这时就得靠脚本自动统计。我用CAPL写过一套监控逻辑核心思路不算复杂在on message事件里对每个关心的报文ID维护上次到达时间戳每次来新帧时计算间隔超过阈值就记录log并累计次数另外用定时器每10秒生成一次统计报告把丢帧率、超时次数、间隔标准差打出来。on message 0x0F0 { if (this.msgChannel 1) { tNow timeNow(); tDelta tNow - lastArrival[0x0F0]; if (tDelta 30) // 10ms周期报文阈值设30ms { timeoutCount[0x0F0]; write(0x0F0 timeout, delta%d ms, tDelta); } if (tDelta 5 || tDelta 50) // 明显异常间隔 { jitterCount[0x0F0]; } lastArrival[0x0F0] tNow; } }这套脚本跑起来的价值是能连续跑几个小时甚至一整天把偶发的超时事件全部记录下来。有一次我就靠它抓到一个每37分钟发生一次的超时间隔非常规律顺着规律找到源头是某个ECU内部有一个周期性执行的长任务在处理Flash擦写时把CAN中断阻塞了。5.6 多节点联调时的检查清单少走弯路的个人习惯最后整理一份多节点联调前我会先过一遍的检查清单这些项看着基础但出问题最多的就是这里。第一所有节点的CAN收发器型号是否一致至少波特率和采样点设置要在同一容忍范围第二终端电阻是否真的在总线两端且阻值正确别把中间节点的120Ω误当终端第三验收滤波配置是否覆盖了所有需要接收的ID第四发送节点是否实现了错误状态读取功能至少在调试阶段要把错误计数器暴露出来第五应用层超时阈值是否统一不同模块对同一信号的超时判定标准要一致第六各节点的时钟源精度是否满足需求普通晶振就是±100ppm以内要求高的用温补晶振。这六项检查完至少能解决80%看起来莫名其妙的超时丢包抖动问题。剩下20%就需要靠长时间数据记录和故障复现来定位了。坦白讲CAN总线这套东西跑通容易跑稳难跑得让别人挑不出毛病更难。很多问题回头来看都不是“硬件坏了”或者“协议不行”而是我们对协议那套容错机制的理解还不够深导致在设计阶段没有给容错留出足够的空间。把协议想明白把应用层的容忍度设计好绝大多数“假故障”都能在设计阶段就被消化掉。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价