3、CAN总线远程帧:远程帧作用、远程帧结构、数据帧与远程帧区别、远程帧应用场景
好,咱们接着聊CAN总线。前面我们把数据帧讲透了,今天来聊聊它的“孪生兄弟”——远程帧。
说实话,我刚入行那会儿,对远程帧的理解也仅限于“能请求数据”。直到有一次调试电梯外呼板,怎么都读不到楼层按钮的状态,折腾了两天,最后发现是远程帧的ID匹配出了问题。从那以后,我对远程帧就格外上心。
3.1 远程帧的作用:说白了就是“我要数据”
远程帧的核心作用就一句话:一个节点主动向另一个节点请求数据。
你想想看,在电梯系统里,轿厢控制器想知道当前楼层的光幕状态,怎么办?总不能一直等着光幕传感器主动发吧?这时候,轿厢控制器发一个远程帧,光幕传感器收到后,乖乖地把数据帧发回来。
我个人习惯把远程帧理解成“问路”。你站在路口,喊一声“去A栋怎么走?”(远程帧),路人听到了,告诉你“直走右转”(数据帧)。远程帧本身不携带数据,它只是一个请求信号。
远程帧的本质: 它是一个“空壳子”,只带ID和控制信息,不带数据场。它的使命就是触发对方发送数据帧。
3.2 远程帧的结构:跟数据帧很像,但有个关键区别
远程帧的结构,说白了跟数据帧几乎一模一样。我画个简表你就明白了:
| 帧结构字段 | 数据帧 | 远程帧 |
|---|---|---|
| 帧起始 | 1位显性位 | 1位显性位 |
| 仲裁场 | ID + RTR位(显性) | ID + RTR位(隐性) |
| 控制场 | IDE + r0 + DLC | IDE + r0 + DLC |
| 数据场 | 0~8字节数据 | 无数据场 |
| CRC场 | CRC序列 + CRC界定符 | CRC序列 + CRC界定符 |
| 应答场 | 应答间隙 + 应答界定符 | 应答间隙 + 应答界定符 |
| 帧结束 | 7位隐性位 | 7位隐性位 |
看到没?结构几乎一样。唯一的区别就在仲裁场的RTR位和数据场。
- RTR位:数据帧是显性(0),远程帧是隐性(1)。这是硬件区分两者的唯一标志。
- 数据场:远程帧没有数据场。注意,虽然控制场里的DLC(数据长度码)可以写,但实际不发送数据。嗯,这里有个坑,我后面会讲。
3.3 数据帧与远程帧的区别:别搞混了
很多新手容易把这两个搞混。我总结三个核心区别:
- 目的不同:数据帧是“我发数据给你”,远程帧是“你发数据给我”。
- RTR位不同:数据帧RTR=0(显性),远程帧RTR=1(隐性)。仲裁时,显性优先,所以数据帧优先级高于同ID的远程帧。
- 数据场不同:数据帧有数据,远程帧没有。就这么简单。
我曾经踩过的坑: 有一次我写代码,远程帧的DLC设成了8,但实际没发数据。结果接收方傻等了8个字节的数据,导致总线卡死。记住:远程帧的DLC虽然可以写,但接收方不会真的去读数据场。建议DLC设为0,避免误解。
3.4 远程帧的应用场景:电梯里怎么用?
远程帧在电梯系统里用得挺多的。我挑几个典型的场景说说:
场景一:外呼板状态查询
电梯每层的外呼板,平时不主动上报状态。轿厢控制器每隔一段时间,发一个远程帧,ID对应某层外呼板。外呼板收到后,把当前按钮状态(上、下、锁定等)打包成数据帧发回来。这样既省带宽,又避免数据冲突。
场景二:门机控制器参数读取
调试电梯门时,我想知道门机当前的力矩、位置、速度。门机控制器平时不广播这些数据。我发一个远程帧,指定ID,门机控制器就把参数发回来。嗯,这个在调试阶段特别有用。
场景三:故障码主动请求
电梯出故障了,主控想知道各个子系统的故障码。发远程帧给各个节点,节点收到后,把最近的故障码发回来。这样主控就能快速定位问题。
我的建议: 远程帧虽然好用,但别滥用。如果一个节点需要频繁请求数据,不如让节点主动周期性发送。远程帧适合“按需查询”的场景,比如调试、故障诊断、状态轮询。
3.5 远程帧的注意事项
最后,说几个容易出问题的地方:
- ID冲突:远程帧的ID必须和对应数据帧的ID一致。比如你请求ID=0x123的数据,对方回复的数据帧ID也必须是0x123。否则对方收不到,或者收到后不认。
- 应答机制:远程帧发送后,如果目标节点没反应(比如掉线了),发送方不会收到任何应答。所以,我习惯在应用层加超时重试机制。
- 优先级问题:同ID下,数据帧优先级高于远程帧。如果总线上同时有数据帧和远程帧,数据帧会赢得仲裁。这个在设计时要考虑。
好了,远程帧就聊到这儿。说白了,它就是CAN总线里的“请求-应答”机制,用好了能让系统更高效。下一章我们聊聊CAN总线的错误处理,那可是个有意思的话题。