STM32 CAN通信自定義數據包多幀連發亂序問題

場景:

can標準幀中每一幀只能傳輸8字節,而應用中傳輸一包的內容往往超過8字節,因此需要把一個包拆成多個幀發送,接收端才把收到的多幀重新組裝成一個完整的包


問題描述

在一問一答的兩塊板間通信,多幀連發是能夠按照順序發送的。但是,在一個主板和多個從板之間輪詢一問一答的通信中,偶爾出現持續一段時間或者長時間無法通信的情況,特別高幀率發送的情況下,幾乎無法通信。

原因分析:

抓取can總線數據發現不同板之間的幀相互交叉亂序,導致接收到的包因為亂序無法還原。但是不能保證多幀連續發送的話,就會導致無法還原包。如圖,7E和E7之間為一包,但其出現亂序
在這里插入圖片描述
發送過程大致為

  1. 把包根據8字節拆分為多個幀
  2. 調用發送函數HAL_CAN_AddTxMessage塞第一幀進發送郵箱,id為本設備ID
  3. can自動從郵箱里面取出該幀發送
  4. 發送完畢觸發郵箱發送完畢中斷,在中斷里面再調用HAL_CAN_AddTxMessage塞下一幀進發送郵箱,ID為0,以最高優先級占用CAN總線,循環直到最后一幀
    以上過程按道理很快就可以連續發送,但是就是會出現不連續的情況。因為采用的輪詢方式,很難保證其他can總線的設備不也在同時在競爭can總線,在發送完畢進入中斷塞數據進郵箱的空隙,盡管ID號是0,但是在競爭總線的時刻,還在中斷里面塞數據進郵箱,并未參與can總線競爭,就會被其他的設備競爭掉總線了,待填充完郵箱,因為ID號為0,其又可以占用can進行發送,就出現了本設備的幀和其他設備的幀交叉了。

解決方案:

其原因就是發送中出現時間停頓,讓其他can設備有了可乘之機,因此保證多幀之間在上一幀發送完畢立馬競爭總線進入下一幀發送就可以保證該包是連續發送的。以下是我的改進:

  1. 開啟郵箱按照填寫順序發送(而不是根據郵箱ID優先級發送)
  2. 一包多幀的數據持續塞滿三個郵箱,確保多幀發送過程中沒有出現三個郵箱都出現空的情況
    在裸機的時候,其可以連續高幀率發送不出現亂幀,但是開啟FREERTOS后,還會出現亂幀的情況,其原因是can的發送中斷被freertos管理,需要把use freertos function關掉,使用裸機的中斷,我把其優先級設為1.
    在這里插入圖片描述
    但是!還是有但是!我的freertos任務多了以后,還是出現亂幀的情況,檢查后發送,我的第一次填寫郵箱是在代碼里面進行的,也就是說我塞郵箱的過程中,freertos會打斷我塞數據的過程,導致有概率不是連續塞數據進去郵箱的。如圖,雖然我在代碼調用的發送中斷函數,但是其程序指針運行在psp下,而不是msp下,優先級就是普通的freerto任務,自然不能保證以高優先級連續塞數據進發送郵箱了。
    在這里插入圖片描述
    改進為如下,分包好后,通過HAL_NVIC_SetPendingIRQ追加一個發送中斷,其不會執行發送過程就可以直接觸發發送中斷,這下子沒其他東西在打擾塞滿發送郵箱了吧!
    在這里插入圖片描述

總結:

經過測試,can總線每秒8000幀數據的情況下,有10%的錯誤率,檢查后發現,順序沒亂,有些幀沒能發送來就丟棄了,因為我設置的發送失敗不重發。降低速率至6000,1%內的錯誤率,幀沒發出現的數量大幅度下降,證明還是太快了。設置3000,0%錯誤率,為什么3000就是0%呢,看了一下can總線,發送我的每一包發送需要時間是1ms,一包大概3幀,也就是1s上限差不多是3000多幀。
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/163130.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163130.shtml
英文地址,請注明出處:http://en.pswp.cn/news/163130.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UDP分片和丟包與TCP效果對比

