CAN总线开发必看! 如何使用CANlib检测CAN帧溢出情况? Kvaser三招帮你轻松解决

在这里插入图片描述
从1980年代,Kvaser就开始CAN产品的研发,在相关产品开发领域有近40多年的经验,对CAN和相关总线技术有着非常深入的研究。广州智维电子科技是KVASER的中国引进者,我们会不定期分享一些有趣的发现和特定情况的技术处理。

在开发严重依赖通信协议的软件应用程序时,关键问题之一是:应用程序快速地处理传入的报文,而不会丢弃报文。本文就将分享如何使用CANlib检测CAN帧溢出情况。

在将CAN数据导入应用程序时发生丢失CAN帧的情况,通常是由于应用程序花费太多时间处理某一报文,应用程序暂停等待用户交互,或者应用程序正在等待共享系统资源,如数据文件等等。不管什么原因,应用程序开发人员应该计划检测这些丢弃的报文,以防止在由应用程序行为导致错误时搜索系统问题。

为了检测这个问题,CANlib提供了三种方法来检查接收缓冲区状态和确定CAN帧是否已经丢弃:

1.canRead标志参数

用于确定CAN帧是否已被丢弃的第一种方法是监视由canRead函数返回的标志参数。标志参数包含两个位,它们表示在此函数调用和和当前调用返回的最后一个报文之间是否发生软件或硬件溢出。这些位被定义为用于硬件溢出的canMSGERR_HW_OVERRUN和用于软件溢出的canMSGERR_SW_OVERRUN。你也可以使用canMSGERR_OVERRUN掩码同时检查这两种情况。因此,当应用程序检查到这些位集中的一个时,应用程序就会获知在当前CAN帧和接收的前一个CAN帧之间丢弃了报文。

要了解在使用软件的情况下如何显示,可以假设一个接收缓冲区,它可容纳10帧(当然,CANlib中的实际默认接收缓冲区大小远大于10)。硬件已接收到10个CAN帧并将其放入可填入的缓冲区。
在这里插入图片描述

硬件接收到另一个CAN帧,但接收缓冲区已满,因此该帧未添加到缓冲区。
在这里插入图片描述

硬件接收到第12个CAN帧,覆盖未添加到缓冲区的帧。
在这里插入图片描述

应用程序调用canRead删除第一个接收的CAN帧,并为要添加到接收缓冲区的第12帧留下点。

第1到10的CAN帧在由canRead检索时不会指示溢出。当第11帧丢弃,通过canRead从缓冲区检索时,第12个CAN帧将指示溢出。

canReadStatus

用于确定CAN帧是否已被丢弃的第二种方法是调用canReadStatus。如果设置了canSTAT_HW_OVERRUN或canSTAT_SW_OVERRUN位,该函数返回的标志参数将指示溢出。你可以使用canSTAT_OVERRUN掩码检查这些溢出位是否已设置。

此状态信息是异步更新的,意味着canReadStatus返回的值是最后一次报告的值,但不一定是当前状态。要确保报告的数据是最新的,你可以以周期性速率调用canRequestChipStatus。canRequestChipStatus要求更新状态信息,但是函数退出时信息不是最新的。调用完成后将保持当前的状态一段时间。

所以让我们拿前面的我们的完整的缓冲区以及硬件接收到第11个报文为例来说明。我们每秒调用canRequestChipStatus两次,每秒调用一次canReadStatus。
在这里插入图片描述

此时canReadStatus不会指示溢出。当硬件接收到第12个CAN帧覆盖未添加到缓冲区的帧时,芯片状态改变以指示溢出。
在这里插入图片描述

在下一个周期性canRequestChipStatus调用过程中报告该状态开始。当进程完成时,下一次调用canReadStatus将指示溢出。这意味着根据第12个CAN帧在canRequestChipStatus和canReadStatus调用的周期中到达的时间,canReadStatus调用将不会在事件(在本例中)后最多一秒钟指示状态。

一旦在canReadStatus调用的标志参数中指示溢出,状态将保持锁定状态,直到你使用canIOCtl例程与canIOCTL_CLEAR_ERROR_COUNTERS函数清除状态。这是为了防止应用程序由于检查到溢出和使用canReadStatus例程轮询状态之间的竞争情况而丢弃检测到的溢出。

请求接收缓冲区级别

第三种方法是通过使用函数参数设置为canIOCTL_GET_RX_BUFFER_LEVEL的canIoCtl例程来监视接收缓冲区的当前深度。返回的缓冲区将是当前存储在接收缓冲区中的CAN帧的计数。

请记住,有时候与其把时间花费在检查缓冲区级别,不如花点时间清空接收缓冲区。在执行预定义块传输时,检查接收缓冲区级别可能更有用,其中应用程序可以等待直到在处理帧之前接收到整个块。

注意事项

你可能会注意到,当使用第二、三个方法(canReadStatus或canIOCTL_GET_RX_BUFFER_LEVEL)时,如果缓冲区已满并处于溢出状态,那么在接下来的canRead调用中指示溢出状态。要在这些方法中检索数据,接收队列必须置于稳定状态,以便检查整个队列。在此过程中,由于空间不足,报文可能在驱动程序和应用程序缓冲区之间被丢弃。这种丢弃由使用canRead检索的下一个CAN帧的溢出状态表示。

要点总结

应用程序开发人员应该在canRead()处理期间始终检测丢弃的报文,以防止在由应用程序行为导致错误时搜索系统问题。你的应用程序设计可能会对CAN总线上的流量造成问题,这是你的第一条指示。使用此方法进行监视将有助于在握手报文丢弃或预期的周期性报文超时时,确定故障发生在何处。虽然你可以使用单独的工具来监视总线上所需的报文,但监视溢出标志将指示你的应用程序节点是最终原因或至少有风险。

