大家都知道,CAN总线的负载率计算里,帧结构和帧间空间都是必须要算进去的。这篇文章就把这两块儿彻底讲透,并且搭配实战,给你一个直观的解析。 咱们先从经典CAN帧的长度说起。不管是Standard Frame还是Extended Frame,Classic CAN的帧都由7段组成:SOF、arbitration field、control field、data field、CRC、ACK和EOF。标准帧总共占108 bit,扩展帧则占128 bit。多出来的16 bit仲裁段是专门给扩展帧用的,它能支持更大的CAN ID。 帧和帧之间肯定得留个“冷静期”,这就是Interframe space。数据帧、远程帧、过载帧还有错误帧之间都得插进去一段,好把不同的传输单元分隔开。不过过载帧和错误帧前面不能有空隙,而且多个过载帧之间也不能有空当。 Intermission这一块儿是3个隐性位组成的红灯,这期间任何节点都不能去抢占总线。如果在第3个隐性位检测到显性电平,就说明新的SOF来了。Bus idle是绿灯期,时间长短随意,只要检测到显性电平就把它当成新的SOF,后面的数据立马就发。如果前一帧的发送方是个error-passive节点,还得在这个空档后面再补8个隐性位的“缓刑期”,免得它又抢线。 知道单帧占线有多长后,就得把帧间隔算进去。正常发送流程里,一帧结束后起码得保留3个隐性位。根据这个道理,我们能算两种负载率。 标准帧就是108 bit加3 bit间隔,一共111 bit;扩展帧是128 bit加3 bit间隔,总共131 bit。每秒发n帧的时候,理论负载率就是n乘以111再除以500 000取百分比,或者n乘以131再除以500 000取百分比。 手头要是有DBC/ARXML文件的话,还能把这个公式搞得更简便。你只需要统计一下各个CAN ID的发送周期和数据长度,套进那个公式:负载率等于每个帧长度除以(波特率乘周期)的总和再乘以100%,最后把所有ID加一块儿就能算出网络的峰值负载。 拿到CAN Trace Log以后也能搞个仪表盘出来看实时情况。统计一下1秒里发了多少帧和多少总bit数,直接套用上面的公式就能粗略算出负载率了。