3.1 经典CAN帧结构逐字段拆解 本节摘要:本章从帧结构开始。本节把标准数据帧从帧首到帧尾逐字段摊开,讲清每个字段的位数与职责,顺带把位填充规则并入——填充不是独立机制,而是为帧结构服务的边沿保障。学完本节,任何一帧经典CAN报文在你眼中都不再是黑盒。 把帧摊开,CAN共有帧类型:数据帧、远程帧、错误帧、过载帧。工程中百分之九十九的流量是数据帧,本节以它为主线;远程帧在现代车载网络中已很少使用,错误帧留给第4章。拆解的标准数据帧包括帧首、仲裁场、控制场、数据场、校验场、应答场、帧尾与帧间空间,下面按发送顺序逐段过。 帧的解剖图 先给全景。一帧标准数据帧(十一位标识符版本)的字段序列如下表,括号内为位数。 图3-1 标准数据帧字段序列 图3-1 标准数据帧字段序列 逐个字段过一遍。
本节摘要:本章从帧结构开始。本节把标准数据帧从帧首到帧尾逐字段摊开,讲清每个字段的位数与职责,顺带把位填充规则并入——填充不是独立机制,而是为帧结构服务的边沿保障。学完本节,任何一帧经典CAN报文在你眼中都不再是黑盒。
把帧摊开,CAN共有帧类型:数据帧、远程帧、错误帧、过载帧。工程中百分之九十九的流量是数据帧,本节以它为主线;远程帧在现代车载网络中已很少使用,错误帧留给第4章。拆解的标准数据帧包括帧首、仲裁场、控制场、数据场、校验场、应答场、帧尾与帧间空间,下面按发送顺序逐段过。
先给全景。一帧标准数据帧(十一位标识符版本)的字段序列如下表,括号内为位数。

逐个字段过一遍。帧首是一个显性位,作用类似会场主持人敲桌:全总线由此对齐位边界(第2章的硬同步就发生在这里)。仲裁场携带十一位标识符加一位远程请求标志;标识符既是报文身份也是优先级,数值越小优先级越高。控制场里最重要的是四位数据长度码,取值零到八,声明数据场的字节数。数据场是有效载荷,长度必须与长度码一致,这是格式检查的对象之一。校验场用十五位循环冗余校验保护帧首到数据场的全部内容,后随一位隐性定界符。应答场包含一位应答槽加一位定界符:接收成功的节点在应答槽输出显性,发送方读到显性即确认至少有一个接收者。帧尾为七位连续隐性,加上帧间空间的三位隐性,凑足十个隐性位才允许发送下一帧。
扩展帧的差异只在仲裁场:标识符扩到二十九位,并用替代远程请求位与标识符扩展位两根"旗杆"声明格式。控制器靠这两位区分十一位与二十九位帧,因此两者可在同一总线共存——但同一条报文绝不允许在两种格式间随意切换,混用会让滤波器配置成倍复杂,工程规范通常规定一个网络只用一种格式。
CAN采用非归零编码,比特值不体现在跳变上,同步只能依靠位边沿。如果一长串同值比特连续出现,总线上没有边沿,接收方的重同步就失去输入,晶振偏差会持续累积。位填充的对策简单粗暴:发送方在连续五个同值比特后自动插入一个反值比特,接收方自动剔除。规则适用于帧首到校验场序列的全段;CRC定界符之后不再填充,帧尾的七个隐性位靠帧间空间的保证维持长度语义。
填充有两个容易被忽视的工程影响。其一,帧长不确定:同一标识符的报文,因数据内容不同,填充位数不同,总传输位数在某个区间内浮动——做负载率估算时要用最坏情况(这一笔账第5章细算)。其二,排错时的信号特征:错误帧计数暴增而示波器波形看似正常时,填充错误是嫌疑之一,它往往指向采样点偏差或干扰,而不是数据内容。
背景:调试台上抓到一帧报文,candump 显示 can0 0x1A8 [8] 07 D0 11 00 00 00 00 FF,需要确认它符合帧结构预期。操作:0x1A8 是十一位标识符的十六进制记法,展开为二进制是 001 1010 1000,首位是零,说明标识符最高位先发显性——这是电机控制类报文常见的中高优先级区间;数据场八字节,第一个字节 07 D0 若按大端十六位解析是两千,乘以缩放因子零点零一就是每分钟二十转的实际转速量级(具体缩放由DBC定义,第3.3节实战)。结果:字段完整、长度码与数据场一致,帧本身无异常。解读:手工拆解的价值不在于算得多快,而在于面对异常报文时能逐字段定位——长度码与实际不符是格式错误,标识符不在分配表内是配置错误,数据场数值超物理范围是发送方软件错误。变式:如果抓到 0x1A8 [2] 07 D0 这样的短数据场,别急着判错——长度码声明为二,总线逻辑上完全合法,多半是同一标识符承载了多种可变长消息,需要查通信矩阵确认。
数据帧之外还有两种低存在感的帧类型。远程帧:与数据帧同构但数据场为零,远程请求位置一,含义是"持有此标识符数据的节点,请发送该数据"。它设计于集中轮询的场景,如今在车载网络里几乎绝迹——现代矩阵直接让数据持有者周期广播,不再需要拉取式请求,一来省去等待,二来避免远程帧与数据帧的仲裁竞争。读老资料时别被它迷惑,新平台设计里可以当它不存在。
过载帧:接收方来不及处理时插入的总线"暂停"信号,结构是显性标志加定界符。它的存在感同样在下降——现代控制器处理能力远超总线速率,过载场景罕见,规范也严格限制其使用条件,防止接收方滥用它霸占总线。认识它的意义主要在于读协议文档与排查历史设计,新项目不必为它预留任何精力。
配角讲完,回头补一个数据帧的细节:数据场字节的发送顺序是先高字节后低字节(大端基调),但信号在字节内的位排布由通信矩阵自定——这正是3.3节字节序问题的协议根源。协议只保证"字节按序完整到达",字节之内怎么解释,是矩阵与DBC的事。分清这两层,帧结构的知识才算闭环。
最后给一个工程速算:标准帧八字节加较坏填充,全帧约一百三十到一百三十五位;在五百千比特速率下,一帧占用约零点二六毫秒。这个数字建议背下来——评估任何新报文对总线的冲击,先用它乘频率得出粗略占用率,再决定是否需要精确计算。速算与精算的关系,就像估尺与卡尺:方向判断用前者,交付承诺用后者。本节与3.3、5.3两节连起来看:帧长决定单帧时间,帧数决定负载水位,三节共享同一套位算术。
顺带一个字段记忆窍门:把帧尾加帧间空间的十位隐性看作"会场散会间隔"——它保证所有节点都确认帧已结束、总线已空闲,随后才轮到下一轮发言。把每个字段的位数与作用挂在这个会场景象上,帧结构就不需要死记。复习时可以自测:合上资料,默画一遍从帧首到帧尾的字段序列,再对照本节的解剖图查漏——能默画的人,才具备在无工具环境下判断报文合法性的能力。
帧的长相清楚了。下一章看动态:当两个节点同时把帧发上线,总线如何在不损一帧的前提下分出先后。