A. CAN标准帧格式
B.CAN扩展帧格式
C.帧间间隔
假设
Ui:各个信息帧占用总线百分比
L:为报文的总长度
C:为报文的总线占用时间
N:为填充的位数
t:为毛速率 ( 亦称波特率 )下的位时间
则有:
L = N + 8d + g + 13
C = L * t
Ui = C / T
然而总线负载率是各个信息帧占用总线百分比之和。
U = U1 + U2 + U3 + .....
g 为 CAN 报文中控制位的总位数 ( 标准帧 g =34 , 扩展帧 g = 54 )
g的取值是只取位填充部分除去数据段;
13:无位填充段 + 帧间间隔
网络负载率算法例子:
网络负载率是 1s 内网络总线传输数据所占带宽的百分率。以上图网络矩阵表为例,假设总线速度为500Kbps,网络中有多帧信号,把每个信号帧所占的负载率算出来,相加即得到总的网络负载率。FBCM_1/FBCM_2这两帧的所占的负载率算法如下:
负载率1 = (1000ms / 20ms) * 111 / 500000 = 0.0111 = 1.11%
负载率2 = (1000ms / 10ms) * 111 / 500000 = 0.0222 = 2.22%
公式中111为 8字节的数据帧在不考虑填充位的情况下的所含位数。
111 = 34 + 13 + (8 byte X 8bit) = 47 + 64
下面我们看 TTCAN中有这么一个公式:
按照CAN协议,相同电平持续5位,在下一位要插入1位与前5位反型的电平。
可知:(34 + 8s)/5 得到的填充位数,所以对于一帧完整的位数,我们可以假设包含上间隔位,
则:填充位:(34 + 8s)/5
数据位:8s
报文格式位:34 + 10 + 3 = 47
uint crccale(uchar *bitbuf,uchar len)
{
uint crcreg,nextbit; //crc计算
// bit crcnext;
uchar i=0;
crcreg=0;
while(i<len)
{
nextbit=((uint)(bitbuf[i++])) << 14;
crcreg=nextbit^crcreg;
crcreg<<=1;
if(crcreg&0x8000)crcreg^=0x4599;
}
return (crcreg&0x7fff);
}