STM32 CAN多节点组网项目实操 挖坑与填坑记录

news2024/9/21 4:20:19

 摘要

CAN线性组网项目开发过程中遇到的数据丢包问题,并尝试解决的记录和推测分析。

  关键词

CAN串联多节点通讯、CAN10节点通讯、CAN数据丢包、STM32 CAN

  背景/项目介绍

概述:

开发了一个多节点线性组网采集数据的项目。

系统包含1个供电和数据网关板还有最多10个节点。

节点之间和网关之间通过CAN通讯。

网关板主要功能:

1.是给总线上每个节点供电

2.并将CAN协议转换为USB CDC设备和PC上位机通讯。

节点的功能:

采集当前位置数据,并通过CAN协议上传给网关板。

通讯线束

CAT6 六类网线,用的网线来传输CAN信号,取网线中的1对双绞线来做CAN_H  CAN_L通讯,再取2对网线来做供电,由网关板输出DC12到网线,以此给10个节点做供电,算是自己做了个POE供电,不过是非标的,哈哈哈哈。

节点硬件设计:

一个STM32单片机、两个不带网络变压器的RJ45插座。CAN收发器芯片。

两个RJ45插座完全并联,当接线时,一个用来插入上一个节点延展出的网线水晶头,另一个RJ45插座插入一条网线用来连接下一个节点。

整体系统总线布局

虽然系统物理宏观角度来看是线性连接的,但其实内部每个节点还是通过CAN_H CAN_L挂载到总线上的。类似上图的链接方式。

运行开发环境介绍

硬件环境

节点

STM32F091CCT6

J-LINK  V11

软件开发环境

节点

IAR 8.32.1 

VSCODE 

软件支持包ST HAL 库

硬件环境

网关板

STM32F072C816

J-LINK  V11

软件开发环境

节点

KEIL5.14

VSCODE 

软件支持包ST HAL 库
PC上位机环境windows10
USB-CAN PC上位机CANAGAROO
PC串口助手Serial Port Utility

实验1:

实验条件:

测试条件,在小二居室的房间内 实际面积不到69平方,6根5米的CAT6网线,1根10米的超CAT6网线,1根CAT6 20米网线。

因为空间受限,网线没有全延展开。

节点布局:

图中,圆圈为节点,长方形为网关板、菱形为PC上位机。因为是在家里实验,布线路径很奇葩。而且我的画图走位也很风骚,请忽略。 :)  :) 哈哈哈哈。

节点ID就是CANID。

线束材料:

CAT6类网线,我是用网线来传输的CAN信号,并且用网线来传输12V DC给接点供电。

其中第一根网线10米,其余为5米。

通讯波特率:

125k

接入节点:

实验1接入的是2.3.4.5.6.7.8  这几个节点。

接点接入方法1:

先开启网关板的供电,然后一个个接入节点设备

节点接入方法2: 

先不开启网关板供电,先将所有节点接好,然后再开启网关板供电,所有节点上电。或者是用“节点接入方法1”接好总线后,再给网关板断电,然后重新上电,都是为了实现一个所有节点同时上电。

实验发现

发现一个现象,如果是先开启网关板的供电,然后一个个接入节点设备,最后开启上位机的采集数据命令,这时候挂载的7个节点,都能收到数据。这个时候如果断电,然后重新上电,会发现,丢数据情况很严重。只有2、3、8几个节点能收到数据。  后来我分析应该是因为重新上电的过程中,所有节点板子近乎同时启动,这种情况下,收发数据存在异常。而线将网关板供电,然后再一个个插入节点的连接方式,会让不同节点的上电时间存在延时。

总结扩展

于是实验二考虑增加延时,我推测可能是节点收到上位机下发的启动自动上传数据命令后,同一时间所有节点都在总线上喊话,导致总线收发数据丢包了。下面实验增加延时尝试验证推测。

实验2:

实验条件:

线束材料:

和实验1 相同。

通讯波特率:

10k 

实验没有严格控制变量,因为我当时时间比较紧急,同时考虑到,CAN总线理论上来说通讯速率越低,抗干扰越强,传输距离越远,所以实验2直接换10k波特率了。

关于CAN总线切换波特率的方法,请看这篇文章。

STM32 CAN 波特率设置。

接入节点:

也接入的是2.3.4.5.6.7.8  这几个节点。

 线束布局:

2.3.4.5.6.7.8  这几个节点的时候,在他们的程序中的发送函数中设置,

ID *10 ms的间隔时间。

例如当前节点ID为1则延时1*10ms再发送,当前节点为10则延时10*100ms再发送。

因为我的CAN发送机制运用了队列的方式,再程序的其他部分判断需要发送数据的时候,将数据打包进发送队列,然后再在主循环里按时差发送队列是否为空,如果不为空,就取出将要发送的数据,然后通过CAN发送出去。

