STM32在进行CAN总线多节点通信时,同时发数据会一直收不到某设备数据的问题及解决

本文主要是介绍STM32在进行CAN总线多节点通信时,同时发数据会一直收不到某设备数据的问题及解决,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CAN多设备通信收不到某设备数据的问题及解决

  • 遇到的问题
    • 问题的发现
    • CAN总线的一般冲突机制
    • STM32中的CAN冲突机制

遇到的问题

问题的发现

最近在开发Canopen项目中,进行一主多从设备通信时,主站发送同步帧,两个从站往往只有帧ID优先级高的设备可以让主站接收到数据,而另一个从设备的数据往往接收不到。但当我关闭其中一个can从设备,另一个就可以和主站设备通信正常。经过排查发现,是由于Can的冲突解决机制的问题。
在CAN多机通信中,两个设备同时发送数据,帧ID优先级高的CAN设备会“抢占”总线,而另外的设备需要选择冲突解决策略。

CAN总线的一般冲突机制

  • 非破坏性抢占机制(Non-Destructive Arbitration): CAN 使用一种非破坏性的仲裁机制,这意味着当两个节点同时发送消息时,通过识别消息标识符中的位的值来确定哪个消息具有更高的优先级。具体来说,CAN总线上的每个节点都会根据其消息标识符的比特值来判断是否能够“抢占”总线。
  • 标识符比较: 在CAN总线上,每个节点在发送消息之前会监测总线上的信号电平。如果一个节点正在发送1,而另一个节点正在发送0,那么正在发送1的节点会发现冲突,并会停止发送消息。这种标识符比较机制有助于节点在发送消息时检测冲突并进行冲突解决。
  • 仲裁场(Arbitration Field): CAN消息包含一个仲裁场,它包含消息标识符。在这个字段中,CAN节点通过比较消息标识符中的位来决定哪个节点具有更高的优先级。较低优先级的节点将会自动停止发送,并等待较高优先级的节点完成其消息的发送。
  • 回退机制: 如果多个节点尝试同时发送消息,冲突解决后,较低优先级的节点会等待一段随机时间后重新尝试发送消息。这种回退机制有助于减少冲突的再次发生,提高总线的效率。

总的来说,CAN总线的冲突机制通过使用非破坏性的仲裁和标识符比较,以及回退机制,确保了多个节点之间的有序通信,使得总线上的消息能够按照优先级顺序进行传输。这种设计使得CAN总线非常适用于要求实时性和可靠性的应用,例如汽车控制系统。

STM32中的CAN冲突机制

我们在进行CAN的多机通信时,往往希望不会丢帧。遇到CAN总线冲突时,受阻的CAN从设备进行自动回传是我们需要的。而打开冲突回传只需要在CAN初始时对AutoRetransmission 进行使能。

hcan1.Init.AutoRetransmission = ENABLE;

AutoRetransmission 是用于配置CAN控制器的自动重传(Automatic Retransmission)功能。在CAN通信中,当节点发送消息但未收到确认时,可以选择是否自动进行重传。当 AutoRetransmission 被启用(ENABLE)时,如果CAN控制器未收到确认,则会自动重传先前的消息。这有助于提高消息的可靠性,特别是在有可能发生干扰或冲突的环境中。当 AutoRetransmission 被禁用(DISABLE)时,如果发送的消息未收到确认,控制器将不会自动进行重传。在这种情况下,需要由软件来处理重传逻辑,开发者可以通过程序来控制何时以及如何进行重传。

公众号:物联网知识
抖音号:物联网知识

这篇关于STM32在进行CAN总线多节点通信时,同时发数据会一直收不到某设备数据的问题及解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/407106

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

element-ui下拉输入框+resetFields无法回显的问题解决

《element-ui下拉输入框+resetFields无法回显的问题解决》本文主要介绍了在使用ElementUI的下拉输入框时,点击重置按钮后输入框无法回显数据的问题,具有一定的参考价值,感兴趣的... 目录描述原因问题重现解决方案方法一方法二总结描述第一次进入页面,不做任何操作,点击重置按钮,再进行下

解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题

《解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题》本文主要讲述了在使用MyBatis和MyBatis-Plus时遇到的绑定异常... 目录myBATis-plus-boot-starpythonter与mybatis-spring-b

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、