linux下socketCAN实现反转过滤——CAN_INV_FILTER的使用

CAN的过滤器设置 阅读详情

关于Linux中socket can怎么使用,优快云上已经有很多文章介绍。本文重点记录can_filter中的 CAN_INV_FILTER的使用,很多文章对此一笔带过,且很多文章翻译不全,或者原文不全,导致自己浪费了些时间,最后在看candump源码时才发现问题所在。

直接贴代码解释,以下为写的一个最简单的canId过滤函数:

宏定义

/** CAN报文过滤方式 **/
#define CAN_FILTER_PASS     0x01    //过滤方式-通过
#define CAN_FILTER_REJECT   0x02    //过滤方式-拒绝

函数声明

    /**
     * @brief canRcvFiltersSet - CAN报文接收过滤设置
     * @param canIdArray: 数组中每个元素为要过滤的canId且不能为0;若该参数置为NULL,则表示该Can口不需要接收任何报文
     * @param arraySize: 数组大小,若canIdArray置为NULL,则该项置0
     * @param filterType: 过滤方式的宏定义,若canIdArray置为NULL,则该项置0,否则应为以下二选一
     *          CAN_FILTER_PASS: 只接收与canIdArray中canId一致的报文
     *          CAN_FILTER_REJECT: 与canIdArray中canId一致的报文都不接收,其它报文接收
     * @return true:成功,false:失败
     */
    bool canRcvFiltersSet(const uint *canIdArray, const uint &arraySize, short filterType);

函数定义

