stm32 CAN发送丢包

这篇具有很好参考价值的文章主要介绍了stm32 CAN发送丢包。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

stm32 CAN发送丢包

多机组网的工况下stm32 CAN发送函数正常运行,数据更新,但是使用CAN抓包工具发现阶段性没数据,或者丢包等情况。

这种情况分两种;

  1. 发送太快,STM32集成的CAN控制器支持三个发送邮箱,但是一般的示例程序没有对邮箱的操作,默认使用邮箱0,发送太快导致邮箱占用过高导致丢包。

//Find an empty sending mailbox
	while (HAL_CAN_GetTxMailboxesFreeLevel(&CAN_H) == 0);	//If all three sender mailboxes are blocked, wait until one of them is free
	
	if ((CAN_H.Instance->TSR & CAN_TSR_TME0) != RESET) {
		//Check the status of sender mailbox 0. If mailbox 0 is idle, put the data to be sent into FIFO0
		TxMailbox = CAN_TX_MAILBOX0;
	} else if ((CAN_H.Instance->TSR & CAN_TSR_TME1) != RESET) {
		TxMailbox = CAN_TX_MAILBOX1;
	} else if ((CAN_H.Instance->TSR & CAN_TSR_TME2) != RESET) {
		TxMailbox = CAN_TX_MAILBOX2;
	}
	HAL_CAN_AddTxMessage(&CAN_H, &can_tx.tx_header, can_tx.data, &TxMailbox);	// Send response

用该方法来选择可用的邮箱发送。

对一些实时性要求高的情况“while (HAL_CAN_GetTxMailboxesFreeLevel(&CAN_H) == 0)”会有阻塞作用,可以选择依次按邮箱123来输入数据,大多情况也能解决丢包问题,总感觉这么操作有些不太合理,但的确没出过问题。

		static uint8_t mailbox_count = 0;

		if (mailbox_count== 0) {
			TxMailbox = CAN_TX_MAILBOX0;
		} else if (mailbox_count== 1) {
			TxMailbox = CAN_TX_MAILBOX1;
		} else if (mailbox_count== 2) {
			TxMailbox = CAN_TX_MAILBOX2;
			mailbox_count = 0;
		}
		mailbox_count++;
  1. 多主\从站组网,导致总线占用冲突,长时间会导致CAN外设丢掉老数据来发送新的数据,如果使用操作系统等发送可以在发送函数后增加一个延时一般1us就够,或者打开自动重发,根据实际情况选择其中一个方法即可。

stm32的can发送邮箱满了,HAL库,嵌入式,C++,stm32,单片机,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-729066.html

到了这里,关于stm32 CAN发送丢包的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【嵌入式】HC32F07X CAN通讯配置和使用&配置不同缓冲器以连续发送

            使用小华(华大)的MCU HC32F07X实现 CAN 通讯配置和使用 【1】 CAN原理说明 (参考文章《CAN通信详解》):         CAN是控制器局域网络(Controller Area Network, CAN)的简称,是一种能够实现分布式实时控制的串行通信网络。         (i) CAN通信形式 :CAN 使用称为 C

    2024年02月06日
    浏览(37)
  • STM32+Cube mx hal库实现CAN通信收发实验

          关于CAN通信的入门教程和基本原理在其他博主发的文章里面都有介绍,笔者只是简单记录下学习过程,文章用到的是正点原子的阿波罗F429开发板,另一个设备是中盛科技的继电器模块(CAN版)。       实现之前看一下继电器模块相关信息          发送数据的格式官方文

    2024年02月16日
    浏览(30)
  • 【STM32】标准库与HAL库对照学习教程十四--CAN总线

    STM32全部教程 :【STM32】标准库与HAL库对照学习系列教程大全 本篇介绍如何使用STM32的标准库与HAL库对CAN总线的使用,由于我那块普中的STM32F103ZET6开发板送人了,因此我这边用STM32F103C8最小系统板,进行简单的演示一下功能,最主要的还是需要理解CAN总线的原理,在本篇中,

    2024年02月15日
    浏览(29)
  • STM32F407 CAN模块发送接收数据异常

    现象: 1、CAN模块初始化成CAN_MODE_LOOPBACK模式 CAN模块通过HAL_CAN_AddTxMessage发送数据时,TX管脚能够发出数据,示波器也可以测量到数据波形,CAN使用中断接收HAL_CAN_ActivateNotification或者查询接收HAL_CAN_GetRxMessage都可以接收到正确的数据(和发送的数据一致),但是CAN接口却没有波

    2024年02月12日
    浏览(27)
  • STM32 HAL库 CAN双机通信接收无法进入中断、中断没有反应的解决方法

    在调试HAL库下的CAN双机(双F103ZET6)通信时,阻塞轮询接收完全正常,但是中断接收没有反应。翻看了GL的烧脑之路总结(一):Cubemx创建CAN通信工程,无法进入CAN中断的原因这篇文章以后,核实自己的硬件电路没有问题,于是对自己的工程文件进行整理,把 ①HAL_CAN_ConfigFi

    2024年02月04日
    浏览(47)
  • stm32f407单片机上通过HAL库实现can总线数据的收发

      最近在使用can总线,由于这个以前接触的比较少,所以调试代码的时候直接是下载的正点原子的例程,在这个基础上修改调试的。现在将调试中遇到的问题,总结一下,避免以后踩坑。目前写了一个查询方式的,一个中断方式的。项目代码下载地址: https://download.csdn.n

    2024年02月09日
    浏览(38)
  • STM32F407单片机HAL库CAN2不能接收数据解决方法

      最近在使用stm32F407的片子调试can通信,直接在正点原子的代码上修改调试,调试can1的时候,基本没啥问题,收发都正常,使用查询模式和中断模式都可以。但是当修改到can2的时候,可以正常发送数据,但是中断函数始终进不去。折腾了一两个小时终于搞定了。下面将解

    2024年02月16日
    浏览(31)
  • CAN通信配置过滤器和使用三个邮箱发送

    RM比赛用的电机基本都使用CAN通信,但是一条CAN线上只用一个发送邮箱在挂在设备多的情况可能会导致发送不完,但其实完全可以把三个发送邮箱都用上。这里贴一下自己的CAN筛选器,接收以及发送的代码。 完整的工程可以看我开源的飞机云台程序~ 项目代码开源地址: https

    2024年02月06日
    浏览(37)
  • STM32 cubemx CAN STM32 CAN初始化详解

    接收用到的结构体如下: CAN概念:         全称Controller Area Network,是一种半双工,异步通讯。 物理层:         闭环:允许总线最长40m,最高速1Mbps,规定总线两端各有一个120Ω电阻,闭环        开环:最大传输距离1Km,最高速125Kbps,规定每根线串联一个2.2kΩ的电阻,

    2024年02月13日
    浏览(42)
  • CAN总线详解及STM32的CAN通信编程指南

    对于CAN通信而言,本人之前也未接触了解过,由于实习的技术要求,因此也花费了一段时间对CAN通信进行学习,并且实现了基于STM32的CAN环回静默模式通信,因此写一遍比较详细的文章对该内容进行总结。本文的参考资料有STM32的中文参考手册、协议手册等。话不多说开始吧!

    2024年02月11日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包