想象你正和一群朋友围着一口电磁炉吃火锅。没有主持人,谁想吃什么就喊什么。可当两个人同时喊“我要毛肚!”“我要白菜!”时,为什么不会真吵起来?因为大家心里有一条默契:嗓门更大、菜名更“硬”的人先得,输的人立刻收声,下一轮再抢。更妙的是,赢家从头到尾没有被真正打断,他说的每一个字都算数。这口“共享火锅”就是汽车里的 CAN 总线——发动机、刹车、车窗、气囊等几十个电子控制单元,共享两根细电线,想发数据就发,七嘴八舌却从不乱套。本文从差分信号讲起,一路走过帧结构、仲裁、错误处理、CAN FD 扩展,最后抵达自动驾驶域控的现代车载网络。

岗位关联

掌握 CAN 总线,是读懂汽车电子与工业控制的一把钥匙:从底层差分信号到上层报文协议再到域控架构,它连接起硬件工程师与软件工程师共同的语言。

目录
  1. 可视化演示
  2. 一、差分信号与总线
  3. 二、报文帧与ID
  4. 三、仲裁机制
  5. 四、错误检测处理
  6. 五、CAN FD扩展
  7. 六、车载域控演进
  8. 七、工程实践要点
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

一、差分信号与总线

火锅的锅底是所有菜共同的家。锅里花椒、辣椒、蒜末翻滚,电磁干扰无处不在,为什么每个人夹出来的味道都一致?因为大家不是直接“尝”锅底,而是对比两双筷子蘸出来的汤色——外界再怎么晃,两个筷尖的汤色差保持不变。这就是差分信号的精髓。

CAN 总线的“锅底”是两根绞在一起的导线,分别叫 CANH 与 CANL。发送端让一根升高、一根降低;接收端不看某根线的绝对电压,只看两者的差值。于是火花塞点火、手机辐射这些“共模噪声”同时压到两根线上时,差值纹丝不动,数据依旧清晰。

拓扑上,所有节点像围坐的食客一样并联挂在这两根线上,谁都可以随时开口,这就是“多主共享总线”。锅底是大家的,规则也是大家的——只要两双筷子一起蘸汤、比差值,锅底再浑,捞上来的味道依然稳得住。

Vdiff=VCANH−VCANL\displaystyle V_{\text{diff}} = V_{\text{CANH}} - V_{\text{CANL}}
  1. CANH 引脚电压CANH 是总线上的一根导线,发送显性位时它被拉高到约 3.5V。
    VCANH\displaystyle V_{\text{CANH}}
  2. CANL 引脚电压CANL 是另一根镜像导线,发送显性位时被拉到约 1.5V。
    VCANL\displaystyle V_{\text{CANL}}
  3. 做差求差分电压接收端把两引脚电压相减,差值才是真正的有效信号。
    Vdiff=VCANH−VCANL\displaystyle V_{\text{diff}} = V_{\text{CANH}} - V_{\text{CANL}}
  4. 阈值判定逻辑位差值约 2V 判为显性位(逻辑 0),约 0V 判为隐性位(逻辑 1)。
    Vdiff≈2 V⇒0;Vdiff≈0 V⇒1\displaystyle V_{\text{diff}} \approx 2\,\text{V} \Rightarrow 0;\quad V_{\text{diff}} \approx 0\,\text{V} \Rightarrow 1

二、报文帧与ID

下锅的每道菜都带一张“名牌”——毛肚、鹅肠、虾滑。跑堂的先把牌子亮给全桌看,大家才知道这是什么菜、值不值得动筷子。在 CAN 里,这个名牌就是帧 ID,它既是菜名,也是上菜顺序的依据。

CAN 报文以帧为单位,标准帧用 11 位 ID,扩展帧用 29 位 ID。一帧从“起锅”的起始位 SOF 开始,依次经过仲裁场(放 ID)、控制场(放 DLC 数据长度码)、数据场(放真正的数据)、CRC 场(放校验暗号)、应答场,最后以 EOF 收尾。