UDP 分片 與 丟包,UDP 真的比 TCP 高效嗎? UDP(用戶數據報協議)和TCP(傳輸控制協議)在很多方面都有顯著的區別。總體來說,TCP更適合需要可靠傳輸的應用,例如網頁瀏覽、電子郵件等&a…

信創系列之大數據,分布式數據庫產業鏈跟蹤梳理筆記…

并購優塾 投行界的大叔,大叔界的投行 【產業鏈地圖,版權、內容與免責聲明】1)版權:版權所有,違者必究,未經許可不得翻版、摘編、拷貝、復制、傳播。2)尊重原創:如有引用未標注來源…

CentOS 7啟動時報“Started Crash recovery kernel arming.....shutdown....”問題處理過程

有臺虛擬機由于CPU負載過高而宕機,宕機重啟后停在“Started Crash recovery kernel arming…shutdown…”階段,如下所示: 重置虛擬機,進入grub菜單,按e編輯啟動選項,在linux16 行末,加上&…

【考研】數據結構(更新到循環鏈表)

聲明&#xff1a;所有代碼都可以運行&#xff0c;可以直接粘貼運行&#xff08;只有庫函數沒有聲明&#xff09; 線性表的定義和基本操作 基本操作 定義 靜態&#xff1a; #include<stdio.h> #include<stdlib.h>#define MaxSize 10//靜態 typedef struct{int d…

【追求卓越02】數據結構--鏈表

引導 今天我們進入鏈表的學習&#xff0c;我相信大家對鏈表都很熟悉。鏈表和數組一樣&#xff0c;作為最基礎的數據結構。在我們的工作中常常會使用到。但是我們真的了解到數組和鏈表的區別嗎&#xff1f;什么時候使用數組&#xff0c;什么時候使用鏈表&#xff0c;能夠正確的選…

監控員工上網有什么軟件

監控員工上網的軟件主要用于監控員工在工作時間內的網絡行為&#xff0c;包括瀏覽網頁、使用社交媒體、發送郵件等。通過監控員工上網行為&#xff0c;企業管理者可以更好地了解員工的工作狀態和行為&#xff0c;規范員工的上網行為&#xff0c;提高工作效率&#xff0c;同時也…

SSL證書對網站的作用及影響?

SSL證書作為當下互聯網的重要安全件&#xff0c;包括搜索引擎的收錄、網站是否具備信任的條件以及HTTP2.0傳輸協議的相互作用等&#xff0c;尤其是瀏覽器對古老的http協議警告提示不安全將直接影響到用戶的信任度以及品牌形象&#xff0c;對于網站來說可謂是必不可少。 SSL證書…

Webstorm 插件文件目錄顏色分析——白藍綠紅黃灰

Webstorm 插件文件目錄【白色、藍色、綠色、紅色、黃色、灰色】對應當前文件發生什么了&#xff0c;即文件夾當前狀態。 WebStrom配置好git或SVN后文件顏色代表的含義&#xff1a; 白色&#xff1a;本地無修改內容 藍色&#xff1a;文件內容有修改&#xff0c;暫未提交到git…

python命令行 引導用戶填寫可用的ip地址和端口號

字多不看&#xff0c;直接體驗 待補充 演示代碼 # -*- coding:UTF-8 -*- """ author: dyy contact: douyaoyuan126.com time: 2023/11/23 10:29 file: 引導用戶填寫可用的ip地址和端口號.py desc: xxxxxx """# region 引入必要的依賴 import …

C語言-判斷上三角矩陣

上三角矩陣指主對角線以下的元素都為0的矩陣&#xff1b;主對角線為從矩陣的左上角至右下角的連線。 本題要求編寫程序&#xff0c;判斷一個給定的方陣是否上三角矩陣。 輸入格式&#xff1a; 輸入第一行給出一個正整數T&#xff0c;為待測矩陣的個數。接下來給出T個矩陣的信…

【LeetCode:2304. 網格中的最小路徑代價 | dijkstra(迪杰斯特拉)】

