CAN协议制定如何减少带宽占用
CAN协议帧类型分为标准帧(11位ID)和扩展帧(29位ID),两种CAN数据帧都有一个帧数范围,总会有使用完的时候,因此如果是在功能复杂的协议中要尽可能的减少ID的个数,不仅能减少资源的占用还能提高协议的可阅读性。
CAN协议的制定无非就是设备与设备两者之间的一种约定,设计者可根据自己的使用需求去命名CAN ID的以及帧内容,在设计时应当要考虑到通讯效率、安全性、准确性等问题。
在这里,本伽椰子通过工作经验总结了几种减少带宽占用率方法:
1.使用协议嵌套的方式,例如此时有一个CANID为0x180,但是需要使用此ID来实现5个功能,此时可以将 CAN数据帧的第0个Byte用作标识,Byte0==1是对应某某功能,Byte1==2对应某某功能,以此类推。
CANID | Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
0x180 |
Byte0 == 1 : 功能一 Byte0 == 2 : 功能二 ... |
功能一数据内容 功能二数据内容 ... |
功能一数据内容 功能二数据内容 ... |
功能一数据内容 功能二数据内容 ... |
功能一数据内容 功能二数据内容 ... |
功能一数据内容 功能二数据内容 ... |
功能一数据内容 功能二数据内容 ... |
功能一数据内容 功能二数据内容 ... |
2、多层嵌套,在1的基础上可将Byte1、Byte2...等用作功能标识,虽然能减少带宽占用,但会增加数据解析所需的时间;
CANID | Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
0x180 |
Byte0 == 1 : 功能一 Byte0 == 2 : 功能二 ... |
Byte0 == 1 , Byte1 == 1 :功能三 Byte0 == 1 , Byte1 == 2 :功能四 Byte0 == 2 , Byte1 == 1 :功能五 Byte0 == 2 , Byte1 == 2 :功能六 |
数据内容 |
数据内容 |
数据内容 |
数据内容 |
数据内容 |
数据内容 |
3、物尽其用,将每帧里面每个bit都考虑到位,对每个bit都赋予意义;
CANID | Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
0x180 |
bit0 : 某开关量 bit1 : 某开关量 ... |
bit0 : 某开关量 bit1 : 某开关量 ... |
bit0 : 某开关量 bit1 : 某开关量 ... |
bit0 : 某开关量 bit1 : 某开关量 ... |
bit0 : 某开关量 bit1 : 某开关量 ... |
bit0 : 某开关量 bit1 : 某开关量 ... |
bit0 : 某开关量 bit1 : 某开关量 ... |
bit0 : 某开关量 bit1 : 某开关量 ... |
4、减少数据帧长度,一般的CAN帧长度为8Byte,若CAN帧中存在空数据(即无用数据位),可考虑不发送该Byte 例如CANID 0x180 只有Byte0和Byte1有用,那么在CAN数据帧打包时可将后面的5个Byte不发送;
CANID | Byte0 | Byte1 |
0x180 |
bit0 : 某开关量 bit1 : 某开关量 ... |
bit0 : 某开关量 bit1 : 某开关量 ... |
5、数据定时发送,对数据量大,但是读取频率要求不高的数据帧可定时发送(如10分钟发送一帧),减少带宽占用 ;0x180与0x181都有X轴与Y轴数据,如果对0x180数据帧读取频率要求不高,则可以对0x180做定时发送,减少同一时间总线上数据量的大小,从而达到减少带宽占用。
CANID | Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
0x180 |
X轴 |
Y轴 | 年 | 月 | 日 | 时 | 分 |
秒 |
CANID | Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
0x181 |
X轴 |
Y轴 |
注:在CAN协议中,ID越小的数据帧优先级越高,这是由CAN协议底层决定了;