设置只接收固定的标准帧和扩展帧(目标位完全匹配,其他 id 位可随意)

#define CAN_FILTER_ID_TARGET_BIT_WIDTH 				4   // 设置 ID 宽度(即用帧 ID 的多少 bit 作为目标 ID 号,目前最大支持 8) 
#define CAN_FILTER_ID_TARGET_BIT_MASK 				(0xff >> (8 - CAN_FILTER_ID_TARGET_BIT_WIDTH)) // 目标 id 的屏蔽位

 
#define CAN_FILTER_EXT_ID_TARGET_OFFSET 			(29 - CAN_FILTER_ID_TARGET_BIT_WIDTH) // 扩展帧占用高位作为目标 id 号,其他位为数据唯一 id 号
#define CAN_FILTER_EXT_ID_TARGET_MASK 				(CAN_FILTER_ID_TARGET_BIT_MASK << CAN_FILTER_EXT_ID_TARGET_OFFSET)

 
#define CAN_FILTER_ID_TARGET_OFFSET 				(11 - CAN_FILTER_ID_TARGET_BIT_WIDTH) // 标准帧占用高位作为目标 id 号,其他位为数据唯一 id 号
#define CAN_FILTER_ID_TARGET_MASK 					(CAN_FILTER_ID_TARGET_BIT_MASK << CAN_FILTER_ID_TARGET_OFFSET)

void set_filter(int target_id){
	struct can_filter filter[2];
	int inc = 0;
	// 设置过滤器,接收 EXT 并且 target_id 完全符合匹配的数据帧,注意 CAN_EFF_FLAG
	filter[inc].can_id   = (target_id << CAN_FILTER_EXT_ID_TARGET_OFFSET) | CAN_EFF_FLAG;
	filter[inc].can_mask = CAN_FILTER_EXT_ID_TARGET_MASK | CAN_EFF_FLAG;   
	inc++;
	// 设置过滤器,接收 STD 并且 target_id 完全符合匹配的数据帧,注意 CAN_SFF_MASK
	filter[inc].can_id   = (target_id << CAN_FILTER_ID_TARGET_OFFSET);
	filter[inc].can_mask = CAN_FILTER_ID_TARGET_MASK | (CAN_EFF_MASK & (~CAN_SFF_MASK));
	inc++;
	if(inc > sizeof(filter) / sizeof(filter[0]))
	{
		exit(-1);
	}
	(void)setsockopt(recv_socket_fd, SOL_CAN_RAW, CAN_RAW_FILTER, filter, sizeof(filter));
}
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