如果你的程序这个地方不是运用的消息队列的发送方式,或者对通讯的时序要求很高,则不能运用我这种方式。

最后将所有节点同时上电,然后发送广播启动采集数据命令。

实验发现

发现  只有6号总是收不到数据。

总结扩展

我寻思吧,这玩意特别规律的,总是6号收不到数据,是不是6*10= 60ms正好和数据在线束上传输的时间啥的冲着,我一共8个节点(7个子节点+1个网关),第6个就不行,那我扩展到10个呐?

还有就是,我之前做实验,把线束全伸展开拉的比较直的时候,是没有这种事情的,和线材布局也有关系。但如果我的客户就是要在线束不完全伸展开的情况下使用呐,那我就要研究一下,怎样在这种情况下还能保持CAN通讯的数据传输稳定性。

于是,下一个实验,增加节点数目到10,我这个系统,最多就是要10个节点。

实验3:

实验条件

线束材料、通讯波特率同实验2。
接入节点:

1  2 3 4 5 6 7 8 9 10 

节点布局:

测试条件,在小二居室的房间内 实际面积不到69平方,6根5米的CAT6网线,1根10米的超CAT6网线,1根CAT6 20米网线。

和实验1和2相比,我在网关板附件新增了监听模块,上位机为cangaroo

因为空间受限,网线没有全延展开。

程序修改

将发送前的延时改为  ID*15ms

再在开启上电初始化中加一个和ID号有关的延时,例如,ID为1就延时1*100ms进入主while循环。

ID为10则进行10*100 = 1000ms的延时。

实验发现

采用节点接入法2的时候,即,节点同时供电的时候。

总是节点3数据丢失。

监听USB-CAN模块显示报文。

备注:

监听软件,CANGAROO。

思考:

协议中增加上位机的回复命令会更好,上位机收到节点上报的数据后,给节点回复一个命令。

再在节点的程序中增加判断,如果一定时间内收不到总线的回复,就重启节点程序。相当于手动模拟了实验1中的节点接入方法1。

上述思考方法还未编码

敬请期待

没来得及继续探究剩下的问题,欢迎关注,后面我会记录并更新我的程序更改和实验方案~

关注我不迷路。

开源的USB-CAN上位机。

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

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

相关文章

如何利用Guava优化Java网络编程

第1章:引言 大家好!今天小黑要和咱们聊聊一个很酷的话题:如何利用Google的Guava库来优化Java网络编程。网络编程,这玩意儿听起来就高大上,不是吗?但实际上,它充满了各种挑战。从处理复杂的数据…

【二分查找】【滑动窗口】LeeCode2528:最大化城市的最小电量

作者推荐 【动态规划】【广度优先】LeetCode2258:逃离火灾 本文涉及的基础知识点 二分查找算法合集 滑动窗口 题目 给你一个下标从 0 开始长度为 n 的整数数组 stations ,其中 stations[i] 表示第 i 座城市的供电站数目。 每个供电站可以在一定 范围 内给所有城…

OpenHarmony创新赛人气投票活动,最佳人气作品由你来定!

12月1日至12月15日 十大入围作品线上投票激战正酣 最佳人气作品,由你来定! 投票链接:OpenHarmony创新赛人气作品投票正式开启——最佳人气作品,由你来定! - 文章 OpenHarmony开发者论坛

uniCloud(一) 新建项目、初始化服务空间、云对象访问测试

一、新建一个带有unicloud 二、创建一个服务空间 1. 右键uniCloud,关联云服务空间 我当前没有服务空间,需要新建一个服务空间,之后将其关联。初始化服务空间需要的时间有点长 服务空间初始化成功后,刷新HBuilder,勾选…

vue3使用Mars3D写区块地图

效果图 引入相关文件 因为我也是第一次使用&#xff0c;所以我是把插件和源文件都引入了&#xff0c;能使用启动 源文件 下载地址&#xff1a; http://mars3d.cn/download.html 放入位置 在index.html中引入 <!--引入cesium基础lib--><link href"/static/C…

互联网加竞赛 opencv 图像识别 指纹识别 - python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器视觉的指纹识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&#xff0c;适…

【Docker】从零开始:18.使用Dockerfile构造自己的KingbaseES数据库镜像

【Docker】从零开始&#xff1a;17.使用Dockerfile构造自己的数据库镜像 新建一个自定义目录并创建Dockerfile文件上传需要的文件到自定义目录下注意docker-circle-init.sh文件内容password 内容 开始打包注意打包完成后执行 尝试用工具连接数据库 kingbase.tar.gz 包过大我就上…

阻抗控制实现更快更精准(跟踪精度,较小且稳定的接触力)