菜盘子的尺寸是固定的,想多上菜就多喊几盘;而哪盘菜先上,看的是名牌上的数字——数字越小,越先端上桌。

Lstd=44+8N(0≤N≤8)\displaystyle L_{\text{std}} = 44 + 8N \quad (0 \le N \le 8)
44 位是标准帧固定开销,N 是数据场字节数,8N 是数据占用的位数。
  1. 固定开销 44 位由起始位、ID、控制位、CRC、应答、帧结束等固定段构成。
    44=1+11+1+1+1+4+15+1+2+7\displaystyle 44 = 1 + 11 + 1 + 1 + 1 + 4 + 15 + 1 + 2 + 7
  2. 数据场字节数 N控制场里的 DLC 字段用 4 位二进制表示数据场长度,范围 0 到 8。
    N=DLC∈[0,8]\displaystyle N = \text{DLC} \in [0, 8]
  3. 数据位 8N每个数据字节占 8 位,N 个字节共占 8N 位。
    数据位=8×N\displaystyle \text{数据位} = 8 \times N
  4. 相加得总帧长固定开销与数据位相加,最大帧长为 44+64=108 位。
    Lstd=44+8N→N=8108\displaystyle L_{\text{std}} = 44 + 8N \xrightarrow{N=8} 108

三、仲裁机制

两个人同时喊“我要毛肚!”“我要白菜!”时,全桌听到的不是一团乱麻,而是自动分出先后。秘密在名字的“硬”度上:在 CAN 里,越“硬”的声音是显性位 0,它总能压过隐性位 1;谁的 ID 数值更小,谁就先用总线。

仲裁就发生在帧最前面的 ID 位上。所有同时发送的节点从 ID 最高位开始逐位较量:只要自己发出的位被对方的显性位覆盖,这个节点立刻知道自己抢输了,马上收声转为接收,而赢家浑然不觉,继续说完剩下的所有位。

抢输的食客不会尴尬,他只是在心里记下“这轮轮到别人”,等这盘菜端完,下一盘他有的是机会再抢——火锅的热闹永远不会因为一次谦让而冷场。

IDwinner=min⁡{ID1,ID2,…,IDM}\displaystyle ID_{\text{winner}} = \min\{ID_1, ID_2, \ldots, ID_M\}
同时抢发的 M 个节点中,帧 ID 数值最小的节点赢得总线使用权。
  1. 列出竞争者把同一时刻抢发的一组节点的帧 ID 收集起来。
    {ID1,ID2,…,IDM}\displaystyle \{ID_1, ID_2, \ldots, ID_M\}
  2. 逐位比较从最高位向最低位逐位展开,显性位 0 覆盖隐性位 1。
    bt=min⁡(b1,t, b2,t, …, bM,t)\displaystyle b_t = \min(b_{1,t},\, b_{2,t},\, \ldots,\, b_{M,t})
  3. 取最小值第一个发出 0 的节点赢得仲裁,其余节点在该位之后收声。
    IDwinner=min⁡{⋅}\displaystyle ID_{\text{winner}} = \min\{\cdot\}
  4. 胜者无损继续赢家已发出的帧头位全部有效,无需重发任何数据。
    非破坏性:胜者帧=完整帧\displaystyle \text{非破坏性}: \text{胜者帧} = \text{完整帧}

四、错误检测处理

上菜时如果把“毛肚”听成“牛肚”,全桌都会察觉不对。CAN 做得更严格:每盘菜端出前先对一遍“暗号清单”,任何一位食客发现暗号对不上,整桌人立刻喊“这盘别动!”——这句喊话就是错误帧。

CAN 通过五类检查揪出错数据:位错误、填充错误、CRC 错误、格式错误、应答错误。任一节点发现异常,就发出由连续 6 个显性位构成错误标志位的错误帧,强迫所有节点丢弃当前帧,总线恢复空闲后由发送节点自动重传。

