STM32 HAL庫CAN同時傳送超過3條推薦方法

2021-10-05 09:16:19 字數 1456 閱讀 4931

在stm32的hal庫中使用can傳送使用的是hal_can_addtxmessage,在這個函式裡面傳送的時候會先去判斷3個傳送的fifo是否是滿的,如果都是滿的,就會直接跳出了,所以如果程式中是連續傳送若干條can訊息的話,如果超過3條就會出現只能傳送3條的狀況,想要解決這種問題有幾個方法

通過在hal_can_addtxmessage之前加上等待while(hal_can_gettxmailboxesfreelevel(&hcan1)==0);這種方式,先判斷can的傳送郵箱是不是滿的,如果三個都是滿的就在等待,如果不是滿的就呼叫hal_can_addtxmessage,傳送can訊息。這種方式會有個問題,就是如果外部的can節點不通,那傳送的時候會一直在等,送不出去,其他的事情就做不了,程式就會有問題。如果外部節點是通暢的,那這種方式是比較簡單的解決方法。其次可以在while等待的時候加上超時判定,如果長時間發不出去就退出,也會有個問題就是如果傳送是在任務中,那就會影響任務的實時性。也會存在丟包的問題。

舉個例子:程式編寫如下,在定時任務中傳送can訊息:

然後我們正常連線can,到電腦,然後看列印資訊為:

這是正常的,現在拔掉can線,模擬檔can通路出問題的時候,會發現列印停止在了can傳送開始的地方,這樣的話整個定時傳送任務就停了。

如果能保證can通訊的場合使用這種方式是比較好的。

通過在兩次傳送的間隙加上延時,使用freertos的時候加上1ms,這樣的話在傳送的時候,通過pcanviewer抓取,就會看到時間不是想要的時間間隔,比如定時上傳任務原本計畫的是200ms上傳一次,但是就會出現時間不準確的情況。這種方法可以避免通訊斷開之後定時任務不往下走的情況,但是這個會把收到的包全部的丟棄掉。

在一般情況下推薦使用這種方式。

比較推薦的方法應該是在要傳送的時候往佇列裡面送,然後用乙個傳送任務接收佇列,按照先後的順序傳送,這樣可以在通訊中斷的時候將之前的訊息存在佇列的快取中,可以儲存一些資料,其次因為是非同步的操作,不會阻塞,所以不會把任務阻塞停掉。個人比較推薦這種方式。

使用stm32f107的**舉個例子:

1.首先建立乙個訊息佇列用來存放can訊息:

2.然後在寫乙個函式用來傳送佇列到傳送任務中:

3.新建乙個傳送任務,可以用hal_can_addtxmessage函式的內容修改一下使用:

在開頭加上接收佇列就好了。

使用的時候就條用can_send_frame就可以了。

STM32 HAL庫學習筆記

1 系統時鐘 一般用stm32cube生成,使用者只需要會用stm32cube就行。2 gpio輸出void led gpio config void 3 gpio輸入void key gpio config void 4 外部中斷void exti key config void void ext...

STM32 HAL庫學習筆記

1 普通函式與 函式的區別 對普通函式的呼叫 呼叫程式發出對普通函式的呼叫後,程式執行立即轉向被呼叫函式執行,直到被呼叫函式執行完畢後,再返 用程式繼續執行。從發出呼叫的程式的角度看,這個過程為 呼叫 等待被呼叫函式執行完畢 繼續執行 對 函式呼叫 呼叫程式發出對 函式的呼叫後,不等函式執行完畢,立...

STM32 HAL庫 韌體庫 公升級

1 使用官方提供的新功能。2 上個版本有bug,下個版本bug解決了的情況是可能的。不過,上個版本沒bug,下個版本有bug的情況是有的 微小概率事件 開啟 stm32h7xx.h ctrl f搜尋 version 1 通過官網獲取最新hal庫 1 2keil官網經常會卡著顯示不了後續內容,這時可以...