STM32 CAN通信自定义数据包多帧连发乱序问题

场景:

can标准帧中每一帧只能传输8字节,而应用中传输一包的内容往往超过8字节,因此需要把一个包拆成多个帧发送,接收端才把收到的多帧重新组装成一个完整的包


问题描述

在一问一答的两块板间通信,多帧连发是能够按照顺序发送的。但是,在一个主板和多个从板之间轮询一问一答的通信中,偶尔出现持续一段时间或者长时间无法通信的情况,特别高帧率发送的情况下,几乎无法通信。

原因分析:

抓取can总线数据发现不同板之间的帧相互交叉乱序,导致接收到的包因为乱序无法还原。但是不能保证多帧连续发送的话,就会导致无法还原包。如图,7E和E7之间为一包,但其出现乱序
在这里插入图片描述
发送过程大致为

  1. 把包根据8字节拆分为多个帧
  2. 调用发送函数HAL_CAN_AddTxMessage塞第一帧进发送邮箱,id为本设备ID
  3. can自动从邮箱里面取出该帧发送
  4. 发送完毕触发邮箱发送完毕中断,在中断里面再调用HAL_CAN_AddTxMessage塞下一帧进发送邮箱,ID为0,以最高优先级占用CAN总线,循环直到最后一帧
    以上过程按道理很快就可以连续发送,但是就是会出现不连续的情况。因为采用的轮询方式,很难保证其他can总线的设备不也在同时在竞争can总线,在发送完毕进入中断塞数据进邮箱的空隙,尽管ID号是0,但是在竞争总线的时刻,还在中断里面塞数据进邮箱,并未参与can总线竞争,就会被其他的设备竞争掉总线了,待填充完邮箱,因为ID号为0,其又可以占用can进行发送,就出现了本设备的帧和其他设备的帧交叉了。

解决方案:

其原因就是发送中出现时间停顿,让其他can设备有了可乘之机,因此保证多帧之间在上一帧发送完毕立马竞争总线进入下一帧发送就可以保证该包是连续发送的。以下是我的改进:

  1. 开启邮箱按照填写顺序发送(而不是根据邮箱ID优先级发送)
  2. 一包多帧的数据持续塞满三个邮箱,确保多帧发送过程中没有出现三个邮箱都出现空的情况
    在裸机的时候,其可以连续高帧率发送不出现乱帧,但是开启FREERTOS后,还会出现乱帧的情况,其原因是can的发送中断被freertos管理,需要把use freertos function关掉,使用裸机的中断,我把其优先级设为1.
    在这里插入图片描述
    但是!还是有但是!我的freertos任务多了以后,还是出现乱帧的情况,检查后发送,我的第一次填写邮箱是在代码里面进行的,也就是说我塞邮箱的过程中,freertos会打断我塞数据的过程,导致有概率不是连续塞数据进去邮箱的。如图,虽然我在代码调用的发送中断函数,但是其程序指针运行在psp下,而不是msp下,优先级就是普通的freerto任务,自然不能保证以高优先级连续塞数据进发送邮箱了。
    在这里插入图片描述
    改进为如下,分包好后,通过HAL_NVIC_SetPendingIRQ追加一个发送中断,其不会执行发送过程就可以直接触发发送中断,这下子没其他东西在打扰塞满发送邮箱了吧!
    在这里插入图片描述

总结:

经过测试,can总线每秒8000帧数据的情况下,有10%的错误率,检查后发现,顺序没乱,有些帧没能发送来就丢弃了,因为我设置的发送失败不重发。降低速率至6000,1%内的错误率,帧没发出现的数量大幅度下降,证明还是太快了。设置3000,0%错误率,为什么3000就是0%呢,看了一下can总线,发送我的每一包发送需要时间是1ms,一包大概3帧,也就是1s上限差不多是3000多帧。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue实现海康H5视频插件播放视频的实例,实现取流失败了之后重新获取新的流播放视频

vue实现海康H5视频插件播放视频的实例,实现取流失败了之后重新获取新的流播放视频 h5player是一个基于HTML5的流式网络视频播放器,无需安装浏览器插件即可通过websocket协议向媒体服务取流播放多种格式的音视频流。 首先去海康开发平台,把插…

设计模式篇---外观模式

文章目录 概念结构实例总结 概念 外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 外观模式引入了一个新的外观类,它为多个业务类的调用提供了一个统一的入口。主要优点…

Jenkins扩展篇-流水线脚本语法

JenkinsFile可以通过两种语法来声明流水线结构,一种是声明式语法,另一种是脚本式语法。 脚本式语法以Groovy语言为基础,语法结构同Groovy相同。 由于Groovy学习不适合所有初学者,所以Jenkins团队为编写Jenkins流水线提供一种更简…

你的关联申请已发起,请等待企业微信的管理员确认你的申请

微信支付对接时,需要申请AppID,具体在下面的位置: 关联AppID,发起申请时,会提示这么一句话: 此时需要登录企业微信网页版,使用注册人的企业微信扫码登录进去,然后按照下面的步骤操作即可。 点击…

硬核神作|2w字带你拿下Sentinal