为了不让“惯犯”反复捣乱,每个节点还有两个计数器:发送错误计数 TEC 与接收错误计数 REC。发送出错惩罚重,接收出错惩罚轻;成功则递减。一旦 TEC 超过 255,节点被判定为故障源,进入 Bus-Off 离线状态,彻底与总线隔离:

一盘菜上桌前,全桌人都是质检员;一旦有人喊“重说”,这盘就作废重来。爱出错的食客会被大家暂时隔离,等它冷静下来再回到桌前继续吃。

G(x)=x15+x14+x10+x8+x7+x4+x3+1\displaystyle G(x) = x^{15} + x^{14} + x^{10} + x^8 + x^7 + x^4 + x^3 + 1
错误计数越高说明惹祸越多;TEC 超过 255 的节点会被请出“火锅桌”,防止它祸害全桌。
  1. 发送错误重罚发送节点是噪声源,一次错误加 8,快速暴露问题。
    TEC←TEC+8\displaystyle TEC \leftarrow TEC + 8
  2. 接收错误轻罚接收出错只加 1,给普通节点一定的容错空间。
    REC←REC+1\displaystyle REC \leftarrow REC + 1
  3. 成功递减恢复收发成功后计数器自动回退,给节点改过自新的机会。
    TEC←max⁡(0, TEC−1),REC←max⁡(0, REC−1)\displaystyle TEC \leftarrow \max(0,\, TEC - 1),\quad REC \leftarrow \max(0,\, REC - 1)
  4. 超限离线隔离TEC 超过 255 进入 Bus-Off,相当于被暂时请出火锅桌。
    TEC>255⇒Bus-Off\displaystyle TEC > 255 \Rightarrow \text{Bus-Off}

五、CAN FD扩展

老火锅店升级了锅具:抢菜时还是原来的嗓门和音量,但一旦菜确定归你,涮菜的火力可以瞬间开到最大。这就是 CAN FD 的“一锅两火”——仲裁段保持不变,数据段尽情加速。

经典 CAN 每帧最多带 8 字节数据,速率上限约 1 Mbps,在自动驾驶时代显得“菜量太小”。CAN FD(灵活数据速率)保留经典 CAN 的仲裁机制,却在数据段切换更高波特率,并把数据场一口气扩到最多 64 字节。

锅还是那口锅,规矩还是那个规矩,只是端菜的人换了更大的托盘、跑得更快——一桌人吃饭的效率直接上了台阶,而老食客依然坐在原来的位子上。

NFD≤64 字节,fdata=k×farbitration(k=2,4,8)\displaystyle N_{\text{FD}} \le 64\ \text{字节},\qquad f_{\text{data}} = k \times f_{\text{arbitration}} \quad (k = 2, 4, 8)
数据场最多 64 字节;数据段波特率是仲裁段的 2、4 或 8 倍。
  1. 数据场上限CAN FD 把数据场从 8 字节扩展到最多 64 字节。
    NFD≤64\displaystyle N_{\text{FD}} \le 64
  2. 速率倍率数据段波特率是仲裁段的整数倍,倍率 k 取 2、4 或 8。
    fdata=k×farbitration\displaystyle f_{\text{data}} = k \times f_{\text{arbitration}}
  3. 切换时机发送端在 BRS 位之后立刻提速,在 CRC 定界符前降回原速。
    farb→BRS 位fdata→CRC 定界farb\displaystyle f_{\text{arb}} \xrightarrow{\text{BRS 位}} f_{\text{data}} \xrightarrow{\text{CRC 定界}} f_{\text{arb}}
  4. 兼容保障仲裁段规则不变,经典 CAN 节点能与 FD 节点共存于同一总线。
    仲裁段:经典 CAN 节点可正常识别\displaystyle \text{仲裁段}: \text{经典 CAN 节点可正常识别}

六、车载域控演进

老火锅店只有一桌,所有人隔着锅喊话就能交流。可当店里坐满几十桌客人时,不能再靠满堂对喊了——得分成几桌,每桌设一位“桌长”,桌长之间传菜、对菜单。这就是现代车载网络从“分布式 ECU”走向“域控制器”的演进。

