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

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

  • 前言
    • 方法1
    • 方法2
    • 方法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消息:
STM32 HAL库CAN同时发送超过3条推荐方法_第1张图片
然后我们正常连接CAN,到电脑,然后看打印信息为:
STM32 HAL库CAN同时发送超过3条推荐方法_第2张图片
这是正常的,现在拔掉can线,模拟档can通路出问题的时候,会发现打印停止在了can发送开始的地方,这样的话整个定时发送任务就停了。
在这里插入图片描述
如果能保证can通讯的场合使用这种方式是比较好的。

方法2

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

方法3(推荐)

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

你可能感兴趣的:(STM32 HAL库CAN同时发送超过3条推荐方法)