STM32 HAL库CAN同时发送超过3条推荐方法

STM32 HAL库CAN同时发送超过3条推荐方法

前言

在STM32的HAL库中使用CAN发送使用的是HAL_CAN_AddTxMessage,在这个函数里面发送的时候会先去判断3个发送的fifo是否是满的,如果都是满的,就会直接跳出了,所以如果程序中是连续发送若干条can消息的话,如果超过3条就会出现只能发送3条的状况,想要解决这种问题有几个方法

方法1

通过在HAL_CAN_AddTxMessage之前加上等待while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan1)==0);这种方式,先判断can的发送邮箱是不是满的,如果三个都是满的就在等待,如果不是满的就调用HAL_CAN_AddTxMessage,发送can消息。这种方式会有个问题,就是如果外部的can节点不通,那发送的时候会一直在等,送不出去,其他的事情就做不了,程序就会有问题。如果外部节点是通畅的,那这种方式是比较简单的解决方法。其次可以在while等待的时候加上超时判定,如果长时间发不出去就退出,也会有个问题就是如果发送是在任务中,那就会影响任务的实时性。也会存在丢包的问题。
举个例子:程序编写如下,在定时任务中发送CAN消息:
在这里插入图片描述
然后我们正常连接CAN,到电脑,然后看打印信息为:
在这里插入图片描述
这是正常的,现在拔掉can线,模拟档can通路出问题的时候,会发现打印停止在了can发送开始的地方,这样的话整个定时发送任务就停了。
在这里插入图片描述
如果能保证can通讯的场合使用这种方式是比较好的。

方法2

通过在两次发送的间隙加上延时,使用freertos的时候加上1ms,这样的话在发送的时候,通过pcanviewer抓取,就会看到时间不是想要的时间间隔,比如定时上传任务原本计划的是200ms上传一次,但是就会出现时间不准确的情况。这种方法可以避免通讯断开之后定时任务不往下走的情况,但是这个会把收到的包全部的丢弃掉。
在一般情况下推荐使用这种方式。

方法3(推荐)

比较推荐的方法应该是在要发送的时候往队列里面送,然后用一个发送任务接收队列,按照先后的顺序发送,这样可以在通讯中断的时候将之前的消息存在队列的缓存中,可以保存一些数据,其次因为是异步的操作,不会阻塞,所以不会把任务阻塞停掉。个人比较推荐这种方式。
使用STM32F107的代码举个例子:
1.首先建立一个消息队列用来存放can消息:
在这里插入图片描述
2.然后在写一个函数用来发送队列到发送任务中:
在这里插入图片描述
3.新建一个发送任务,可以用HAL_CAN_AddTxMessage函数的内容修改一下使用:
在这里插入图片描述
在开头加上接收队列就好了。
使用的时候就条用CAN_Send_Frame就可以了。

  • 15
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

网布

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值