传统汽车里几十个电子控制单元(ECU)通过 CAN 总线各自为战,线束又多又重,总线带宽也很紧张。新一代架构按功能划分为动力域、底盘域、座舱域、智驾域,每个域控制器先把域内的 CAN 信号汇总,再通过车载以太网骨干与其它域互联。

桌长们用新式电话互通有无,但每桌内部的“报菜名”依旧守着 CAN 的老规矩。网关负责翻译与转发,让传统与创新在同一家店里共生——这正是汽车电子从机械走向智能的真实骨架。

U=∑i(Li×fi)B×100%\displaystyle U = \frac{\sum_{i} (L_i \times f_i)}{B} \times 100\%
分子是所有报文每秒占用的总位数,分母是总线波特率,两者相除即总线利用率。
  1. 单帧位长第 i 条报文的帧长度(位),由帧结构与数据长度决定。
    Li\displaystyle L_i
  2. 发送频率该报文每秒发送的次数,周期型报文取周期的倒数。
    fi=1Ti\displaystyle f_i = \frac{1}{T_i}
  3. 累计总负载把所有报文每秒占用的位数加在一起。
    ∑i(Li×fi)\displaystyle \sum_{i} (L_i \times f_i)
  4. 换算利用率除以总线波特率 B,得到百分比形式的利用率。
    U=∑i(Li×fi)B×100%\displaystyle U = \frac{\sum_{i} (L_i \times f_i)}{B} \times 100\%

七、工程实践要点

火锅的电磁炉插头必须和锅具匹配,接口松动就会“滋啦”起火花、火候忽大忽小。工程里总线末端要是没接对电阻,信号同样会在线头反弹、振铃,搅得整桌人不得安宁。

高速 CAN 要求总线两端各接一只 120Ω 终端电阻,与双绞线的特征阻抗匹配,让信号到达线端时被“吸收”而不是被反弹。反射的强弱用反射系数来衡量:

回到火锅店:锅具匹配,火候才稳;线端匹配,总线才安静。工程师还要把采样点设在位时间的 70%—85% 之间以避开边沿抖动,用 CAN 分析仪抓包观察 ID、DLC、CRC 错误与错误帧计数;工业自动化里的 CANopen 同样沿用这套“火锅规则”,让机器人、PLC、传感器在一条生产线上七嘴八舌却井然有序。

Γ=ZL−Z0ZL+Z0→ZL=Z00\displaystyle \Gamma = \frac{Z_L - Z_0}{Z_L + Z_0} \quad\xrightarrow{Z_L = Z_0}\quad 0
负载阻抗等于特征阻抗时,反射系数为 0,信号无反弹。
  1. 特征阻抗 Z0双绞线本身的特性阻抗,高速 CAN 约定约 120Ω。
    Z0=120 Ω\displaystyle Z_0 = 120\,\Omega
  2. 负载阻抗 ZL线端所接终端电阻的阻值。
    ZL=Rterm\displaystyle Z_L = R_{\text{term}}
  3. 反射系数公式差值比上总和,匹配时分子为 0。
    Γ=ZL−Z0ZL+Z0\displaystyle \Gamma = \frac{Z_L - Z_0}{Z_L + Z_0}
  4. 匹配即安静Z_L 等于 Z_0 时信号被全部吸收,无振铃、无误码。
    ZL=Z0⇒Γ=0\displaystyle Z_L = Z_0 \Rightarrow \Gamma = 0

AI 应用场景

车载数据采集:给 AI 模型喂真实路谱

阶段:数据采集

解决的问题:传统靠人工记录驾驶数据费时且样本片面;通过 OBD 接口接 CAN 记录仪,可自动采集车速、油门开度、转向角、轮速等几十路信号,为驾驶行为分类、能耗优化等 AI 模型提供海量真实数据。就像在火锅桌上装了一台“点菜记录仪”,把每个人的口味偏好都完整记下来。

