ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

CAN总线从波形到协议:物理层原理与达妙电机关节控制实战

CAN总线从波形到协议:物理层原理与达妙电机关节控制实战 聊到CAN总线搞汽车电子、无人车、机械臂或者四足机器人的人都不会陌生。我当年第一次接触车辆协议时啃完一堆文档还是一头雾水——CAN总线的帧结构看着简单可一旦要面对实车调试、波形判读、电机控制这些具体场景才发现底层原理没搞透后面全是坑。这篇就把CAN总线和车辆协议从物理波形一路讲到应用层重点落在“怎么看波形判断通信好坏”和“达妙电机怎么通过CAN实现精准关节控制”这两个大家问得最多的问题上全程按能直接上手的标准来写。不管你是刚入门的嵌入式新手还是已经在啃总线协议的老手这篇文章能帮你把CAN的知识串成一条完整链路。1. CAN总线能火这么多年靠的是什么1.1 从RS-485到CAN传统串行总线的痛点很多人第一次接触CAN时会先问一句RS-485、UART不也能多点通信吗为什么汽车和机器人行业偏偏选CAN回想一下RS-485的多机通信场景它本质上是一主多从或者令牌轮询主机点名从机应答。这在节点少、数据量小、实时性要求不高的场合确实够用但放到车上就麻烦了。现代一辆车有几十甚至上百个ECU发动机、变速箱、ABS、安全气囊、车窗、车灯全都要协同工作它们之间不是简单的“主机问、从机答”而是大量节点在并发发送状态信息。假如用RS-485一旦两个节点同时往总线上发数据总线就冲突了整个通信直接乱套后果可能是致命的。UART又太“单线思维”。连两个设备都很吃力别说是几十个节点共享一根总线。而且UART没有优先级概念也不带硬件级的错误检测和自动重发用在几十毫秒内就必须响应一次的控制系统里可靠性根本不够看。CAN总线就是在这种需求下被选中的方案。它的英文全称是Controller Area Network控制器局域网由博世在1986年发明最早就是为了解决汽车内部大量电子设备之间的可靠通信问题。它不像UART那样只负责“传字节”也不像RS-485那样依赖主机调度而是天生就支持多主机、优先级仲裁、错误检测和自动重发——从物理层到链路层都自带了“坚强”的基因。1.2 CAN总线的三个核心特性说到CAN的核心特性我用大白话总结成三点。第一两条线就能挂一大堆节点。经典CAN总线就是CAN_H和CAN_L两根差分线理论上一个网络最多能挂110个节点实际工程中通常控制在32个以内更稳妥每个节点通过收发器并联在总线上。这比UART一对一省线多了而且接线简单总线拓扑清晰。第二报文带优先级冲突自动仲裁。这是CAN最漂亮的机制。每个数据帧的标识符ID天然就是优先级ID值越小优先级越高。当两个节点同时抢总线时CAN控制器会一边发一边监听发现别人发的位比自己的“更硬”显性就主动退让让优先级高的报文先走。整个过程在硬件里毫秒级完成软件完全不用管。第三错误检测和恢复机制非常强。位填充规则、CRC校验、帧格式检查、ACK应答任何节点发现错误都会立刻发送错误帧把错误“广播”出去发送方收到后自动重发。这种机制让CAN在强电磁干扰的汽车环境下依然能保持可靠通信这也是为什么车辆协议普遍以CAN作为底层承载的原因。1.3 整车网络里CAN的位置现在的车已经不是以前那种几个ECU加几根线了。一辆中高端车的电子控制单元动辄几十个一辆智能电动车的控制节点还能更多。整车网络会按功能和实时性要求分成好几路总线比如动力CAN、车身CAN、娱乐CAN、诊断CAN各路之间用网关隔开。但不管怎么分CAN仍然是底盘动力和安全相关功能的核心栽体。像发动机控制、变速箱控制、ESP车身稳定、转向助力这些对实时性要求极高的模块走的几乎都是高速CAN或CAN FD。正因为CAN承载了这么多关键控制指令所以搞懂CAN总线就相当于拿到了理解车辆协议的钥匙。2. CAN物理层电压差和波形里到底藏了什么2.1 CAN_H和CAN_L2V差压是怎么在2.5V基准上“生”出来的很多刚接触CAN波形的人第一次看到示波器上的两条线会愣住CAN_H和CAN_L看起来就是两路方波好像也没什么特别。但你换个角度把两路信号相减再看就能看出门道了。CAN的物理层走的是差分信号全靠CAN_H和CAN_L之间的电压差来表达逻辑电平。参考ISO 11898标准总线处于隐性Recessive状态时CAN_H和CAN_L都被拉着接近2.5V两者压差接近0V代表逻辑1总线处于显性Dominant状态时CAN_H被拉高到大约3.5VCAN_L被拉低到大约1.5V两者压差约为2V代表逻辑0。单端信号看的是“对地电压”差分信号看的是“两线之间的压差”。这样做的好处非常明显共模干扰。当发动机点火、电机启停造成地电位波动时CAN_H和CAN_L的绝对电压会一起上下浮动但只要两者之差不变接收端就能准确识别出0和1。这就好比两个人说话背景噪音再大只要两人音量的差值关系没变照样能听清。这个电压差是由CAN收发器内部的驱动电路“做出来”的。芯片收到控制器给的逻辑电平如果是显性位就把CAN_H推高到3.5V、把CAN_L拉低到1.5V如果是隐性位就释放总线靠终端电阻把两条线都拉回2.5V左右。所以想通过波形判断通信质量首要就是盯住这个压差是否稳定。2.2 终端电阻与总线拓扑说完电压差必须得讲终端电阻。这是新手最容易掉坑的地方。CAN总线两端需要各接一个120Ω的终端电阻。为什么是120Ω因为CAN的物理介质是特性阻抗约120Ω的双绞线在总线两端并联上匹配电阻可以吸收信号到达线缆末端时产生的反射避免波形振铃和过冲。如果没有终端电阻示波器上会看到上升沿和下降沿出现明显的过冲波形边缘呈“毛毛躁躁”的状态严重时直接导致位错误和通信失败。判断终端电阻很简单在总线上电的状态下用万用表测量CAN_H与CAN_L之间的直流电阻正常应该在60Ω左右——因为两端各一个120Ω并联。如果您只测到大约120Ω说明大概率有一个终端电阻缺失如果接近0Ω或者非常小可能是线路短路。我自己调试机器人关节时就因为少装了一个120Ω电阻波形看起来还算正常但总线稍稍拉长就开始偶发错误折腾了大半天。总线拓扑也要注意。CAN总线理想情况下是“一条直线两边端接”各个节点通过很短的支线stub接入主干。支线太长会形成阻抗不连续点像树杈一样引发信号反射。高速CAN场景下支线尽量控制在30cm以内越短越好。2.3 位时序为什么同一个网络必须统一波特率物理层还有一个容易被忽略的点位时序。CAN总线的发送方在发每个位时接收方必须能准确判断这个位什么时候开始、什么时候结束。CAN的每个位可以拆成同步段、传播段、相位缓冲段等多个部分总线的波特率决定了每个位的时间长度比如500kbps时一个位是2微秒1Mbps时是1微秒。只要网络中某个节点的波特率设置不一致接收方就会在采样点读取到错误的电平然后疯狂报错。这就是为什么在CANopen、J1939这些基于CAN的车辆协议里波特率是必须最先统一的环境参数。工程上最常用的几个档位是125kbps、250kbps、500kbps和1Mbps整车动力CAN一般是500kbps诊断通常走250kbps达妙电机这类机器人关节控制器往往支持500kbps或1Mbps具体看对应协议手册。波特率配不上还有一个典型的现场特征总线上一旦有节点往外发数据其他节点的错误计数器就开始飙升总线利用率看着不高但错误帧刷个不停。这种问题用示波器看波形往往能发现“锯齿状”的异常数据段。排查时先确认所有节点的波特率寄存器配置再查终端电阻顺序别搞反。3. 数据链路层与通信协议一次通信是怎么完成的3.1 一帧8字节信息是如何组织的物理层只负责把0和1传到总线上真正让CAN“能干活”的是数据链路层。经典CAN的数据帧结构虽然不像以太网帧内容那么多但每个字段都有讲究。一个标准CAN数据帧大致分这么几段帧起始SOF、仲裁场11位ID RTR位、控制场IDE、DLC、数据场0~8字节、CRC场、ACK场、帧结束EOF。其中用户最关心的是ID和数据场因为应用层协议的绝大多数信息都藏在里面。ID就是报文的标识符和优先级不是节点地址这一点要反复强调。它只代表“这帧数据是什么”不代表“发给谁”。比如0x0A表示转速信息0x1B表示车速信息总线上所有节点都在听符合自己过滤条件的才会把数据收下来处理。数据场最多8字节也是经典CAN的限制之一放到汽车这种喷油、点火、换挡信号一堆的环境里8字节足够装下绝大多数实时状态量比如一个角度值4字节加一个速度值4字节刚好塞满一帧。RTR位是远程帧标志平时大多数通信都用不到。扩展帧则把ID从11位扩展成29位多用于J1939这类较复杂的上层协议。经典CAN的报文ID数量有限设计项目时ID的规划一定要紧避免后期才发现冲突。3.2 仲裁机制为什么不需要担心多节点抢总线CAN的多主并发是它的招牌功能很多没接触过的人会问多个节点同时发怎么办答案是逐位仲裁。发送方在发送每个位的同时时刻监听着总线上的实际电平。如果你发的是逻辑1隐性但总线上被另一个节点的逻辑0显性覆盖了你就会知道“有人优先级比我高”立刻停止发送转为接收。这个机制利用的正是“显性位覆盖隐性位”的物理特性——显性0比隐性1更“硬”。因此CAN总线上不会出现数据碰撞优先级高的报文低延迟通过优先级低的自动退避等总线空闲后再重发。这套机制让“无冲突多主访问”成为CAN的底层默认能力也为上层车辆协议中的周期报文规划提供了非常大的便利。比如在动力CAN里发动机转速报文可能每10ms发一次油门踏板位置每20ms发一次它们各自用不同的ID完全不需要主机统一调度。3.3 错误检测与状态机CAN之所以能在把可靠性放在第一位的汽车电子里站稳脚跟错误处理机制功不可没。很多初学者不知道CAN控制器内部是有一个“错误计数器”的。发送节点每发出一帧数据所有接收节点都要在ACK段予以应答也就是发一个显性位。如果发送方没看见应答说明总线上可能没有其他节点在线或者数据有问题。除此之外CAN还设定了一整套错误检测规则位填充规则要求连续发送5个相同位后必须插入一位反相位的填充位CRC校验根据整个帧算出校验码格式检查确保每一帧的字段结构合法。任何一个环节出问题节点就会进入错误状态并送出错误帧。错误状态分主动错误、被动错误和总线关闭三种。节点发现错误时刚开始还能主动发错误帧但如果错误太多会被降级为被动错误状态只能听别人发错误帧再严重就会直接“离线”彻底停止参与总线通信。这对实际调试的启示是当网络中出现大量错误帧时不要只盯着线缆也要看是不是某个节点的CAN控制器工作异常甚至被错误计数器“惩罚”掉线了。3.4 CAN FD能做什么最近几年很多新车和机器人控制器开始用CAN FD。FD就是Flexible Data-rate的缩写它的出现是因为经典CAN的8字节数据场在很多场景下确实不够用。比如UDS刷写ECU固件时一次要传的固件块动辄几K字节8字节一帧加协议开销传输效率低得感人。CAN FD把数据场从8字节扩展到了最多64字节并且在数据段可以用更高速率传输比如2Mbps甚至5Mbps而仲裁段仍保持较低速率保证兼容性。它保留了CAN的无冲突仲裁和错误检测优点只是物理层上对终端电阻和线缆的要求更苛刻了一些。现阶段做车辆工程和机器人控制建议直接考虑支持CAN FD的控制器和收发器芯片哪怕前期不用FD模式也为后续升级留好余地。4. 车辆协议全景从CAN到上层应用的完整图谱4.1 CAN只是“高速公路”上层协议才是“交通规则”很多人会把CAN总线和车辆协议混为一谈这是概念上的误解。CAN总线解决的是“稳定可靠地把字节从A送到B”的问题相当于修了一条高速公路。但车上的ECU之间要互相理解对方发的字节是什么意思还需要一套大家共同遵守的“交通规则”——这就是应用层协议也就是车辆协议。整条协议栈可以分成三层看最底层是物理层对应CAN的差分电压、终端电阻中间是数据链路层由CAN控制器硬件完成帧收发、错误检测最上层才是应用层负责定义ID、数据字节含义、报文周期和诊断服务。实际项目中的“车辆协议”绝大多数讨论的就是最上层的内容。4.2 J1939商用车与重型机械的“翻译官”J1939是基于CAN 2.0B的一套高层协议广泛用在卡车、客车、工程机械、农机、船舶动力等领域。它的底层仍然走CAN总线但报文ID用29位扩展帧被拆分成优先级、数据页、PDU格式、PDU特定、源地址等字段。这套协议里有几个核心概念PGN是参数组编号可以把一组相关的参数打包进一个报文SPN是可疑参数编号具体指某一个物理量比如发动机转速是某个SPN冷却液温度是另一个SPN。源地址则标明了报文的发送节点比如发动机地址是0变速箱是3ABS是11。对开发者来说接触J1939最大的挑战是命名空间里的PGN和SPN数量庞大。实际做项目时不要试图背下来而是准备好协议资料和工具比如用CAN分析软件解析PGN对应的SPN列表。调J1939设备时有个小技巧如果只想知道“这个设备有没有在发报文”可以先抓原始CAN数据观察ID和周期不用急着做完整协议解析。4.3 UDS和OBD-II诊断与维修的入口车辆协议另一大分支是诊断协议。OBD-II是车载诊断系统的统称定义在ISO 15031-5和SAE J1979等标准里。普通车主最常见的方式是通过OBD口插一个诊断仪读取发动机转速、车速、水温等标准化的PID数据。OBD-II请求通常用11位CAN ID比如0x7DF作为功能寻址请求IDECU响应ID一般是0x7E8这一类。UDS是统一诊断服务定义在ISO 14229里。与OBD-II只读取固定PID不同UDS是一整套灵活的诊断服务栈支持0x10会话控制、0x22按ID读数据、0x2E写数据、0x31例程控制、0x34/0x36请求下载并传输数据等。做ECU标定和固件刷写时主要靠UDS实现它把CAN数据帧变成了请求/响应模式的“客户端-服务器”交互。这两套协议并不互相排斥很多ECU同时支持OBD-II的基础排放诊断和UDS的完整诊断功能。实际刷写固件时一条UDS长数据传输会被拆成多条CAN帧比如用CAN FD 64字节数据场时一次能传的块就大得多这也是CAN FD在诊断刷写场景里明显占优的原因。4.4 怎么选协议给开发者的实用建议车辆协议选型要看场景。如果你在做商用车动力总成、工程机械部件要和第三方设备互联互通J1939是几乎绕不开的标准因为它定义了统一的PGN和SPN不用自己造轮子。如果你在做整车或ECU诊断、刷写、标定UDS是行业通用的选择配合标准的诊断仪和上位机软件调试效率会高很多。如果你做的是机器人、无人机、运动控制器这类自定义系统多数情况不需要套用完整的J1939或UDS而是直接定义一个轻量的私有CAN应用协议比如在ID里区分报文类型在数据场里放关节位置、速度、力矩等状态量再用CRC或校验和保底。达妙电机的控制协议就是这种典型做法。5. CAN波形实战怎么判断通信质量好坏5.1 正常波形长什么样判断CAN通信好不好最直观的方法就是拿示波器量CAN_H和CAN_L之间的差分波形。基于常见的实操场景一般建议用差分探头或者把示波器通道1接CAN_H、通道2接CAN_L然后用数学通道算CH1-CH2。正常通信时你应该能看到一系列脉冲。隐性状态下压差为0V显性状态下压差约2V波形高低电平清晰上升沿和下降沿都比较陡边缘不毛糙没有明显的过冲。波特率设得正确时通过示波器上的光标测量一个显性位的宽度再取倒数得到的值应该和你配置的波特率对得上。比如500kbps时单个位时间约2微秒。还可以看一个额外指标位时间的一致性。把示波器时基拉大连续观察多个位如果每一位的时间长度基本一致说明发送节点的时钟源和位定时配置良好。如果某个节点的位宽忽长忽短说明它的时钟偏移过大时间长了会累积成同步错误。5.2 常见异常波形怎么读实际调试中我见过最多的异常波形有四类。第一类是“幅值偏低”。正常显性压差应该在2V左右如果只有1V不到先查CAN_H和CAN_L是否短路到地或者对地阻抗异常再查收发器供电以及总线上的节点数量是不是太多导致驱动能力不够。第二类是“过冲振铃”。显性到隐性的切换沿出现明显的上冲下冲波形像被用力弹了一下。优先检查两端120Ω终端电阻是否都在位其次查线缆分支是否太长、线缆质量是否太差。我自己遇到过一款不带终端电阻的开发板单独测没问题连上总线后波形毛边特别明显补上电阻后立刻干净了。第三类是“波形不对称”。显性电平和隐性电平出现系统性偏移比如CAN_H整体偏低而CAN_L整体偏高说明总线可能存在共模电压偏移或者CAN收发器故障。第四类是“间歇性毛刺”。波形正常但偶尔会出现窄窄的毛刺这往往是外部电磁干扰打进来的。解决办法靠线缆屏蔽层接地、合理布线、差分走线扭绞度保证必要时降低波特率或加共模电感。5.3 用示波器和逻辑分析仪怎么测示波器适合观察物理层波形质量逻辑分析仪适合解析链路层协议内容。两个工具配合才能覆盖“通信好不好”和“数据对不对”两件事。示波器测波形时重点设置好触发条件。建议把触发源选在差分通道触发类型选下降沿或上升沿触发电平设在1V左右这样不管捕获显性还是隐性跳变都很方便。采样率至少2倍于CAN波特率最好能到10倍以上否则波形边沿看不清楚。逻辑分析仪解CAN帧时要用带CAN协议解析功能的上位机软件比如开源的Saleae Logic配套软件或者国内常见的CAN卡调试工具。接好CAN_H、CAN_L和GND后设置好波特率软件就能自动把原始波形解析成ID、DLC、数据字段和CRC一目了然。推荐养成一个习惯抓数据时先保存一份原始波形文件再关联解析结果。很多疑难杂症是在回头看波形时才发现端倪的。6. 达妙电机通过CAN实现精准关节控制怎么做6.1 先搞清控制链路主控-CAN-电机达妙电机这类一体化关节电机内部集成了电机本体、编码器和驱动板外部通过CAN接口与主控通信。主控不需要直接输出PWM驱动桥只需要通过CAN总线发送目标指令电机驱动板内部自己完成FOC矢量控制和三环闭环再把实时状态通过CAN反馈回来。整个控制链路可以简化成主控CAN控制器 - CAN收发器 - 双绞线 - 电机端CAN收发器 - 电机驱动MCU - FOC逆变器 - 电机本体 - 编码器。主控的主要任务是“说清楚想要什么状态”而不是参与底层电流环计算这对主控MCU的计算负担非常友好。所以通过CAN实现精准关节控制本质上就是两件事一是把控制指令编码成正确的CAN报文发出去二是把电机返回的状态报文解码出来用于上层逻辑。至于电机内部的位置环、速度环、电流环怎么调那是电机驱动板固件的事情用户只需要关心模式切换和参数配置。6.2 命令帧结构与模式选择达妙电机不同型号的CAN协议细节有差异但框架高度一致。以常见的控制协议为例主控发送的控制帧ID通常基址在0x140附近电机反馈帧ID基址在0x240附近具体ID由电机的CAN ID决定。控制帧数据场常用8字节前2字节一般是命令字后面跟着具体数据。位置模式下数据场里是目标位置、速度限制、力矩限制等参数速度模式则只发目标速度和力矩限制电流/力矩模式直接给目标扭矩值。切换模式和使能电机也需要对应的命令字比如0xA8可能是位置模式指令0xA9可能是速度模式指令0xA6是使能0xA7是失能。把几个常见控制内容整理成下面这样便于对照控制类型典型命令字关键参数适用场景位置模式0xA8目标角度、最大速度、最大力矩机械臂关节定位速度模式0xA9目标速度、最大力矩轮式机器人驱动电流/力矩模式0xAA目标电流/力矩力控、柔顺控制使能/失能0xA6/0xA7无上电初始化与急停这只是常见参考不同批次可能不同实际使用一定要以官方协议文档为准。我踩过一次坑对着网上的旧代码发位置指令电机纹丝不动查了一个晚上才发现老固件和新固件的命令字不一样翻官方手册才解决。6.3 精准关节控制的实操要点想要关节控制“准”主要看三方面指令精度、周期稳定性、反馈质量。指令精度方面电机内部位置环通常按电机轴的多圈角度或减速器输出端角度计算发送位置指令时务必确认单位是弧度还是度是整数还是浮点缩放值。不少协议会把角度放大若干倍比如放大10000倍再取整发错倍率会导致关节直接飞转。第一次上电调试一定要限速、限力矩。周期稳定性方面CAN控制是离散控制主控发送指令的频率直接影响电机响应的平滑度。常见做法是控制周期固定在2ms、5ms或10ms用定时器中断保证发送节奏不能一会儿快一会儿慢。假如主控是RTOS环境要注意CAN发送任务的优先级和阻塞时间避免被其他低优先级任务卡了发送节奏。反馈质量方面电机反馈帧里的编码器值、速度和力矩要正确解析换算成真实物理量后用于闭环。如果想做上位机可视化和记录务必把反馈帧的时间戳和实际控制周期对齐否则后期数据分析时容易得出错误结论。6.4 踩坑提醒用达妙电机做关节控制时有几个细节特别容易出问题。上电顺序很关键。很多驱动板要求先给CAN总线供电再使能电机或者反过来具体看手册。错误的上电顺序可能导致电机上电瞬间抖动甚至报警。在线调试工具一定要学会用。用CAN分析软件周期性发送控制帧先不用业务主控直接确认电机能收到指令、能动作再把控制逻辑接进来。这样可以隔离问题如果能用工具控制成功说明电机端没问题问题在主控侧如果工具控制也不动回头查线、查波特率、查ID。电机反馈帧也一定要处理。有些初学者只发命令不管反馈结果电机指令到了、实际卡住了都不知道。把反馈帧里的状态字看明白至少能判断电机有没有使能、有没有报警、位置有没有正常跟踪目标。7. 常见问题与排查经验把实际调试中频繁出现的CAN问题和排查方法整理成一张表我自己去现场调试时基本都按这个顺序来现象可能原因排查/处理方法通信完全不通示波器无波形收发器没供电、CAN_H/CAN_L接反、波特率不匹配先查供电再查线序最后统一波特率有波形但大量错误帧终端电阻缺失、波特率不一致、节点ID冲突量CAN_H-CAN_L电阻应约60Ω核对所有节点波特率波形幅值偏低总线过载、CAN_H/CAN_L对地短路、收发器驱动弱断开部分节点逐个排查测对地阻抗波形边沿过冲、振铃终端电阻异常、支线过长、线缆阻抗不匹配补终端电阻缩短支线换高品质双绞线通信时好时坏接触不良、连接器松动、线缆破损、干扰重新压接端子检查屏蔽接地用波形触发捕获异常点电机收不到指令电机ID配置不对、命令字错误、CAN过滤器设错用CAN工具直接发帧测试核对ID和DLC电机反馈帧乱码波特率不一致、反馈ID读错、单位换算错误固定波特率抓数据解析原始字段再换算排查的顺序我习惯定为“先物理层、再链路层、最后应用层”。物理层看波形链路层看帧结构应用层看协议解析。只要按这个顺序走大多数问题都能在半小时内定位。有两个小技巧值得单独说。一个是准备好一对好的CAN调试工具。市面上的USB-CAN卡、逻辑分析仪都可以但建议选带协议解析功能的否则每次都要手动解帧太折磨人。调试时不要只开一个上位机软件最好把原始CAN数据流导出来存档出问题可以回放。另一个是给每条CAN报文一个固定周期。不论是自己设计的私有协议还是标准车辆协议周期报文能让总线状态一目了然。当某个节点掉线时只要看哪个周期的报文消失了就能立刻定位到人。对整车或机器人这种多节点系统这一招在排查故障时价值极高。结尾一点个人的实际体会做了这么多年CAN总线相关的调试我的体会是CAN这套东西看着入门门槛低真正遇到问题的时候拼的还是对物理层和协议层的底层理解。很多人喜欢直接抄代码、抄配置连波特率位时序都不看结果换了一块板子或者换了一条线就翻车。反过来如果你能耐心把波形拿示波器测出来、把一帧CAN数据从SOF到EOF逐字段数一遍绝大多数通信问题在你眼里都会变得有迹可循。最后再分享一个小技巧调试CAN时手边永远留一颗120Ω电阻和一对杜邦线很多“灵异故障”最后都是因为终端电阻不在位或者CAN线接触不良两颗电阻能帮你省下半天排查时间。
返回列表