bool rcvFiltersSet(const uint *canIdArray, const uint &arraySize, short filterType)
{
    if(canfd <= 0)	//canfd就不用解释了…
        return false;

    if(NULL == canIdArray){
        setsockopt(canfd, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);    //不需要接收任何报文
        return true;
    }

    struct can_filter rfilter[arraySize];
    bzero(rfilter,sizeof (rfilter));

    for(uint i = 0; i < arraySize; ++i){
        if(canIdArray[i]){
            if(filterType & CAN_FILTER_PASS){
                rfilter[i].can_id = canIdArray[i];
            }
            else{
                rfilter[i].can_id = (canIdArray[i] | CAN_INV_FILTER);
            }
            rfilter[i].can_mask = CAN_EFF_MASK; //这个掩码怎么设置看自己需求
        }else{
            return false;
        }
    }
    //重点!!!很多文章没提到这一点,过滤器反转时需要设置,使各过滤器之间由逻辑或变成逻辑与关系,
    //否则设置的反转过滤器因为相互矛盾导致不起作用
    //简单举例解释,过滤器A接收除0x123之外的报文,过滤器B接收除0x124之外的报文,
    //那么0x123虽然被过滤器A过滤了,但是会被过滤器B通过,同理0x124会被过滤器A通过,所以实际上不起作用
    //下面的设置就是让过滤器之间join起来,只有符合所有过滤器的规则才会被通过
    if(filterType & CAN_FILTER_REJECT){
        int join_filter = 1;
        setsockopt(canfd, SOL_CAN_RAW, CAN_RAW_JOIN_FILTERS, &join_filter, sizeof(join_filter));
    }
    setsockopt(canfd, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
    return true;
}

使用示例:

     *     const uint can_id_reject[] = {0x123, 0x11111678, 0x282};	//除这三种canid之外的报文,都接收
           canRcvFiltersSet(can_id_reject, sizeof(can_id_reject)/sizeof(uint), CAN_FILTER_REJECT);
           
     *     const uint can_id_pass[] = {0x123, 0x11111678, 0x282};	//只接收这三种canid报文,其它不接收
           canRcvFiltersSet(can_id_pass, sizeof(can_id_pass)/sizeof(uint), CAN_FILTER_PASS);

完。

socketcan编程如何如何进行滤波设置 阅读详情

相关推荐

【CAN 通讯】在Socket CAN中使用掩码进行报文过滤

在现代车辆网络中,高效的数据通信是确保系统整体性能的关键。特别是在使用Controller Area Network (CAN)的场合,如何准确快速地处理海量的报文成为了一个挑战。为了应对这一挑战,CAN报文过滤技术应运而生,而掩码(Mask)的设置则是这一技术中最为核心的部分。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 2721

linux can 接收过滤器设置

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

EmbeddedOsprey 1895

RK3568开发笔记-socketCan编程

CAN是ControllerArea Network(控制器局域网)的缩写。CAN通信协议在1986年由德国电气商博世公司所开发,主要面向汽车的通信系统。现已是ISO国际标准化的串行通信协议。根据不同的距离、不同的网络,可配置不同的速度,最高速度为1MBit/s。can总线协议的内容相对来说比较多,在此不做详细介绍,本文主要介绍socket can的使用方法。

flypig has a dream! 3914

关于linux can部分的消息过滤设置 Canbus ID filter and mask

Linux CAN 编程详解 https://blog.youkuaiyun.com/ppdyhappy/article/details/79458458 Canbus ID filter and mask https://blog.youkuaiyun.com/weixin_34253539/article/details/85745180

usstmiracle的博客 2341

SAP BAPI调用避坑指南:处理MD61/MD62计划独立需求时,这些参数和返回值你必须检查

本文详细解析了SAP BAPI调用中处理MD61/MD62计划独立需求的关键参数和返回值检查要点,包括版本控制、日期类型和删除标记等核心参数设置,以及常见错误排查和高级调试技巧,帮助开发者高效管理需求计划数据。

weixin_30316097的博客 610

给粒子物理萌新的Geant4保姆级入门:从看懂B1示例代码到跑通第一个模拟

本文为粒子物理初学者提供Geant4的保姆级入门指南,从解析B1示例代码到跑通第一个模拟。详细介绍了环境准备、代码解析、可视化系统实战及扩展模拟的方法,帮助新手快速掌握Geant4的基本概念和工具包使用。

weixin_29231725的博客 500

【Linux CAN应用编程(2)】SocketCAN 应用编程全流程讲解(附代码)

由于 Linux 系统将 CAN 设备作为网络设备进行管理,因此在 CAN 总线应用开发方面,Linux 提供了 SocketCAN 应用编程接口,使得 CAN 总线通信近似于和以太网的通信,应用程序开发接口更加通用,也更加灵活。SocketCAN 中大部分的数据结构和函数在头文件 linux/can.h 中进行了定义,所以,在我们的应用程序中一定要包含头文件。

cj_lsk的博客 7303

oracle p6 破解版下载,Primavera P6项目管理软件 16~17 图文详细安装教程(附下载)

Primavera P6 Professional项目管理软件结合了Oracle和Microsoft SQL Server关系数据库,是一款非常好用且功能强大的综合的项目管理软件(PPM) 解决方案,主要用于土建等方面的施工计划分析,具有进度时间安排与资源控制功能的多用户、多项目系统,支持多层项目分层结构、角色与技能导向的资源安排、记录实际数据、自定义视图以及自定义数据,本文主要为大家图文详细介绍...

weixin_33978451的博客 4909

Linux CAN编程详解

原文博客地址  http://velep.com/archives/1181.html 通过读这篇博客是我搜索can通讯以来讲解的最详细的一篇,还有其自己写的一刻关于can控制的程序都是非常棒的, Linux 系统中CAN 接口配置 在 Linux 系统中, CAN 总线接口设备作为网络设备被系统进行统一管理。在控制台下, CAN 总线的配置和以太网的配置使用相同的命令。

lizhu_csdn的专栏 5万+

微信小程序 - 解决报错 {“errcode“:41002,“errmsg“:“appid missing, rid: X“} 微信报错错误码errcode“:41002问题分析及解决教程(详细排查)

【微信小程序】报错{“errcode“:41002,“errmsg“:“appid missing, rid: 64e55770-67c1fb7e-027c5a70“}:【微信小程序】微信小程序登录请求出现appid missing提示,微信公众号{"errcode":41002,"errmsg":"appid missing"},微信 报错{“errcode“:41002,“errmsg“:“appid missing,微信小程序获取openid返回appid missing的问题,微信小程序提示Erro

🏆 前端领域优质创作者 5651

海康visionmaster开发笔记10-集成HALCON第三方算子到VM工具箱的方法

海康visionmaster开发笔记10-HALCON第三方算子到VM工具箱的方法

视觉人机器视觉的博客 4347

socket can 编程

Socket can 文档原名称:can.txt,位于 linux-3.2.0-m3352/Documentation/networking/can.txt。 CAN 控制器局域网络协议族之 Readme 文件(aka Socket CAN)。另外在该文档的后边附加一个CAN收发测试程序,用于与下位机通信。 目录 1 概述 / 什么是 Socket CAN? 2 目的 / 为什么要使用 socket API? 3 socket can 概念 3.1 接收列表 3.2 数据发送的本地回环模式(loopback

Mr.W的博客 9071

LoRa学习:LoRa通信调制解调的实现原理与性能

LoRa学习:LoRa调制解调原理与性能 1、LoRa调制解调器原理 LoRa调制解调器采用专利扩频调制和前向纠错技术。与传统的FSK、OOK调制技术相比,LoRa扩大了无线通讯链路的覆盖范围(实现了远距离无线传输),提高了链路的鲁棒性。。 开发人员可调整扩频因子和纠错率这两个参数,从而平衡通讯时的带宽占用、通信速率、空中包的存活时间、以及抗干扰性等。。 LoRa调制解调器...

HowieXue 薛永浩的博客 3万+

Linux应用层例程7 CAN 应用编程基础

CAN 是一种多主方式的串行通讯总线,基本设计规范要求有高的位速率,高抗电磁干扰性,而且能够检测出产生的任何错误。经过几十年的发展,现在,CAN的高性能、高可靠性以及高实时性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。以汽车电子为例,汽车上有空调、车门、发动机、大量传感器等,这些部件、模块都是通过 CAN总线连在一起形成一个网络,车载网络构想图如下所示:CAN 总线使用两根线来连接各个单元:CAN_H和CAN_L,CAN。

internetv的博客 4985

手把手教你完成基于YOLOv8的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理系统

手把手教你完成基于YOLOv8的商店的水果/商品/食堂/蔬菜/饮料/书籍识别与计价系统,前台+后台管理员系统,可进行目标检测的操作和展示,实现对图片、视频和摄像头的实时目标检测

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2456

传导案例:某医疗仪器传导骚扰整改案例

紫外线光疗仪是一种专业的医疗设备,主要用于治疗银屑病、白癜风等皮肤疾病。该设备采用物理治疗技术,通过特定波长的紫外线照射人体来达到治疗效果。自1984年窄谱中波紫外线(NB-UVB)应用于临床以来,该技术已成为治疗早期蕈样肉芽肿(MF)的有效方法之一。作为二类医疗器械,紫外线光疗仪必须符合严格的电磁兼容性(EMC)标准,这不仅关系到设备自身的稳定运行,更关乎患者的使用安全和治疗效果。紫外线光疗仪传导骚扰整改案例充分展示了系统性EMC设计的重要性。

m0_56451176的博客 340

linux CAN控制器使用--基于Nvidia-TX2

CAN总线在linux平台下的使用笔记,基于Nvidia-TX2

lishidetiankong的博客 5906

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Linux的can口编程

1.先启动can 1.在linux下先使用ifconfig -a命令 如图显示出来can0和can1。此时can0是打开的,can1是关闭的。 2.使用shell脚本打开你要打开的can口,并设置波特率。 #/bin/sh ifconfig canX down #把canX关闭 # set bitrate /sbin/ip link set canX type can bitrate xxxxxx #设置canX的波特率位xxxxxx ifconfig canX up #把canX打开

优快云_dyq111的博客 3529

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Unix/C/C++进阶--SocketCAN 编程

Unix/C/C++进阶--SocketCAN 编程

天道酬勤 5630

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Linux 底软开发——对CAN的详细操作(周期发送,异常检测,过滤报文)

嵌入式平台下通过C语言读取发送CAN报文的详细操作。包括如果解决CAN异常掉线,过滤不需要的报文操作。

weixin_46999174的博客 2832

关于candump 命令中 filter 过滤的解释

only SFF and non-RTR frames” 表示只包括标准帧(Standard Frame Format,SFF)和非远程帧(non-RTR frames)。(match only for extended CAN ID 12345678) 只支持扩展帧,且can id 是 12345678。的虚拟 CAN 接口,并只捕获 CAN ID 为 123 的消息,包括扩展帧(EFF)和远程帧(RTR)消息。标准帧(Standard Frame Format,SFF)7、数据过滤的公式 是。

sunfanup的博客 1946

socketcan笔记

socketcan #define CAN_MAX_DLC 8 #define CANFD_MAX_DLC 15 struct can_frame { canid_t can_id; // 32 bit CAN_ID + EFF/RTR/ERR flags //****--!--**** __u8 can_dlc; // frame payload length in byte (0...

u012084226的博客 931

Linux SOcket CAN 学习笔记

要实现同一网络节点上的应用程序之间能相互交换数据,如果CAN网络的硬件不支持回环功能,一种低效的方案是使用Socket CAN核心部分来实现软件回环 CAN错误帧的详细格式定义在linux头文件中:include/linux/can/error.h 可过滤后传给用户:当一个物理层或者MAC层的错误被(CAN控制器)检测到之后,驱动创建一个相应的错误帧。错误帧可以被应用程序通过CAN的过滤机制请求...

Kevin的博客 3134

Linux CAN通信(二)

经过canbus模块的学习,自己根据通信协议以及上一节的代码实现报文的接收与发送。希望能给读者提供帮助。

BigDavid123的博客 1845

Linux下的can 设备测试

can 设备在Linux下的使用及编程, 含有C参考代码, python 参考代码。以及配置方式等内容,适合初学接触进行设备调试的人员。

恍恍惚惚的大穷猫的博客 4375

Linux can编程

1、 CAN总线协议:        控制器局域网CAN最初用于汽车的检测与控制,采用两根差分线(CAN_H和CAN_L)传输,能够实现多主机通信,详细内容可参考网址http://blog.sina.com.cn/s/blog_5049ed020102vzra.html和博客https://www.cnblogs.com/spoorer/p/6649303.html,个人认为这两篇文章已经讲的足...

weixin_42218802的博客 2166
上一篇: libevent中关于bufferevent_socket_connect的使用小结
下一篇: linux使用mmap共享内存封装动态库,实现全局变量对外只读接口
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值