具体案例:某新能源车企在 20 辆验证车上部署 CAN 记录仪,一周采集 1200 小时真实路谱,训练出的能耗预测模型误差从 12% 降到 5%。

车队故障预警:让 AI 当全天候质检员

阶段:数据分析与建模

解决的问题:机械故障早期征兆难察觉,等仪表盘亮灯往往已造成损坏。CAN 报文持续上报发动机转速、扭矩、油温等信号,把这些时间序列喂给异常检测模型,就像全桌质检员随时比对“菜色暗号”,提前闻出异味。

具体案例:某物流车队把 CAN 数据经 4G 上云,训练异常检测模型,提前 3 天预警变速箱油温异常,非计划停车率下降 40%。

自动驾驶域控:CAN 与视觉的“桌长”对齐

阶段:模型部署与推理

解决的问题:自动驾驶需要把摄像头、激光雷达与底盘 CAN 信号在时间上对齐;域控制器作为“桌长”,在跑推理模型的同时读取 CAN 上报的轮速、转向角、挡位作为关键状态输入,实现稳定跟车与变道。

具体案例:某 L2+ 智驾系统在域控制器上融合 CAN 轮速与视觉目标框,雨夜场景误触发率下降 60%。

Python 演示

python44 行
# -*- coding: utf-8 -*-"""CAN 总线小模拟器: 帧构造 + CRC15 校验 + 非破坏性仲裁演示.""" CRC15_POLY = 0x4599  # CAN CRC-15 多项式 class CanFrame:    def __init__(self, fid, data):        self.id = fid & 0x7FF          # 11 位帧 ID        self.data = bytes(data)        # 数据场        self.crc = self.calc_crc15()   # 发送端计算的 CRC     def calc_crc15(self):        """对 ID 与数据做模 2 除法, 求 15 位 CRC 余数."""        msg = (self.id << 8) | self.data[0]        msg <<= 15                     # 左移 15 位, 为余数留空间        poly = (1 << 15) | CRC15_POLY  # 补上 x^15 项, 形成完整多项式        while msg.bit_length() > 15:            shift = msg.bit_length() - 16            msg ^= poly << shift       # 消去当前最高位        return msg     def valid(self, crc_rx):        """接收端把收到 CRC 与本地重算结果比对."""        return self.crc == crc_rx  def arbitrate(frames):    """仲裁胜出者: 显性位优先, 等价于 ID 最小者胜出."""    return min(frames, key=lambda f: f.id)  def main():    f_a = CanFrame(0x123, [0xAA, 0x55])    f_b = CanFrame(0x045, [0x01, 0x02])    f_c = CanFrame(0x2A0, [0x10, 0x20])    winner = arbitrate([f_a, f_b, f_c])    print("仲裁胜出 ID = 0x%03X, 其余节点收声" % winner.id)    print("CRC = 0x%04X, 校验通过: %s" % (winner.crc, winner.valid(winner.crc)))    bad_crc = winner.crc ^ 0x01       # 模拟一位翻转    print("一位翻转后校验通过: %s, 应触发错误帧" % winner.valid(bad_crc))  if __name__ == "__main__":    main()
目的:演示 CAN 帧的 CRC15 计算与非破坏性仲裁——先构造三帧报文,仲裁选出 ID 最小者,再验证一位翻转即可触发错误帧。
  1. CRC15_POLY = 0x4599 # CAN CRC-15 多项式生成多项式的低位部分,决定“暗号”的生成规则。
  2. self.id = fid & 0x7FF # 11 位帧 ID用掩码截取低 11 位,模拟标准帧的 11 位 ID。
  3. msg = (self.id << 8) | self.data[0]把 11 位 ID 和首个数据字节拼成比特流,代表“这盘菜的内容”。
  4. msg <<= 15左移 15 位给余数留空间,相当于模 2 除法里的“补零”。
  5. poly = (1 << 15) | CRC15_POLY把缺失的 x^15 项补回,凑成完整生成多项式。
  6. msg ^= poly << shift用异或做模 2 减法,逐位消去最高位,直到余数不足 15 位。
  7. return min(frames, key=lambda f: f.id)直接取 ID 最小的帧作胜者,模拟非破坏性位仲裁的最终结果。
  8. bad_crc = winner.crc ^ 0x01把 CRC 最低位翻转,模拟传输中的一位错误。