你可以使用canRead溢出信息来跟踪溢出的频率。当流量带宽由于报文突发而增加时,这可以识别应用的可能问题。

当在GUI上指示当前溢出状态或向用户发出重要报文可能已被丢弃的警告时,使用canReadStatus方法。

当你愿意停止GUI或其他进程时,将使用检查接收缓冲区级别,以便在达到特定大小后专门计算资源立即清空缓冲区——防止发生溢出。一个这样的情况是闪烁节点。
编辑于 2023-07-28 17:17・IP 属地广东

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/48623.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

600 条最强 Linux 命令总结

今天,带来一篇 Linux 命令总结的非常全的文章,也是我们平时工作中使用率非常高的操作命令,命令有点多,建议小伙伴们可以先收藏后阅读。 1. 基本命令 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 dmidecode -…

【LeetCode】102.二叉树的层序遍历

题目 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]示例 2: …

MySQL基础(四)数据库备份

目录 前言 一、概述 1.数据备份的重要性 2.造成数据丢失的原因 二、备份类型 (一)、物理与逻辑角度 1.物理备份 2.逻辑备份 (二)、数据库备份策略角度 1.完整备份 2.增量备份 三、常见的备份方法 四、备份&#xff08…

自动驾驶技术架构

自动驾驶技术架构 自动驾驶技术架构 自动驾驶关键技术 自动驾驶汽车技术架构较为复杂,涉及了多领域的交叉互容,例如汽车、交通、通信等,基于自动驾驶相关的软硬件、辅助开发工具、行业标准等各方面关键问题,自动驾驶汽车关键技术…

教育机构视频播放时观看行为分析有哪些应用?

教育机构视频播放时观看行为分析有哪些应用? 观看行为分析 观看行为分析是指我们平台基于视频大数据分析,能够以秒为粒度展示观众如何观看您的视频。 视频观看热力图是单次观看行为的图形化表示,我们平台云点播视频的每一次播放&#xff0…

【一天三道算法题】代码随想录——Day14

一. 有效的括号 题目链接:力扣 思路:无非三种情况: 1. 左侧括号多,右侧少 2. 左右侧一样多,该字符串属于有小括号字符串 3. 右侧括号多,左侧少 那么说白了就是要比较左右括号的数量,谁多&…

行业追踪,2023-07-28

自动复盘 2023-07-28 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

图片转pdf手机版免费?这几款转换软件看看

图片转pdf手机版免费?将图片转换成PDF文件可以带来很多好处。首先,PDF文件可以更好地保护你的图片。相对于图片文件,PDF文件更难以编辑和改变,因此更适合用于存储重要的图片。其次,将多张图片合并成一个PDF文件可以更好…

《面试1v1》Kafka与传统消息系统区别

🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪 🍅 技术交流:定期更新Java硬核干货,不定期送书活动 🍅 王哥多年工作总结:Java学习路线总结&#xf…

前端Vue入门-day04-用vue实现组件通信

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 组件的三大组成部分 注意点说明 组件的样式冲突 scoped data 是一个函数 组件通信 什么是组件通信 不…

手撕顺序表

> 作者简介:დ旧言~,目前大一,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 望小伙伴们点赞👍收藏✨加关注哟💕&#x1…

Redis原理篇(二)

三、Redis网络模型 3.1 用户空间和内核态空间 服务器大多都采用Linux系统,这里我们以Linux为例来讲解: ubuntu和Centos 都是Linux的发行版,发行版可以看成对linux包了一层壳,任何Linux发行版,其系统内核都是Linux。我们的应用都…

解析数据可视化工具:如何选择最合适的软件

在当今信息爆炸的时代,数据已成为各行各业的重要资源。为了更好地理解和分析数据,数据可视化成为一种必不可少的工具。市面上数据可视化工具不说上千也有上百,什么帆软、powerbi、把阿里datav,腾讯云图、山海鲸可视化等等等等&…

科技云报道:是时候全员FinOps了吗?

科技云报道原创。 在论坛上,国外某企业的真实案例引发了热议。一开始该企业只顾技术创新,积极上云,不顾成本。 直到有一天,高层介入喊停:“这个云不能再上了,成本已经远大于收益了”。该企业因为成本失控…

express编写一个简单的get接口

/01编写get接口.jsconst express require(express) const app express()// 创建路由 const useRouter require(./router/user.js) // 注册路由 app.use(/api,useRouter)app.listen(8080, (req, res) > {console.log(8080监听) }) ./02编写post接口 // 注意:如…

【LeetCode】141.环形链表

题目 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#…

百题千解计划【CSDN每日一练】计数问题(附解析+多种实现方法:Python、Java、C、C++、JavaScript、C#、go)

人要多久才能成熟!一瞬间?还是一辈子? 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌟[2] 2022年度博客之星人工智能领域TOP4🌟 🏅[3] 阿里云社区特邀专家博主🏅 🏆[4] CSDN-人工智能领域优质创作者🏆 �

C++STL库中的list

文章目录 list的介绍及使用 list的常用接口 list的模拟实现 list与vector的对比 一、list的介绍及使用 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2. list的底层是双向带头循环链表结构,双向带头循…

Python爬虫实例之淘宝商品页面爬取(api接口)

可以使用Python中的requests和BeautifulSoup库来进行网页爬取和数据提取。以下是一个简单的示例: import requests from bs4 import BeautifulSoupdef get_product_data(url):# 发送GET请求,获取网页内容headers {User-Agent: Mozilla/5.0 (Windows NT…

深度学习算法的计算量

文章目录 一、FLOPs与FLOPS二、参数量parameters三、Latency与FPS四、结论 一、FLOPs与FLOPS 二、参数量parameters 三、Latency与FPS 四、结论