&#x1f680; 算法題 &#x1f680; &#x1f332; 算法刷題專欄 | 面試必備算法 | 面試高頻算法 &#x1f340; &#x1f332; 越難的東西,越要努力堅持&#xff0c;因為它具有很高的價值&#xff0c;算法就是這樣? &#x1f332; 作者簡介&#xff1a;碩風和煒&#xff0c;…

Vue中使用Echarts實現數據可視化

文章目錄 引言一、安裝Echarts二、引入Echarts三、創建圖表容器四、初始化Echarts實例五、配置圖表選項和數據六、實現圖表更新七、Vue實例代碼結語我是將軍&#xff0c;我一直都在&#xff0c;。&#xff01; 引言 接著上一篇內容&#xff0c;我將繼續分享有關數據可視化的相…

Bellman-Ford算法

初步了解 Bellman-Ford算法是一種用于尋找帶有負權邊的圖中的單源最短路徑的算法。它可以處理一般的圖&#xff0c;包括存在負權邊和負權環的情況。 以下是Bellman-Ford算法的基本思想和步驟&#xff1a; 初始化&#xff1a;將源節點的距離設置為0&#xff0c;將所有其他節點…

Hook+jsdom 解決cookie逆向

前言 記錄下如何破cookie逆向 目標 目標網址:https://q.10jqka.com.cn/ 目標接口:http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/2/ajax/1/ 對抗:cookie反爬蟲處理,關鍵字v,如圖 解決步驟 1、JS中關鍵字查找 如上,我們找到了關鍵字 v,…

為何設計師都在用這個原型樣機資源網站?

談論原型樣機素材模板&#xff0c;這個話題對設計師來說如同老朋友一般熟悉。設計師們在創作完畢后&#xff0c;為了更淋漓盡致地展示他們的設計成果&#xff0c;通常會將其放置在真實的樣機素材模板中。這種原型樣機素材可以讓設計作品迅速且清晰地呈現在真實環境中。找到一個…

(5秒解決)ImportError: attempted relative import with no known parent package

尋找了很多方法&#xff0c;發現大家把事情講的復雜了。我這里用最簡單的辦法來解決父包引用找不到的問題。 報錯提示&#xff1a;ImportError: attempted relative import with no known parent package 先給大家看看我的目錄結構&#xff0c;model.py和test目錄在同一級。tra…

前端數組方法匯總集錦

前言 數組主要使用場景有&#xff1a; 存儲和處理數據&#xff1a;數組是一種有序的數據結構&#xff0c;可以用來存儲和處理多個相關的數據。在前端開發中&#xff0c;我們經常使用數組來存儲和處理列表、表格、選項等數據。 循環和遍歷&#xff1a;數組提供了循環和遍歷的功能…

Android12:內置第三方應用,權限控制器已停止運行,應用app已停止運行

1.設備先安裝我提供的app【EasyControler】 2.設備--設置--關于手機--版本號(滑動到最下方)---連續點擊六下打開 開發者模式 3.設置--系統--開發者模式--開發者選項 --打開usb調試 4.設置--安全設備管理應用--easycontrol的開關打開 5.將設備連接電腦 打開cmd命令框 輸入指令…

smartsofthelp 7.0 最簡單的代碼生成器

這是一款值得開發人員認真研究的軟件 https://pan.baidu.com/s/1xjDL5QypcRJ5neulUPFmWQ?pwdgedx 1.查詢數據庫死鎖相關信息 2.查看數據庫的鏈接情況 3.當前實例上的所有用戶 4.創建數據庫獨立密碼 5.查看數據庫使用的端口號 6.當前數據庫設置的最大連接數 7.當前數據庫最大的…

C語言運算符優先級表

C語言運算符優先級表 運算符優先級與結合性 優先級運算符描述結合性1&#xff0c;--后綴自增&#xff0c;自減從左往右()函數調用[]數組下標.結構體與聯合體訪問成員->結構體與聯合體通過指針訪問成員(type){list}復合字面量(C99)2&#xff0c;--前綴自增&#xff0c;自減從…