常见误区

误区差分信号就是两根线一起传,断了一根还能用,相当于双机备份。这种“两根线=冗余”的想法很自然,但和 CAN 的实际设计完全相反。

正解差分传输不是冗余备份。两根线传的是互为镜像的电压,接收端只看两者之差;断掉任何一根,差值就没有了,通信立刻失败。它真正抵抗的是共模噪声——外部干扰同时叠加到两根线上,差值保持不变。就像两双筷子伸进同一锅汤再比较味道,少一根筷子就比不了。

为何常见:人们习惯把“两根线”与“一主一备”联想在一起,看到双线就误以为是备份方案。

误区仲裁好比选班长,数字大的更醒目,所以帧 ID 越大优先级越高。这种“大即优先”的直觉在多数场合成立,但在 CAN 里恰好反过来。

正解CAN 中 ID 数值越小优先级越高。因为显性位 0 的电平会覆盖隐性位 1,逐位比较时第一个发出 0 的节点获胜。就像约定“菜名越短越先上”,先开口发 0 的那个人嗓门天然压过发 1 的人。

为何常见:日常生活中“更大的数字代表更高权限”的例子太多(如 VIP 等级),被无意识地迁移到了二进制位序上。

误区一根线连着两个设备,A 发数据只有 B 能收到,类似 USB 线的一对一连接。很多人第一次接触 CAN 时都会这样理解。

正解CAN 是广播式共享总线:所有节点都挂在同一对导线上,任何一帧所有人都能收到,只是各自用 ID 过滤器决定“这盘菜是不是我的”。就像火锅店报菜名整个大厅都听得见,只有点了这道菜的人才动筷子。

为何常见:看惯了 UART、USB 的点对点连线,容易把“连接在同一根线上”误解为“两个设备私聊”。

误区CAN FD 比经典 CAN 快,所以它从仲裁段到数据段全程都在高速运行,整体速率全面提升。

正解CAN FD 只在数据段提高波特率,仲裁段仍保持与经典 CAN 相同的速率和机制,这样才能让老节点在同一总线上听懂“谁在说话”。火锅比喻:抢菜时还是原来的音量和规则,菜确定到手后才开大火快涮。

为何常见:看到“FD 更快”的宣传就脑补全局加速,忽略了协议兼容性设计这一核心前提。

误区错误帧是“错误的数据帧”,里面装着刚才出错的数据,再重新发一次,类似网络里的重传包。

正解错误帧不承载任何数据,它只包含连续 6 个显性位构成的错误标志,作用是公开宣告“这帧别用了”,强制所有节点丢弃当前帧。真正的重传是发送节点在总线空闲后自动执行的,与错误帧是两回事。相当于有人夹到发馊的菜立刻喊“别吃!”,重新上菜是后厨的事。

为何常见:被“帧”字误导,望文生义地以为“错误帧”就是“错误的数据帧”。

面试题

Q1. CAN 总线采用差分信号传输的根本目的是?

单选题 · easy

  • A.提高发送功率
  • B.抵抗共模噪声← 正确答案
  • C.减少线缆成本
  • D.简化收发电路

答案:B。差分信号让两根线互为镜像,外部干扰同时叠加在两根线上,接收端只看差值,共模噪声被自然抵消。它不是为了加大功率、省线或简化电路——就像比两双筷子的汤色差,而不是比哪根筷子蘸得更多。

Q2. CAN 报文中决定帧优先级的核心字段是?

单选题 · easy

  • A.数据长度码
  • B.标识符字段← 正确答案
  • C.校验字段
  • D.应答字段

答案:B。仲裁时逐位比较的就是标识符 ID,ID 数值越小优先级越高。数据长度码只描述数据场大小,校验字段负责验错,应答字段只负责确认——它们都不参与仲裁抢线。