阻抗控制是一种模拟人类肌肉阻抗特性的控制方法&#xff0c;可以实现更快更精准的机器人运动控制&#xff0c;同时具有较小的接触力和稳定的跟踪精度。 Kd 10; Bd 5 ; Md 2; 1e5/(0.0005*s^25*s1) 5e4/(0.1*s^21*s1) 1e4/(0.1*s^21*s1) 增益较小时容易跟踪性能不足&#xf…

机房末端配电中机柜PDU是如何工作的?

鉴于IDC数据中心7*24小时的运营要求以及对电源效率的日益关注&#xff0c;机柜PDU&#xff08;Power Distribution Unit&#xff0c;电源分配单元&#xff09;已成为数据中心基础设施的重要组成部分。在很多初次接触机柜PDU的人看来&#xff0c;其作用看上去类似于简单的插线板…

用心研发好产品:健康品牌podeey是如何做到的?

在分析消费者健康需求的同时&#xff0c;美国podeey能量生命有限公司&#xff08;PODEEY Biotechnology LLC.&#xff09;不断提升自主研发实力&#xff0c;并且一直注重汇集全球前沿的研发力量&#xff0c;与贵州宏臻菌业达成战略合作&#xff0c;始终致力于以科学技术为核心&…

微信小程序js数组对象根据某个字段排序

一、排序栗子 注: 属性字段需要进行转换,如String类型或者Number类型 //升序排序 首元素(element1)在前 降序则(element1)元素在后 data data.sort((element1, element2) >element1.属性 - element2.属性 ); 二、代码 Page({/*** 页面的初始数据*/data: {user:…

Axure RP 9 入门教程

1. Axure简介 Axure 是一个交互式原型设计工具&#xff0c;可以帮助用户创建复杂的交互式应用程序和网站。Axure 能够让用户快速构建出具有高度可交互性的原型&#xff0c;可以在团队中进行协作、分享和测试。 使用 Axure 可以设计出各种不同类型的原型&#xff0c;包括网站、移…

windows下安装git中文版客户端

下载git Windows客户端 git客户端下载地址&#xff1a;Git - Downloads 我这里下载的是Git-2.14.0-64-bit.exe版本 下载TortoiseGit TortoiseGit客户端下载地址&#xff1a;Download – TortoiseGit – Windows Shell Interface to Git TortoiseGit客户端要下载两个&#…

C++学习笔记(十一)------has_a和use_a关系

文章目录 前言 一、has_a关系 1.1 has_a概念 1.2 has_a中构造和析构的顺序 1.3 has_a对象的内存情况 二、use_a关系&#xff08;友元关系&#xff09; 1.友元函数&#xff1a; 2.友元类 3 使用多文件编程的方式重新编辑上述代码 总结 前言 随着技术的革新&#xff0c;出现各种各…

三种方法:教你选择腾讯云服务器配置及报价

腾讯云服务器购买流程直接在官方秒杀活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动机&#xff0c;选择范围窄&#xff0c;但是…

MQ-Det: Multi-modal Queried Object Detection in the Wild

首个支持视觉和文本查询的开放集目标检测方法 NeurIPS2023 文章&#xff1a;https://arxiv.org/abs/2305.18980 代码&#xff1a;https://github.com/YifanXu74/MQ-Det 主框图 摘要 这篇文章提出了MQ-Det&#xff0c;一种高效的架构和预训练策略&#xff0c;它利用文本描述的…

IDEA调整内存大小

一、IDEA开启内存显示 双击shift,搜索show memory indicator 打开后重启&#xff0c;右下角显示IDEA内存占用情况 开启后右下角会显示 二、调整内存 双击shift,搜索vmoption 修改-Xms和-Xmx参数&#xff0c;如下&#xff1a; -Xms:最小内存 -Xmx:最大内存 设置完成后&…

HTTP协议在Linux上进行数据库访问代码示例

在Linux上使用HTTP协议进行数据库访问通常涉及到使用库如requests来进行HTTP请求&#xff0c;以及使用json或类似的库来处理返回的数据。下面是一个使用Python的简单示例&#xff0c;展示如何通过HTTP协议在Linux上访问数据库。 首先&#xff0c;你需要确保你的Linux系统上已经…

【flink番外篇】3、fflink的source(内置、mysql、kafka、redis、clickhouse)介绍及示例(2)- 自定义、mysql

Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点&#xff0c;并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分&#xff0c;比如术语、架构、编程模型、编程指南、基本的…

图解Redis,谈谈Redis的持久化,RDB快照与AOF日志

目录 专栏导读一、RDB持久化1、自动触发2、手动触发3、设置保存条件4、加解密5、RDB持久化优缺点6、哪些情况会触发RDB持久化?二、AOF持久化1、AOF持久化过程2、appendfsync的选项值3、AOF持久化优缺点4、数据恢复顺序和加载流程三、Redis事务</