📄 报文格式说明.txt
字号:
typedef struct
{
unsigned char ff;
unsigned char id1;
unsigned char id2;
unsigned char id3;
unsigned char id4;
unsigned char data[8];
}CAN_RPACKET;
元素:
ff: 报文格式
第7位为1表示扩展格式,报文标识符为4个字节
为0表示标准格式,报文标识符为2个字节
第6位为1表示远程幀
为0表示数据幀
第0~3位表示报文数据长度
id1: 报文标识符1
id2: 报文标识符2
id3: 报文标识符3
id4: 报文标识符4
data[8]: 报文数据,报文数据最大长度为8
其中,id1,id2,id3,id4我再作下简单说明:
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
id1: id28 id27 id26 id25 id24 id23 id22 id21
id2: id20 id19 id18 id17 id16 id15 id14 id13
id3: id12 id11 id10 id9 id08 id07 id06 id05
id4: id04 id03 id02 id01 id00 rtr x x
分情况讨论下:如果是标准桢,那么只取id18-1d28共11位标识符;如果是扩展桢,那么取id0-id28共29位标示符。
其中,如果是接受包,在标准桢格式中,id17是rtr位,即远程桢,在扩展桢格式中,rtr位是远程桢标示位。这个桢的含义是:远程接受方发现一个数据报文错误,发出此桢,要求本地再把和这个远程桢相同报文标示符的桢重发一遍。所以,接受方如果接受到远程桢,需要作相应重发处理。
typedef struct _CAN_PORTSTRUCT{
enum fil filter;
enum lis lis_on;
enum tes test;
enum sle sleep;
enum bau baud_rate;
unsigned char code1;
unsigned char code2;
unsigned char code3;
unsigned char code4;
unsigned char mask1;
unsigned char mask2;
unsigned char mask3;
unsigned char mask4;
}CAN_PORTSTRUCT;
元素:
filter: 报文接收筛选器模式:
SIN 一 单筛选器模式 默认
DOU 一 双筛选器模式
lis_on: 是否只听模式
LOFF 一 正常模式 默认
LON 一 只听模式
test: 是否自测模式
TOFF 一 正常模式 默认
TON 一 自测模式
Sleep: 是否睡眠模式
SOFF 一 正常模式 默认
SON 一 睡眠模式
baud_rate: 波特率
B1000 一 1000kbit/s B800 一 800kbit/s
B500 一 500kbit/s B320 一 320kbit/s
B250 一 250kbit/s 默认 B160 一 160kbit/s
B80 一 80kbit/s B40 一 40kbit/s
B20 一 20kbit/s B10 一 10kbit/s
B5 一 5kbit/s B125 一 125kbit/s
code1: 接收码寄存器1
code2: 接收码寄存器2
code3: 接收码寄存器3
code4: 接收码寄存器4
mask1: 接收屏蔽寄存器1
mask2: 接收屏蔽寄存器2
mask3: 接收屏蔽寄存器3
mask4: 接收屏蔽寄存器4
code和mask寄存器和标示符寄存器是一一对应的,在接受时,can控制器会使用这2个数值和标示符按位做逻辑运算,所有结果都等于真即接受,非即忽略。
逻辑运算是:设id为A,code为B,mask为C,公式即为: - -
(AB+AB)C
除与mask的置1位(无关位)对应的位之外,code和id的其余对应位逐位进行比较,若均相同(同为0或同为1),该报文被接收,存入报文接受缓冲器,否则删除。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -