ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RS232、RS485与CAN总线原理及波形调试实战解析

RS232、RS485与CAN总线原理及波形调试实战解析 搞嵌入式、工业控制、设备联调的人迟早要跟RS232、RS485、CAN_BUS打交道。这三种总线到现在依然是工业现场、仪器仪表、车载电子、门禁电力设备里最常见的通信方式。很多人会用调包调库调接线但真正遇到通信不稳定、偶发乱码、丢帧、甚至整条总线瘫掉的时候如果没有波形层面的分析能力就只能靠猜。这篇文章我从原理到波形把三种总线放在一起聊一遍包括它们的电平标准、帧格式、组网方式、典型电路以及用示波器抓波形时到底怎么看、怎么定位问题。适合刚入门的技术人员也适合想补全通信底层认知的固件工程师。1. 先从物理层说起RS232、RS485、CAN_BUS到底在物理上怎么传数据三种总线的本质区别实际上都在物理层。通信协议的逻辑层可以很类似——都是起始位、数据位、停止位那一套串行帧——但物理层决定了你能传多远、能挂几个设备、抗干扰能力怎么样。1.1 单端电平与差分电平这是第一个分水岭RS232是典型的单端电平传输。什么意思就是一根信号线相对于地线GND用电平高低来表示逻辑0和逻辑1。它的电平定义是反逻辑的当信号线上的电压在-3V到-15V之间代表逻辑1也叫mark当电压在3V到15V之间代表逻辑0space。-3V到3V之间是无效电平区域设计上要避免。这种单端传输方式结构简单但抗干扰能力天然弱。因为信号是相对于本地地线测量的如果收发两端的地电位不一致就会出现电平偏移。地电位差一多接收端就分不清0和1了。这就是为什么RS232通信距离一般不超过15米波特率也很难推高到1Mbps以上的原因之一。RS485和CAN_BUS走的是差分传输用两根线A和BCAN里面是CANH和CANL之间的电压差来表示逻辑状态。接收端不测量单根线对地的电压而是测量两根线之间的差模电压。任何共模干扰只要同时等量耦合到两根线上差模电压就不会受影响抗干扰能力自然强得多。这也是RS485和CAN能支持到1200米传输距离、能在工业现场用几十K上百K波特率稳定跑的原因。可以把单端传输类比成两个人喊话环境噪音大了就听不清差分传输则像是两个人用天平比重量地面的晃动不影响“谁比谁重”这个结论。1.2 三种总线的电平标准与电气参数对照把三种总线放在一张表里看更直观参数RS232RS485CAN_BUS传输方式单端差分差分逻辑1电平-3V ~ -15VA-B 200mV隐性recessive逻辑0电平3V ~ 15VA-B -200mV显性dominant通信模式全双工半双工可全双工半双工多主最大节点数1对132标准/更多理论110个左右典型距离15m1200m500m250kbps常用波特率9600~1152009600~10Mbps125k~1Mbps典型拓扑点对点总线型总线型注意RS485逻辑电平的定义有些资料会反过来写原因是不同厂家的数据手册标注方式不同。正规做法是以A、B两端的相对电压来判定当VA VB为正且差大于200mV表示逻辑1当VA VB为负且差小于-200mV表示逻辑0。空载时A偏高、B偏低是常态具体要在电路里加偏置电阻保证空闲电平稳定在逻辑1。CAN_BUS的逻辑和普通串口的“正逻辑”也不一样它把“显性位”定义为优先级别更高的位差分电压约为1.5V到3.5V之间的差值把“隐性位”定义为差分电压接近0V两根线都在2.5V附近。后面讲CAN帧的时候再展开。1.3 为什么工业现场还在用这些“老协议”这几种协议动辄几十年历史但并没有被淘汰。原因很简单实现成本低、稳定性经过长期验证、普通MCU的UART外设就能支撑。以太网虽然快但物理层要变压器、PHY芯片软件栈也更重在传感器、执行器、采集模块这些对实时性和成本敏感的场合RS485和CAN仍然是性价比最优解。理解物理层之后接下来的问题就是这些电平怎么变成一帧数据的2. RS232全双工的老实人但“乱码”问题最常被人问RS232在调试串口、连接嵌入式设备、配置工业交换机时几乎天天遇到。它的原理看起来最简单但真正查起乱码问题往往比想象中复杂。2.1 UART帧格式每一bit都对应一个固定宽度RS232的数据帧基于UART异步串行协议典型结构是空闲为高电平逻辑1起始位是一个低电平脉冲逻辑0然后从低位到高位发送5到8个数据位接着是可选的校验位最后是1位或2位停止位逻辑1。以最常用的8N1格式为例一帧就是1位起始位 8位数据位 1位停止位 10个bit周期。如果波特率是9600每个bit的时间宽度是1/9600秒约104.2微秒。你在示波器上看到的一个低电平起始位它的宽度必须接近104微秒左右。如果测量出来明显偏长或偏短说明双方波特率没对齐或者时钟源本身就有偏差。一个常见的波形观察技巧是先看起始位后的第一个字节。比如你发送0x55二进制01010101它的波形是“01010101”交替在示波器上就是一个规则的方波。如果这个规则方波的占空比明显不是50%说明发送端波特率有偏差但还在容忍范围内。如果完全对不上就是波特率设置错了。2.2 波形上的关键特征怎么认抓RS232波形时我习惯把探头地线夹在GND探头尖端接TX或RX线。因为RS232电平范围是±15V很多示波器默认垂直档位在1V/div到2V/div之间就能看得很清楚。触发方式选择下降沿触发因为起始位是下降沿。正常的RS232帧在示波器上大致长这样空闲状态是一条约-8V左右的平线逻辑1然后突然掉到8V附近持续约1个bit时间起始位逻辑0接着信号在-8V和8V之间来回跳变数据位最后回到-8V并保持停止位。你可以在停止位之后看到下一帧之前的高电平空闲。如果抓到的电平完全反了空闲为8V起始位为-8V就需要检查是不是接错了线或者转换板上有反相芯片。RS232的电平逻辑本来就反直觉这种错误很常见。2.3 RS232乱码的根本原因不是“干扰”那么简单很多人一遇到乱码就说“干扰”其实RS232短距离通信中乱码更多来自以下几个方面第一是波特率不匹配。这是最常见的原因。两个设备设置不一致接收端采样的时间点和发送端的bit边界错位读出来就是乱码。这种乱码通常有规律比如打印出来的全是0xFF、0x00或者固定错位成别的字符。第二是电平转换芯片故障或供电不足。现在很多设备用的是USB转RS232芯片比如CH340、CP2102、FT232等。有些劣质转换器用的是内置晶振晶振精度不够长期工作后频率漂移导致实际波特率和标称值有偏差。当你用115200甚至更高波特率时这种偏差就会被放大。我用示波器量过某些山寨USB转串口线标称115200实际频率差了百分之二短帧勉强能用连续大量收发时就会报错。第三是地电位不一致。在长距离或者两个独立供电系统之间RS232的GND并不是等电位的可能有一两伏到十几伏的压差。这个压差会叠加到信号上严重时会把MAX232这类芯片打到闩锁甚至烧毁。这也是为什么严格意义上RS232通信也应该做隔离但现实里很多人直接共地所以才会有“USB转串口插上去电脑死机”的怪现象。第四是软件配置问题。数据位、停止位、校验位不匹配也会乱码。这类乱码的症状是能收到数据但解析不对。我常建议先把串口工具设置成HEX显示如果HEX内容明显能看出0x55、0xAA这类测试码说明物理层通的问题在协议解析。2.4 USB转RS232的实际使用注意事项现在笔记本上几乎没有原生串口了USB转RS232成了必备工具。这类转换器的核心是USB转UART芯片加电平转换比如CH340/CP2102输出的是3.3V/5V的TTL电平再通过MAX3232之类的芯片转换成±12V的RS232电平。选型时注意看转换器是否带有隔离及ESD保护。工业现场的USB转串口如果没有隔离插上后当RS232接口瞬间遭遇高压静电很可能把芯片打穿同时殃及电脑的USB口。我自己吃过亏后来就用带隔离的模块或者加USB隔离器虽然贵一点但不会因为一次插拔就损失几百块钱的调试工具。TTL电平转RS232的电路也不难选一颗MAX3232或SP3232外接5个0.1uF电容3.3V供电即可。MAX3232内部有电压倍增电路能输出±5.5V左右的电平虽然达不到±15V上限但满足±3V以上的阈值要求所以能可靠通信。3. RS485差分总线靠一根“使能线”撑起整个一主多从网络RS485应该是工业现场覆盖率最高的总线。它廉价、耐用、接线简单而且天生适合一主多从的组网模式。但RS485的工程细节比RS232多得多自动收发电路、偏置电阻、终端匹配、防雷保护每一项都影响系统稳定性。3.1 为什么RS485能传得远、抗干扰强RS485的物理层采用差分信号。发送端通过驱动器在A、B两根线上产生反相的电压信号接收端通过比较A和B的电压差来还原数据。当VA - VB 200mV时接收器输出逻辑1当VA - VB -200mV时输出逻辑0。收发器内部一般带50mV左右的迟滞用来抑制噪声。由于接收端只关心差模电压任何同时作用在A、B上的共模噪声都会被抵消掉。工业现场常见的电机、变频器产生的干扰主要是共模特性的所以RS485在复杂电磁环境下依然能可靠工作。如果再配合屏蔽双绞线抗共模能力会更好。距离能到1200米是因为接收器的输入阻抗足够高标准为12kΩ在低速波特率下线缆的衰减还没大到让差分电压跌破200mV阈值。如果波特率提高到10Mbps最大距离就会急剧缩短到几十米这是物理规律不是协议问题。3.2 收发器电路的核心方向控制与“空闲电平”RS485标准定义的是半双工总线同一时刻只能有一个设备发送其他设备都要处于接收状态。这就要靠DE发送使能和RE接收使能来控制。几乎所有RS485收发器芯片都带DE/RE引脚很多芯片把两个引脚合并为一根低电平接收、高电平发送。最简单的接线方式是用MCU的一个GPIO控制DE/RE。发送前先拉高等数据发完或者等到帧间隔再拉低恢复接收。这个“发送完毕”的时机很关键尤其在使用中断发送或DMA发送时如果提前切回接收最后一个字节或最后几个bit就会丢失如果切换得太晚又会占用总线影响下一条指令的响应。我自己在写RS485从机程序时常用发送完成后进入发送空闲中断再延迟半个字符时间后把DE拉低。这个半个字符时间怎么算比如波特率9600一个字符按11bit算半字符时间约0.5 * 11 / 9600 0.573ms取1ms足够。如果用DMA可以参考串口的TC传输完成标志位等TC置位后再拉低DE这样可以精确确保移位寄存器里的数据全部送出去了。3.3 自动收发电路省掉一根IO但每颗芯片都是雷很多应用希望RS485电路能自动判断收发方向省去GPIO控制。常见的自动收发电路是在收发器DI和RO引脚上加RC延时和晶体管利用UART空闲时为高电平逻辑1的特点让发送数据线上的电平变化自动控制DE。数据为低起始位时使能发送数据为高且持续超过一定时间停止位和空闲时切回接收。这类电路看起来省事但存在三个坑第一高速波特率下RC时间常数不好调。如果RC充电太慢高电平持续时间不足以让DE稳定输出波形就会畸变太快又可能在帧间空闲时误触发方向切换。我见过一个项目用自动收发电路跑115200结果每帧第4个字节以后就乱最后只能放弃自动收发改用GPIO控制。第二自动收发会占掉总线释放时间。因为每一帧结束后需要等待RC放电到低电平才能切回接收态这段时间若再发下一帧就会导致对方来不及接收或本机没来得及让出总线。第三收发器上电瞬间电平不确定容易导致多设备同时发送总线冲突。所以除非是极低速、短帧且不追求可靠性的场景否则我不推荐自动收发电路。真要用也建议在RO端加上拉电阻使空闲状态稳定为高电平并实测波形确认DE切换没有毛刺。3.4 组网拓扑与终端匹配为什么你不能“星型连接”RS485要求所有节点都挂在一根主干总线上从主干到每个节点的分支线越短越好。标准规定分支线不应超过1米的推荐做法在高速率下甚至要控制在10-20厘米内。如果做成星型拓扑信号在分支处会产生反射反射波叠加到正常信号上导致眼图闭合总线上呈现的就不是干净方波而是台阶或回勾。终端匹配电阻的作用是吸收总线末端的信号能量防止反射。标准做法是在主干线最远的两个端点分别接120Ω电阻与双绞线特性阻抗一致。注意是两端都要接不是只在主机端接。有些设备自带120Ω拨码开关如果设备正好在总线端点就打开不在端点就闭合。还有一种情况总线空闲时没有任何设备驱动总线A和B之间的差分电压可能落到-200mV到200mV的不确定区接收端输出一个随机电平这就会导致主机收到一堆 garbage。解决办法是在靠近接收器的地方加偏置电阻将A线上拉到VCC将B线下拉到GND确保空闲时A-B为正即逻辑1。偏置电阻的取值要根据节点数、终端电阻和供电电压综合考虑。一般用390Ω到1kΩ在总线上加一组偏置电阻就够了不需要每个节点加。3.5 热搜词里“标配网络防雷接口、双电源、RS485接口≥6路”背后的工程场景之前在一些项目选型时见到设备参数里写着“标配网络防雷接口≥6路、接地通路接口≥2路、RS485接口≥6”这通常是户外或电力场景下的数据采集单元。RS485接口在室外走线会遭遇雷电和感应浪涌。虽然双绞线本身能抵消一部分共模感应但雷击时的地电位反击会直接损坏收发器。所以室外RS485接口的EMC设计至少要包含三部分一是气体放电管或TVS管把浪涌电压钳位到收发器能承受的范围二是PTC自恢复保险或串阻限制浪涌电流三是共模电感抑制高频干扰。接地通路必须单独引粗线接到大地不能和设备数字地共用。双电源通常是指设备有主备电源或者控制器和通信模块单独供电。分开供电能避免通信回路的电流通过电源地串扰这对RS485驱动器的共模电压范围很有帮助。RS485收发器虽然能承受-7V到12V的共模电压但超出这个范围就危险了所以很多工业模块直接用隔离收发器比如带数字隔离的ADM2483或ISO3082。4. CAN_BUS差分加多主仲裁波形里能直接看到“谁在抢总线”CAN总线和RS485外形很像都是两根差分线但本质完全不同。RS485是主从结构轮询式通信CAN是真正的多主总线任何节点检测到总线空闲都能主动发送。多主同时发送时怎么办靠物理层的一个巧妙设计显性位覆盖隐性位。4.1 显性与隐性CAN物理层怎么实现“线与”CAN的物理层也采用差分信号标准CANISO 11898-2中隐形位recessive对应逻辑1时CANH和CANL都在2.5V附近差分电压CANH-CANL接近0V显性位dominant对应逻辑0时CANH被拉高到约3.5VCANL被拉低到约1.5V差分电压约为2V。关键点来了只要总线上有一个节点发出显性位总线就会处于显性状态隐性位只有“所有节点都输出隐性位”时才会出现。这就像线与逻辑0能压制1。正因为这种机制多个节点同时发送时可以通过逐位仲裁发送显性位0的节点会赢得仲裁发送隐性位1的节点在检测到总线电平与自己发送的电平不一致时就知道自己仲裁失败了立刻停止发送转为接收。这在物理层面的含义是CAN收发器输出显性位时是主动驱动总线输出隐性位时则是释放总线依靠终端电阻和收发器内部偏置将总线拉回2.5V。如果你在总线上看CAN波形发现所有显性位的幅值都正常但在总线空闲时CANH和CANL不能回到2.5V左右那说明终端电阻或收发器有问题。4.2 CAN帧格式从波形上怎么数bit标准CAN 2.0A数据帧包含帧起始SOF一个显性位、仲裁场11位标识符加RTR位、控制场IDE、DLC等、数据场0到8字节、CRC场、ACK场、EOF等。这段位流最终通过CAN控制器转换成一系列显性和隐形位再由收发器转成差分电压。在示波器上抓CAN波形最显眼的是SOF总线从隐性差分0V左右突然跳变到显性差分电压1.5V~3V左右这个跳变就是SOF。紧接着是11位标识符会有连续的高低变化。因为仲裁场可能要区分优先级不同节点的标识符不同波形会呈现一定的交错。如果你用解码功能可以直接解出ID和数据。示波器解码依赖采样点在位中间位置如果采样点设置不对解码就不稳定。示波器上查看CAN信号时要确保能清楚看到一个完整帧。抓波形时可以把时间档设为每格50us到100us波特率为250kbps时1bit是4us一个普通数据帧大概在50到130bit之间也就是说一帧大约200us到520us设置时间档时要能容纳完整的一到两帧。4.3 位定时和采样点一个“看不见”但影响巨大的参数CAN通信的可靠性高度依赖位定时是否一致。由于CAN是异步总线每个节点根据自己的晶振产生位时间但总线上只有一个发送者其他节点必须在位时间里找到正确的采样点来读取电平。位时间被CAN控制器分为多个时间段从同步段、传播时间段、相位缓冲段1、相位缓冲段2通过重新同步跳转宽度SJW来容忍时钟误差。采样点通常设置在位时间的70%到90%之间常用75%或80%。采样点太早容易采到前一位的电气干扰造成的振铃太晚又可能错过真正的跳变。BTR配置不是随便写的。比如STM32的CAN外设BRP波特率分频、BS1、BS2共同决定波特率和采样点。以36MHz的APB1时钟为例要产生250kbps波特率且采样点75%可以设置BRP9BS111BS24则位时间Tbit (1 11 4) * 10 / 36MHz 16个时钟 4us采样点 (1 11) / 16 75%。如果两个节点的采样点差异过大即使波特率标称相同比如都是500k也会出现数据偶尔正确、偶尔错误的情况。排查方法就是计算各节点的实际采样点并且用示波器测量总线上相邻节点的波形边沿偏差。另一个容易忽略的是CAN收发器的延时。从MCU的CAN控制器输出到收发器驱动总线再到接收器的比较器输出会有几百纳秒的环路延时。在1Mbps下1bit只有1us延时占比不可忽略。这也是为什么CAN总线的最大长度随波特率提高而缩短位时间短了传输线传播延时在采样点占比越来越大最终无法保持一致性。4.4 从波形看仲裁线上的“锯齿”是谁留下的多主并发时仲裁过程在波形上不会有什么明显的“打斗”痕迹因为仲裁只发生在同一bit时间内。如果两台设备同时发送ID不同但前几位相同的消息它们在波形上会保持一致直到某一位ID出现分歧其中一个节点发送显性位另一个发送隐性位。由于显性覆盖隐性总线上呈现显性发送隐性位的节点发现总线与自身输出不一致就退出发送进入接收模式。之后总线上的波形就只剩下赢家的信号输家不再驱动总线。要从示波器上判断是否发生过仲裁最直接的证据是捕捉到“波形中某一位的下降沿出现了明显台阶或不标准”的情况。理论上仲裁发生在边沿附近总线电平变化率不受影响但实际由于两个节点驱动力叠加可能在切换点产生微小畸变。更实用的方式是抓总线上的CRC错误帧或错误帧。如果总线上出现错误的显性位ACK异常说明可能有多个节点竞争或者采样点设置不当导致位错误。4.5 CAN总线调试的波形式要点再补充几个抓CAN波形的实际经验。使用差分探头最理想但没有差分探头时可以用示波器的两个通道分别测CANH和CANL然后用通道A减通道B的数学运算得到差分波形。注意探头的地线要接在同一个参考地最好接在CAN节点的隔离地或系统地避免形成地环路。CAN总线空闲时CANH和CANL都是约2.5V插上示波器后如果看到的公共电压大幅偏移说明可能有接地问题或总线对地短路。如果显性位的差压不足1.5V可能不是收发器损坏而是终端电阻接了两端但没有其他驱动时驱动器驱动能力下降。此时测量收发器TX引脚到CANH/CANL的波形可以定位是MCU没发出信号还是收发器故障。5. 实测对比三种总线用示波器抓波形时的操作细节与典型图谱解读讲了这么多原理最终都要落到示波器屏幕上。不少工程师习惯“先跑代码不通再抓波形”但我更建议在做通信联调的初期就先把波形抓出来看确认物理层完全干净之后再交给逻辑层去处理。5.1 示波器探头设置最容易忽略的事抓RS232时如果信号来自电脑USB转串口地线夹要可靠夹在转换器的GND。很多USB转串口的GND和电脑主板GND是连通的地线夹如果夹到机箱上可能会形成环路在开关电源供电的系统中还可能看到50Hz工频纹波叠加在通信线上这种情况不要急着怀疑协议先换个供电方式试试。抓RS485和CAN时强烈建议用差分探头或者用两路单端探头配合数学减法。如果用单端探头直接测A线对地波形你会看到波形并不是0V和3.3V跳变而是A线在某个共模电压基础上变化这时再测B线会看到反相波形。在A-B差分模式下观察才能真正看到“正确的”逻辑电平跳变。对于CAN如果示波器有CAN解码功能可以直接设置波特率示波器会自动识别帧的起始位并解码。不过要注意解码是基于采样点位置的如果示波器采样率不足或输入信号噪声大解码结果可能偶尔出错。建议同时开启波形和解码表对照看出现解码错误时检查波形是否变形。垂直档位建议RS232用2V/divRS485用1V/divCAN差分也用1V/div。时间档用500us/div可以完整看一帧低速信号如果要看bit细节用20us/div甚至更小。先看整体帧结构再放大看单bit边沿这是最有效的排查思路。5.2 一份典型RS485波形解读从起始位到停止位假设我们在主机发送端的AB之间测量波特率9600数据0x01二进制00000001无校验1停止位。抓到的差分波形如下空闲时A-B为正例如5V取决于驱动输出表示逻辑1。当起始位到来驱动方向翻转A-B变成负约-5V持续约104us后然后发送8个数据位。0x01从低位开始发送先是1正然后7个0负再1位停止位正。此时你再对比TTL串口比如MCU的UART_TX引脚会发现逻辑正好相反TTL空闲为高起始位低但逻辑1和数据位就是高电平逻辑0是低电平波形的“方向”看着一致但RS485差分波形的“正负”方向取决于A/B定义。如果你的示波器显示波形方向反了不要慌把通道A和通道B的测量顺序换一下即可或者检查是否AB接反。很多站点AB接反却能收到数据因为接收器输出可能反相但数据会是乱码或全部字符错误。这是排查RS485通信异常时要第一确认的事。5.3 三类常见异常波形与根因分析我把这几年现场遇到的三类典型问题整理一下第一类RS485总线上信号“发得出去回不来”。主机发数据时从机收到的波形正常但从机回数据时主机收不到。用示波器在主机端抓从机的响应发现从机发送时总线上波形幅度只有0.5V左右且波形毛糙。后来发现从机到主机的分支线拉了三四十米且从机未接终端电阻分支线在从机端形成了反射信号严重衰减。解决办法是把从机移到总线主干线旁边或尽量缩短分支线。第二类CAN总线偶发Bus Off且发生在剧烈震动或大电流负载启动时。抓CANH和CANL波形的共模部分发现显性位期间CANL下降到约0.5V而正常应保持1.5V。进一步检查发现CAN收发器的地线接点在电机驱动器机壳地附近大电流时地电位瞬态波动导致共模范围超出收发器容忍度。改用隔离CAN收发器并在CAN接口加入共模电感后问题消失。第三类RS232发送数据时电脑端显示乱码但误码率不高。用示波器查看波形发现波形边沿有缓慢的RC充放电形状上升沿像一个斜坡而不是陡峭跳变。原因是转换器里用的MAX3232电容老化或者电容容量不足导致电荷泵输出能力下降带不动线缆负载。换上新的电容或者更换转换器后波形立即恢复正常。这件事提醒我示波器波形“不干净”时在怀疑协议之前一定先检查驱动芯片供电和电荷泵电容。6. 三种协议放到同一张选型表里什么时候选谁最后把这些东西串起来聊聊选型。6.1 一张表格直接说清应用场景需求推荐理由简单点对点、短距离调试RS232最简单、全双工、无需方向控制一主多从、多点传感采集RS485成本低、距离远、节点多、组网成熟多主实时通信、车载/工控高可靠CAN_BUS多主仲裁、实时性好、差错处理完善视频或大流量数据以太网 / 其他这些总线带宽有限不适合大数据6.2 混合组网中的电平转换与网关实际项目里经常要同时用到三种总线。比如一块主控板既有RS232调试口又有RS485传感器总线还有一路CAN接入电机控制器。这种场景下每个接口的物理层设计都有单独考量。RS232调试口一般独立供电方便插拔RS485总线接口做隔离和TVS保护CAN接口用独立的隔离CAN收发器。在设计PCB时所有接口的地平面要做分割隔离电源的DC-DC要选隔离电压足够的模块并且输出端的分布电容要小以免高频噪声通过电源耦合到总线上。RS485和CAN的信号电平不能直接互连。如果要用MCU的UART复用需要外加协议转换芯片或网关。市场上有不少RS485转CAN模块其内部是两颗MCU分别处理UART和CAN协议中间通过双口RAM或SPI交换数据。用这类模块时要注意协议自定义问题因为两边数据格式不是透明的可能丢字节也可能出现时间戳错位。如果只是测试可以选用透明传输的模块但要自己规划好帧长度和超时时间。还有一种常见的做法用一颗带多个CAN控制器和多个UART的MCU自己写协议桥。这种做法灵活度高但要注意转发延迟和缓冲区溢出问题。无论如何混合组网时一定要在逻辑层定义好帧头和帧尾并加入校验字段而不是依赖物理层的可靠性。6.3 根据个人经验谈一点“老工程师的倔强”做了这些年通信开发我越来越觉得上位机调试不需要总追求最复杂的方法。很多问题到最后都是电平、时序、接地这三件事。如果你能把每种总线的波形“标准长什么样”记在脑子里遇到问题先抓波形再分析驱动电路最后才动代码基本能少走一半弯路。另外尽量在所有通信接口上加ESD和浪涌保护哪怕成本贵一点。室外项目尤其要把防雷和接地处理好否则产品交付后一打雷就通信中断返修成本远超省下的那几块钱。RS485接口建议用上下拉偏置电阻加TVS的经典电路CAN接口则要保证终端电阻和共模电感的布局合理。做PCB时接口连接器的外壳地最好通过一个高压电容再连接到信号地这样既能泄放静电又不会引入太大地环路噪声。最后一个小技巧用示波器抓波形之前先在总线上发一帧0x55或0xAA的测试数据。0x55的交替方波能让你一眼看出波特率是否准确也能快速判断信号边沿质量。如果0x55测出来都是正的其他数据帧的解析基本不会有大问题。这个习惯我从刚入行保持到现在很多“疑难杂症”都在这一步被提前拦下来了。
返回列表