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

news2024/11/16 22:41:51

在这里插入图片描述
从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 属地广东

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

美国过境签证申请也要面签吗?

随着人们出国旅行的增加,美国过境签证成为了一个热门话题。对于许多人来说,了解美国过境签证的流程和要求非常重要。在这篇文章中,知识人网小编将介绍美国过境签证是否需要面签,以及相关的注意事项。 首先,让我们来了解…

Redis7学习笔记01

一、redis7实战教程简洁 1、大纲: ①、适合对象,从小白到熟手,一套全包圆 ②、Redis专题-大厂面试题,含100道 ③、Redis专题-真实需求生产真实案例 ④、Redis7新特性 2、小白篇高阶篇: 3、大厂面试题&#xff1a…

web场景-静态资源规则与定制化

一、SpringBoot默认静态资源路径 1.1 静态资源放在类路径下: /static/public/resources/META-INF/resources 1.2 浏览器访问: 当前项目根路径/ 静态资源名 eg:如上图,要想访问这四张图片,访问路径依次为:localhos…

1400*C. Computer Game

Example input 6 15 5 3 2 15 5 4 3 15 5 2 1 15 5 5 1 16 7 5 2 20 5 7 3 output 4 -1 5 2 0 1 解析: k个电, 第一种为 k>a 时,只玩游戏 k-a; 第二种,k>b,一边玩一边充电 k-b 问完成n轮游戏的情况下,优先第…

被逼无奈在小公司熬了2年,现在我终于进了腾讯测试岗...

其实两年前校招的时候就往腾讯投了一次简历,结果很明显凉了,随后这个理想就被暂时放下了,但是这个种子一直埋在心里,想着总有一天会再次挑战的。 其实这两年除了工作以外,其余时间基本上都在学习,打磨自己…

基于OpenCV solvePnP函数估计头部姿势

人脸识别 文章目录 人脸识别一、姿势估计概述1、概述2、姿态估计3、在数学上表示相机运动4、姿势估计需要什么5、姿势估计算法6、Levenberg-Marquardt 优化 二、solvePnP函数1、函数原型2、参数详解 三、OpenCV源码1、源码路径 四、效果图像示例参考链接 一、姿势估计概述 1、…

vue中通过JavaScript实现web端鼠标横向滑动触控板滑动效果-demo

JavaScript实现web端鼠标横向滑动&触控板滑动效果 支持鼠标拖动滑动&触控板滑动效果 web端实现滑动&#xff0c;就是对鼠标按下、鼠标松开、鼠标移动事件进行监听 效果图 代码 结构代码 <template><div class"swiper"><div class"co…

财报解读:谷歌成功绝地反击?厮杀尚未真正开始!

在经历了一轮激烈的攻防战之后&#xff0c;谷歌、微软同一天发布了财报&#xff0c;从数据来看&#xff0c;谷歌成功抵御了微软携OpenAI发起的挑战&#xff0c;业绩表现全面超预期&#xff0c;而微软的业绩虽然整体也超预期&#xff0c;但相比其四面出击的高调则黯淡了许多。 巨…

GoogleLeNet V2 V3 —— Batch Normalization

文章目录 Batch Normalizationinternal covariate shift激活层的作用BN执行的位置数据白化网络中的BN层训练过程 BN的实验效果MNIST与GoogleLeNet V1比较 GoogleLeNet出来之后&#xff0c;Google在这个基础上又演进了几个版本&#xff0c;一般来说是说有4个版本&#xff0c;之前…

12-1_Qt 5.9 C++开发指南_自定义插件和库-自定义Widget组件(提升法(promotion)创建自定义定制化组件)

当UI设计器提供的界面组件不满足实际设计需求时&#xff0c;可以从 QWidget 继承自定义界面组件。 有两种方法使用自定义界面组件&#xff1a; 一种是提升法(promotion)&#xff0c;例如在8.3 节将一个QGraphicsView组件提升为自定义的 QWGraphicsView 类&#xff0c;提升法用…

python将UTC +8 时间 转换为 UTC 时间