Q3. 两个节点同时抢占总线,最终胜出的是?

单选题 · mid

  • A.先发数据的节点
  • B.ID 最小的节点← 正确答案
  • C.ID 最大的节点
  • D.数据最长的节点

答案:B。非破坏性仲裁逐位比较 ID,显性位 0 覆盖隐性位 1,所以 ID 最小者一路胜出。先发不占优,ID 大和数据长都不构成优势,这是 CAN 与以太网 CSMA/CD 的重要区别。

Q4. 关于非破坏性仲裁,正确的说法有?

多选题 · mid

  • A.胜出者无需重发← 正确答案
  • B.隐性位让位给显性位← 正确答案
  • C.仲裁失败者下轮再试← 正确答案
  • D.仲裁过程破坏报文

答案:ABC。仲裁赢家发出的每一位都原样留在总线上,因此整帧无损、无需重发;隐性位 1 会被显性位 0 覆盖,输家收声等待下轮。仲裁既不破坏报文,也不丢数据,这正是“非破坏性”三个字的含义。

Q5. CAN 协议中发送错误计数(TEC)每次累加的数值是?

单选题 · hard

  • A.每次加 1
  • B.每次加 8← 正确答案
  • C.每次加 16
  • D.每次加 64

答案:B。发送节点是错误的主要制造者,受罚更重,一次发送错误 TEC 加 8;接收节点出错只加 1。这样设计能让故障源快速暴露:就像总上错菜的食客会被更快地记上一笔。

Q6. CAN FD 相对经典 CAN 的增强包括?

多选题 · extreme

  • A.数据场最大 64 字节← 正确答案
  • B.数据段波特率可提升← 正确答案
  • C.仲裁机制保持不变← 正确答案
  • D.单帧长度固定不变

答案:ABC。CAN FD 把数据场从 8 字节扩到 64 字节,并在数据段把波特率提升到仲裁段的 2/4/8 倍;仲裁段保持原规则以保证与经典 CAN 兼容。帧长度随数据长度变化,绝无“固定不变”之说。

Q7. 节点进入 Bus-Off(离线)状态的条件是?

单选题 · mid

  • A.接收错误计数超过 127
  • B.发送错误计数超过 255← 正确答案
  • C.CRC 出现两次错误
  • D.总线出现三次应答失败

答案:B。发送错误计数 TEC 超过 255,协议就把该节点判定为故障源,强制它与总线隔离,防止它反复用错误帧祸害全桌。接收计数达 128 只是“警告”状态,离离线还差得远。

Q8. CAN 高速总线两端通常匹配的终端电阻阻值是?

单选题 · easy

  • A.50 欧姆
  • B.120 欧姆← 正确答案
  • C.330 欧姆
  • D.1k 欧姆

答案:B。高速 CAN 双绞线的特征阻抗约为 120Ω,总线两端各接一只 120Ω 终端电阻可使反射系数为 0,信号到达线端被吸收而不是反弹,避免振铃误码。

Q9. 会触发 CAN 错误帧的场景包括?

多选题 · hard

  • A.CRC 校验失败← 正确答案
  • B.位填充规则被破坏← 正确答案
  • C.应答位处无显性位← 正确答案
  • D.差分电压超过 5V

答案:ABC。协议规定了五类标准错误:位错误、填充错误、CRC 错误、格式错误、应答错误。CRC 对不上、填充规律被破坏、应答槽里没有显性位都属于标准错误场景;差分电压大小本身不直接触发错误帧。

Q10. 总线利用率公式 U=Σ(Li×fi)/B 中,B 代表的是?

单选题 · mid

  • A.单帧数据字节数
  • B.总线波特率← 正确答案
  • C.最大报文长度
  • D.节点数量总和

答案:B。B 是总线每秒可传输的总位数,即波特率;分子是所有报文每秒占用的位数总和,两者相除得到利用率百分比。就像火锅店的翻台率:每秒能上多少菜(B),对比实际被点走的菜量(分子)。