下午好🌅🌅🌅
本答案参考ChatGPT-3.5
首先要明确一个概念,CAN通信中有两种ID:标准帧ID(11位)和扩展帧ID(29位),在这段代码中,FIFO选择的是扩展帧ID。下面是解决方案:
-
在CAN通信中,标准帧和扩展帧的ID都是由11或29位二进制数字组成,而不仅仅是8位。学长右移21位后,相当于把ID的高8位移动到了整个ID的低8位位置,低21位舍去。这是为了方便后面的比较和筛选。
-
右移三位后,识别的不再是扩展帧ID的8位(实际上是11或29位),而是把ID的位移动到了整个ID的低8位位置。在比较FIFO中的ID和消息中的ID时,也只会比较这8位,这样就可以筛选出ID相同的消息。
-
如果需要比较扩展帧ID的29位,而不仅仅是8位,可以将右移的位数调整为11位。
下面是可能修改过的代码,作为参考:
/* 接收FIFO筛选 */
/* ID为扩展帧ID的前29位,掩码为1(比较)时才比较,0则忽略 */
CAN_FilterConfTypeDef FilterConf;
FilterConf.FilterFIFOAssignment = CAN_FilterFIFO0;
FilterConf.FilterMode = CAN_FILTERMODE_IDMASK;
FilterConf.FilterScale = CAN_FILTERSCALE_32BIT;
FilterConf.FilterIdHigh = ((msg->header.id >> 21) & 0xFFFF); // 获取扩展帧ID的高16位
FilterConf.FilterIdLow = ((msg->header.id >> 5) & 0xFFFF); // 获取扩展帧ID的低16位
FilterConf.FilterMaskIdHigh = 0xFFFF; // 高16位掩码为0xFFFF,全部比较
FilterConf.FilterMaskIdLow = 0xFFFF; // 低16位掩码为0xFFFF,全部比较
FilterConf.FilterActivation = ENABLE;
FilterConf.FilterBank = 0;
HAL_CAN_ConfigFilter(&hcan, &FilterConf);