linux can 接收过滤器设置

设置只接收固定的标准帧和扩展帧(目标位完全匹配,其他 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));
}

你可能感兴趣的:(linux,后端)