因为CAN模块的发送缓冲区是16字节(只够放一帧报文),接收缓冲区是64字节(可以放多帧报文)。
一帧报文在缓冲区存放占用的空间是4的整数倍字节,例如标准帧总共11个字节,在缓冲区内占用12字节空间;扩展帧总共13个字节,在缓冲区内占用16字节空间。
所以定义发送缓冲区只有一帧:CAN_DataDef CAN1_Tx;
接收缓冲区定义了8帧数据空间:CAN_DataDef CAN1_Rx[8];
对于大部分应用场景,接收缓冲区定义8帧数据结构已经是够用的了,如果一帧数据很短,64字节可以存放超过8帧报文的话,可以增加CAN1_Rx数组数量。
复制代码 将缓冲区内数据一帧帧读取出到CAN1_Rx,其中 n 是当前缓冲区收到的报文帧数。
- for(i=0;i<n;i++) //帧数
- {
- // CanSendMsg(&CAN1_Rx[i]); //CAN总线原样返回
- printf("CAN1:ID=0x%08lX DLC=%d FF=%d RTR=%d ",CAN1_Rx[i].ID,CAN1_Rx[i].DLC,CAN1_Rx[i].FF,CAN1_Rx[i].RTR); //串口打印帧信息
- for(j=0;j<CAN1_Rx[i].DLC;j++) //当前帧数据长度
- {
- printf("0x%02X ",CAN1_Rx[i].DataBuffer[j]); //从串口输出收到的数据
- }
- printf("\r\n");
- }
复制代码
以上代码是将当前从FIFO读取的报文,一帧帧通过串口打印出来。
报文从FIFO读取到CAN1_Rx后,CAN控制器就可以继续接收新的报文放入FIFO空间,从CAN1_Rx打印数据或者进行分析过程,不会影响数据接收。 |