目录 Sentinel概述 基本介绍 Sentinel 基本核心概念 Sentinel安装 简单安装启动 启动配置项 SpringCloud简单整合 实战架构 父工程pom文件 teacher-service服务 student-service服务 测试 整合Sentinel SpringCloud微服务保护方案解读 服务雪崩定义 问题的产生 …

计算机网络之物理层(数据通信有关)

一、概述 1.1物理层引入的目的 屏蔽掉传输介质的多样性,导致数据传输方式的不同;物理层的引入使得高层看到的数据都是统一的0,1构成的比特流 1.2.物理层如何实现屏蔽 物理层靠定义的不同的通信协议(一般称通信规程) 这些协议…

内裤洗衣机有用吗?口碑最好的小型洗衣机

想必各位小伙伴都知道我们的贴身衣物,不可以与其他衣服一起在洗衣机中清洗,每次都需要把内衣裤挑选出来手洗,但是我们每天都要上厕所,难免会沾上污渍和细菌,我们在用手搓洗的过程中很难把细菌给清除掉,所以…

砖家测评:腾讯云标准型S5服务器和s6性能差异和租用价格

腾讯云服务器CVM标准型S5和S6有什么区别?都是标准型云服务器,标准型S5是次新一代云服务器规格,标准型S6是最新一代的云服务器,S6实例的CPU处理器主频性能要高于S5实例,同CPU内存配置下的标准型S6实例要比S5实例性能更好…

Windows平台Unity下实现camera场景推送RTMP|轻量级RTSP服务|实时录像

技术背景 我们在对接Unity平台camera场景采集的时候,除了常规的RTMP推送、录像外,还有一些开发者,需要能实现轻量级RTSP服务,对外提供个拉流的RTSP URL。 目前我们在Windows平台Unity下数据源可采集到以下部分: 采集…

Altium Designer 相同模块的布局布线复用-AD

1、利用交互式布线,将两个相同模块的元器件在PCB上分块显示。 在原理图中,框选某一模块电路、按快捷键 TS 切换到PCB编辑界面、工具>器件摆放>在矩形区域内排列(可将模块中的器件都集中放置到矩形框内)。2、为模块电路添加 …

【2021集创赛】基于ARM-M3的双目立体视觉避障系统 SOC设计

本作品参与极术社区组织的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~活动。 团队介绍 参赛单位:上海电力大学 队伍名称:骇行队 总决赛奖项:二等奖 1.摘要 随着信息技术的发展,AGV(Automated Guided Vehic…

Modbus转Profinet网关:PLC与天信流量计通讯的经典案例

无论您是PLC或工业设备的制造商,还是工业自动化系统的维护人员,可能会遇到需要将不同协议的设备连接组合并通讯的情况,Modbus和Profinet是现代工业自动化中常见的两种通信协议,在工业控制领域中被广泛应用。 在这种情况绝大多数会…

CentOS 7 使用cJSON 库

什么是JSON JSON是一种轻量级的数据交换格式,可读性强、编写简单。键值对组合编写规则,键名使用双引号包裹,冒号:分隔符后面紧跟着数值,有两种常用的数据类型是对象和数组。 对象:使用花括号{}包裹起来的…

DeepWalk: Online Learning of Social Representations(2014 ACM SIGKDD)

DeepWalk: Online Learning of Social Representations----《DeepWalk:用于图节点嵌入的在线机器学习算法》 DeepWalk 是将 word2vector 用到 GNN 上 DeepWalk: 将 Graph 的每个节点编码为一个 D 维向量(无监督学习),E…

加班做报表被嘲低效!快用大数据分析工具

做数据分析报表很耗时间,因为不仅要解决多业务系统数据质量标准不一问题,还需要进行大量的公式计算、报表设计与制作。但那是以前,在大数据分析工具强势崛起的当下,这些工作都能交给大数据分析工具来做了。以前是花90%的时间做报表…

哈希表-set、map

当需要判断一个元素是否在集合中时,就使用哈希法 散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。 哈希表中关键码就是数组的索引下标,然后通过…

【giszz笔记】产品设计标准流程【8】

(续上回) 真的没想到写了8个章节,想参考之前文章的,我把链接给到这里。 【giszz笔记】产品设计标准流程【7】-CSDN博客 【giszz笔记】产品设计标准流程【6】-CSDN博客 【giszz笔记】产品设计标准流程【5】-CSDN博客 【giszz笔…

苹果手机内存满了怎么清理?这里有你想要的答案!

手机内存不足是一个比较普遍的现象。由于现在手机应用程序的功能越来越强大,所以占用的内存也越来越大。同时用户会在手机中存储大量的数据,如照片、视频、文档等,这些都会占用大量的手机空间。那么,苹果手机内存满了怎么清理&…

Xilinx Zynq-7000系列FPGA任意尺寸图像缩放,提供两套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐FPGA图像处理方案FPGA图像缩放方案 3、设计思路详解HLS 图像缩放介绍 4、工程代码1:图像缩放 HDMI 输出PL 端 FPGA 逻辑设计PS 端 SDK 软件设计 5、工程代码2:图像缩放 LCD 输出PL 端 FPGA 逻辑设计PS 端 SDK 软件设…

基于JAVA+SpringBoot+VUE+微信小程序的前后端分离咖啡小程序

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 随着社会的快速发展和…