因为在工作的时候&#xff0c;有时候经常使用 UTC 时间&#xff0c;因为北京时间是 UTC 8&#xff0c;有时候要自己换算一下&#xff0c;或者 时间戳转换的时候有问题&#xff0c;所以就写了这个。 import time from datetime import datetime import pytz# 输入时间字符串 # …

LLM当前状态和潜在影响;谷歌Brain2Music读取大脑活动生成音乐

&#x1f989; AI新闻 &#x1f680; 谷歌Brain2Music利用AI读取大脑活动生成音乐 摘要&#xff1a;谷歌发布了名为Brain2Music的论文&#xff0c;通过人工智能和脑部成像技术生成个性化音乐。他们招募了5名志愿者&#xff0c;记录他们在听不同音乐类型时的大脑活动数据。通过…

刷完阿里 P8 面试官推荐的 Java 高并发核心编程文档后终拿蚂蚁 offer

前言 学完阿里 P8 面试官推荐的 Java 高并发核心编程文档后终于拿到了蚂蚁 p6 的 offer&#xff0c;这份文档包含的内容有点多。 主要包含的内容&#xff1a;Java NIO、Reactor 模式、高性能通信框架 Netty、分布式锁、分布式 ID、分布式缓存、高并发架构、多线程、线程池、内…

C语言IO篇(一) 输出百分号

1.百分号输出问题是什么&#xff1f; C语言中无法直接打印单个的%。 2.怎么解决百分号输出问题&#xff1f; 在C语言中&#xff0c;如何输出百分号呢&#xff1f; 1.在printf中用2个连续 %% 输出百分号。 2.将内容写入到字符串后打印 3.为什么出现百分号输出问题&#xff1f; …

install wxwidgets and wxPython on Linux

安装wxwidgets https://wiki.wxwidgets.org/Compiling_and_getting_startedhttps://wiki.wxwidgets.org/Compiling_and_getting_started 安装wxPython pip install wxPython 安装wxformbuilderhttps://github.com/wxFormBuilder/wxFormBuilder/releaseshttps://github.com/wx…

通达信赫尔均线 (HMA) 指标公式设置及原理详解

我们知道传统的均线存在短周期均线&#xff08;如5日均线&#xff09;灵敏但不够平滑&#xff0c;大周期均线&#xff08;如120日均线&#xff09;平滑但反应滞后、无法及时反映当前行情变化的缺点。&#xff08;如下图&#xff09;赫尔均线 (HMA) 正是为了解决这样的问题&…

AtcoderABC229场

A - First GridA - First Grid 题目大意 要求判断是否可以从每个黑色方块到达其他所有黑色方块&#xff0c;只能经过黑色方块&#xff0c;并且黑色方块之间必须相连&#xff08;共享一条边&#xff09;。 思路分析 据题意&#xff0c;不能的只有以下两种情况 .# #. #. .#…

交互式AI技术与模型部署:bert-base-chinese模型交互式问答界面设置

使用Gradio实现Question Answering交互式问答界面&#xff0c;首先你需要有一个已经训练好的Question Answering模型&#xff0c;这里你提到要使用bert-base-chinese模型。 Gradio支持PyTorch和TensorFlow模型&#xff0c;所以你需要将bert-base-chinese模型转换成PyTorch或Te…

双击start.bat文件闪退,运行报错“unable to access jarfile”

问题&#xff1a;电脑运行“start.bat”文件&#xff0c;无反应&#xff0c;闪退&#xff0c;管理员身份运行报错“unable to access jarfile” 解决思路&#xff1a; 1、由于该项目运行需要jdk环境&#xff0c;检查jdk版本需要是1.8.0_251版本 通过在 cmd 命令行输入java -v…

unittest 数据驱动DDT应用

前言 一般进行接口测试时&#xff0c;每个接口的传参都不止一种情况&#xff0c;一般会考虑正向、逆向等多种组合。所以在测试一个接口时通常会编写多条case&#xff0c;而这些case除了传参不同外&#xff0c;其实并没什么区别。 这个时候就可以利用ddt来管理测试数据&#xf…