CAN通信协议传输数据,为什么喜欢低位在前高位在后?而RS485则更倾向高位在前低位在后?

CAN 通信协议通常采用低位在前(小端字节序),而 RS - 485 本身没有固定要求高位在前或低位在后,其数据传输顺序更多取决于具体应用和上层协议。

CAN 通信协议低位在前的原因

硬件设计与实现角度
  • 逻辑电路处理便捷:数字电路对低位数据的处理更加基础和直接。设计移位寄存器、计数器等基本数字电路时,从低位开始操作能简化逻辑设计,减少硬件资源消耗与成本。
  • 适配微控制器:许多微控制器在数据处理上更倾向于从低位开始。CAN 控制器和这些微控制器配合紧密,采用低位在前的传输方式可与微控制器的数据处理流程更好匹配,降低数据转换开销。
数据处理效率角度
  • 高效解析数据:数据处理中,低位数据常包含更详细信息。从低位开始处理能更快获取关键信息,提升处理效率。并且对于按位操作的算法,从低位开始可减少循环次数,加快处理速度。
  • 满足实时性要求:CAN 常用于实时控制系统,对数据传输和处理的实时性要求高。低位在前能让接收端更快获取有效数据,从而更快处理和响应,适应快速决策和控制的应用场景。
兼容性与历史角度
  • 遵循行业传统:早期电子系统和通信协议多采用低位在前的方式,CAN 协议延续此传统以保持与其他系统的兼容性,便于不同厂商设备通信和互操作,降低系统集成难度。
  • 降低数据转换成本:采用低位在前可与大多数系统保持一致,避免与其他系统交互时进行额外的数据转换操作,减少系统复杂度和成本。

RS - 485 数据传输顺序特点

本身无固定字节序
  • RS - 485 本质上是一种物理层通信标准,主要规定了电气特性、传输介质等方面,并没有对数据的字节序(高位在前还是低位在前)作出强制性规定。它只是提供了一个可靠的差分信号传输平台,用于长距离、高速率的数据通信。
取决于上层协议和应用需求
  • 与应用场景适配:不同的应用场景对数据传输顺序有不同要求。例如,在某些工业自动化控制系统中,为了与特定的传感器或执行器进行数据交互,可能会根据设备的通信规范采用高位在前的方式,以便直接与设备进行数据对接,减少数据转换的步骤。
  • 延续已有协议规范:如果 RS - 485 通信采用了某种特定的上层协议(如 Modbus 协议),那么数据传输顺序会遵循该协议的规定。Modbus 协议中默认的数据传输方式是高位在前,因此在基于 Modbus 协议的 RS - 485 通信中,就会采用高位在前的方式进行数据传输。
### 原理及相关知识 #### 数据高位低位在后 不同通信协议系统的数据传输顺序有所差异,RS - 485 本身没有固定要求高位低位在后,其数据传输顺序多取决于具体应用上层协议。比如在基于 Modbus 协议的 RS - 485 通信中,默认的数据传输方式是高位 [^3]。 #### CRC 校验低位高位在后 CRC 校验中,不同类型的 CRC 校验码传输顺序不同。以 Modbus 协议的 CRC 校验为例,最终得到的 CRC 码是经过一系列计算后,将 16 位 CRC 寄存器的高、低字节进行交换得到的,且注意 CRC16 先发低位再发高位 [^1][^2]。 Modbus 协议 CRC 校验码计算步骤如下: 1. 预置 1 个 16 位的寄存器为十六进制 FFFF(即全为 1),称此寄存器为 CRC 寄存器。 2. 把第一个 8 位二进制数据(即通讯信息帧的第一个字节)与 16 位的 CRC 寄存器的低 8 位相异或,把结果放于 CRC 寄存器。 3. 把 CRC 寄存器的内容右移一位(朝低位)用 0 填补最高位,并检查右移后的移出位。 4. 如果移出位为 0,重复第 3 步(再次右移一位);如果移出位为 1,CRC 寄存器与多项式 A001(1010 0000 0000 0001)进行异或。 5. 重复步骤 3 4,直到右移 8 次,这样整个 8 位数据全部进行了处理。 6. 重复步骤 2 到步骤 5,进行通讯信息帧下一个字节的处理。 7. 将该通讯信息帧所有字节按上述步骤计算完成后,得到的 16 位 CRC 寄存器的高、低字节进行交换。 8. 最后得到的 CRC 寄存器内容即为 CRC 码 [^2]。 ### 代码示例 以下是一个 CRC8 校验的代码示例,其中 crc8 高位在左低位在右: ```python #include <stdio.h> #include <stdint.h> // CRC8 计算函数 uint8_t Crc8(const void* vptr, int len) { const uint8_t *data = (uint8_t*)vptr; unsigned crc = 0; int i, j; for (j = len; j; j--, data++) { crc ^= (*data << 8); for(i = 8; i; i--) { if (crc & 0x8000) { crc ^= (0x1070 << 3); } crc <<= 1; } } return (uint8_t)(crc >> 8); } int main(int argc, char *argv[]) { uint8_t c[5]= {0x04,0x03,0x00,0x01,0x00}; printf("Crc8=0x%02x\n", Crc8(c, 5)); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值