封裝STM32串口的底層時(shí),遇到了串口幀同步的問題。雖然以前也遇到類似場合,寫出來的代碼基本能夠解決問題,但是在邏輯上總是不能徹底的解釋一些細(xì)節(jié)。
當(dāng)前的工作環(huán)境:
由于代碼想用在一個(gè)簡單的PID閉環(huán)上,做在線的參數(shù)整定。假設(shè)當(dāng)前PID解算周期是1ms,即每1ms,做一次串口的收包,解包,Pid解算,數(shù)據(jù)采集,然后打包,發(fā)包。也就是說是固定步長的解包。
串口的方案是開啟收發(fā)的DMA以及DMA的中斷。(堅(jiān)決不考慮直接使用串口中斷。一個(gè)字節(jié)中斷一次太費(fèi)資源)。DMA數(shù)組作為串口的FIFO隊(duì)列(并不是真正意義上的隊(duì)列)。
當(dāng)前的需求:
1、時(shí)間節(jié)拍到來時(shí),檢查是否有收到數(shù)據(jù)。沒有則跳出,有則進(jìn)入下一步
2、檢查數(shù)據(jù)中的包格式,比如包頭是否正確,幀長度是否對齊,CRC(目前還沒有做進(jìn)去)等
3、包格式檢查出錯(cuò)誤,回包時(shí)添加標(biāo)志位,聲明包格式錯(cuò)誤請求重發(fā)。包格式?jīng)]有錯(cuò)誤則進(jìn)行解包并設(shè)置對應(yīng)的寄存器和賦值。
4、具有合理的接收緩沖區(qū),大于緩沖區(qū)的數(shù)據(jù)進(jìn)行放棄。
5、能夠及時(shí)檢測出丟字節(jié),多字節(jié)等幀長度出錯(cuò)的問題。
幾套嘗試過的方案:
1、DMA數(shù)組的長度和幀長度相等。
觸發(fā)條件:DMA計(jì)數(shù)值減到0(即已經(jīng)收滿一個(gè)幀的長度的數(shù)據(jù))產(chǎn)生DMA中斷,將觸發(fā)標(biāo)志位寫1。PC機(jī)上可以通過開啟一個(gè)線程監(jiān)視緩沖區(qū)數(shù)量實(shí)現(xiàn)。
解包操作:設(shè)置共用體,其中結(jié)構(gòu)體為幀協(xié)議,同時(shí)公用一個(gè)u8 數(shù)組作為DMA數(shù)組。判斷觸發(fā)條件,若滿足,讀取共用體中的包頭包尾,若正確,繼續(xù)讀取成員,解包賦值。
緩沖機(jī)制:無。DMA設(shè)置為normal模式,計(jì)數(shù)減到0后即停止。有新的數(shù)據(jù)到來也不會被傳入數(shù)組。PC機(jī)上可以手動(dòng)關(guān)閉串口。
報(bào)錯(cuò)機(jī)制:
幀錯(cuò)位:在包頭檢查中會發(fā)現(xiàn),舍棄當(dāng)前幀,設(shè)置重發(fā)標(biāo)志位請求重發(fā)。
字節(jié)缺失:字節(jié)缺失的幀發(fā)送完成后不會滿足觸發(fā)條件,等到第2幀的數(shù)據(jù)的前幾個(gè)字節(jié)填滿缺失的幀后,觸發(fā)解包操作。在檢查包圍的時(shí)候,報(bào)錯(cuò)響應(yīng)。舍棄字節(jié)缺失幀,但是難以保證字節(jié)缺失幀的后幾幀能順利接收。而且出錯(cuò)和報(bào)錯(cuò)響應(yīng)不同步。即報(bào)錯(cuò)響應(yīng)出現(xiàn)在錯(cuò)誤的下一幀。
字節(jié)超出:字節(jié)超出的幀會及時(shí)響應(yīng),并且由于包尾錯(cuò)誤,會立即響應(yīng)報(bào)錯(cuò)并請求重發(fā)。
解包過快:不會出現(xiàn)解包速度大于收包速度。因?yàn)閿?shù)據(jù)滿一個(gè)幀長度才會解包。
2、DMA數(shù)組指向元素類型為幀結(jié)構(gòu)體的鏈表
觸發(fā)條件:DMA計(jì)數(shù)值減到0(即已經(jīng)收滿一個(gè)幀的長度的數(shù)據(jù))產(chǎn)生DMA中斷,DMA中斷中對List進(jìn)行Push_back操作,增加一個(gè)element,然后將DMA的內(nèi)存地址指向新的element的首地址。觸發(fā)條件是List的size大于1(在沒有收到任何報(bào)文之前,得有一個(gè)空element用于放置馬上要到來的報(bào)文);
解包操作:檢查List第1個(gè)元素的包頭包尾,如果正確,讀取成員解包賦值,然后對List進(jìn)行pop_front,直到list的size等于1.
緩沖機(jī)制:鏈表天然的緩沖機(jī)制,唯一擔(dān)心的是堆溢出,可以設(shè)置一個(gè)上限,在中斷里判斷。
報(bào)錯(cuò)機(jī)制:
幀錯(cuò)位:在包頭檢查中會發(fā)現(xiàn),但是需要丟棄緩沖區(qū)內(nèi)錯(cuò)位幀之后所有的幀。因?yàn)楹筮叺谋厝欢煎e(cuò)位了。
字節(jié)缺失:第2幀到來時(shí),檢查包尾時(shí)發(fā)現(xiàn)。同樣存在報(bào)錯(cuò)響應(yīng)不同步的問題。
字節(jié)超出:報(bào)錯(cuò)同步響應(yīng)。丟棄緩沖區(qū)中所有幀
解包過快:不存在這個(gè)問題。理由同 方式1.
3、DMA數(shù)組指向多倍于幀長度的數(shù)組首地址
觸發(fā)條件:緩沖隊(duì)列非空。觸發(fā)響應(yīng)后,立即將緩沖隊(duì)列memcpy到臨時(shí)數(shù)組進(jìn)行解包。同時(shí)清空隊(duì)列。
解包操作:在臨時(shí)數(shù)組中搜索包頭的第1個(gè)字節(jié),一單滿足,立即檢查:包頭第2字節(jié),包尾是否在緩沖區(qū)長度內(nèi),包尾是否正確。如果4個(gè)條件均滿足,立即開始解包賦值。完成后重復(fù)上一步,在數(shù)組中搜索第2個(gè)包頭。直到最后在緩沖區(qū)末端,殘留幀的前一部分,舍棄該無尾幀。
緩沖機(jī)制:由緩沖隊(duì)列作為緩沖。
報(bào)錯(cuò)機(jī)制:
幀錯(cuò)位:在臨時(shí)數(shù)組中不存在幀錯(cuò)位的概念,幀錯(cuò)位完全可以被正確解包。
字節(jié)缺失:在解包步驟中被檢測到包尾有誤,則請求重發(fā)。而且能同步響應(yīng)。
字節(jié)超出:同字節(jié)缺失
解包過快:由于觸發(fā)方式為緩沖隊(duì)列非空。如果查詢觸發(fā)條件時(shí),恰好接收了部分幀,則仍然能滿足觸發(fā)條件。那么此時(shí)這個(gè)接收了一部分的幀會作為字節(jié)缺失的幀被舍棄并進(jìn)行報(bào)錯(cuò)
小結(jié):
三種方式對比下來,第3種方式有著較優(yōu)越的性能,而且能夠很好地移植到PC機(jī)上實(shí)現(xiàn)。但是對于解包過快的問題,仍然需要討論。
字節(jié)缺失同步響應(yīng)和解包過快的矛盾:
問題可以被化簡為:一個(gè)10字節(jié)的幀,解包時(shí),如果包里只有9個(gè)字節(jié),那這一幀到底是沒發(fā)完還是字節(jié)缺失。
如果使用“已收到大于10個(gè)字節(jié)的數(shù)據(jù)”作為解包觸發(fā)條件,那么解包時(shí)永遠(yuǎn)有10個(gè)字節(jié),判斷最后一個(gè)字節(jié)是否是包尾,即可。但是字節(jié)缺失永遠(yuǎn)只能在下一幀響應(yīng)。
如果使用“緩沖區(qū)數(shù)據(jù)多于0”作為解包觸發(fā)條件,雖然字節(jié)缺失能立即被響應(yīng),但是也有可能將未發(fā)完的幀誤判。
因此需要針對當(dāng)前的應(yīng)用進(jìn)行分析。目前對于單片機(jī)的幀率和幀長度為:
波特率:115200
發(fā)送幀率:5f/s
發(fā)送幀長:20 Bytes
接收幀檢測周期:1ms
接收幀長度:10 Bytes
傳送1Byte數(shù)據(jù),由于沒有校驗(yàn)位,1個(gè)停止位,因此需要10bits。
那么傳輸速率為11520B/s(約11KB/S),即傳輸1Byte需要86.8us(約0.1ms)。
發(fā)送幀每一幀20Bytes,需要1.736ms(約2ms)
接收幀每一幀10Bytes,需要0.858ms(約1ms)
因此對于當(dāng)前的情況下單片機(jī)的接收條件,1ms解包一次,完全不需要緩沖區(qū),但是卻有很大可能發(fā)生在幀截?cái)唷?p>因此應(yīng)該采用“已收到等于幀長度個(gè)字節(jié)的數(shù)據(jù)”作為觸發(fā)條件。放棄字節(jié)缺失幀的同步響應(yīng)。
但是對于PC機(jī)端,如果同樣為1ms間隔檢測觸發(fā)條件,接收幀的時(shí)常變?yōu)?.736毫秒,那么一個(gè)間隔內(nèi)是必然收不滿1幀的。
因此同樣可以采用“已收到等于幀長度個(gè)字節(jié)的數(shù)據(jù)”作為觸發(fā)條件。放棄字節(jié)缺失幀的同步響應(yīng)。
但是對于Qt上的串口類,現(xiàn)在還沒有摸清他的工作原理,尚無法討論何種方法比較合適。
/**********************************11月1日更新分割線****************************************/
一個(gè)能夠提高缺字節(jié)幀報(bào)錯(cuò)響應(yīng)速度的方案:
判斷幀是丟字節(jié)還是未發(fā)完的區(qū)分方式其實(shí)是在時(shí)間上。
比如之前提到的115200波特率,20Bytes的幀,其傳送時(shí)間應(yīng)該小于2ms。
因此,當(dāng):接收緩沖區(qū)有數(shù)據(jù),單數(shù)據(jù)未到達(dá)20Bytes時(shí),若這種狀態(tài)維持超過2ms,則說明傳輸已經(jīng)完成,缺字節(jié)。
而程序本身的step timer已經(jīng)有了計(jì)時(shí)的功能。因此,實(shí)現(xiàn)方式如下。
聲明一個(gè)標(biāo)志位1:FIFO隊(duì)列有數(shù)據(jù)但不滿幀長度。
聲明一個(gè)計(jì)數(shù)器1:標(biāo)志位1的計(jì)數(shù)。
當(dāng)FIFO隊(duì)列數(shù)據(jù)從0跳變到1時(shí),set標(biāo)志位1。
CheckMailBox時(shí),標(biāo)志位1已置位,則將計(jì)數(shù)器1的值加1。
由于20Bytes的幀在2ms內(nèi)應(yīng)該發(fā)送完。而解算周期為1ms。
故,當(dāng)計(jì)數(shù)器1的值大于2時(shí),如果FIFO隊(duì)列數(shù)據(jù)長度仍然沒有達(dá)到幀長度,說明該包有數(shù)據(jù)丟失。set報(bào)錯(cuò)標(biāo)志位。
即可檢測出丟字節(jié)的幀。
上一篇:制作一個(gè)0-20mA的信號發(fā)生器,可以給很多儀器儀表做校準(zhǔn)或測試
下一篇:HID+CDC復(fù)合設(shè)備在WIN10的識別問題
推薦閱讀最新更新時(shí)間:2025-06-07 23:35



設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- API調(diào)用小記(Touchdesigner和ESP32)
- 關(guān)于ESP32/8266使用async-mqtt-client庫的一些基本介紹
- LTM4602HV 演示板、28V、6A 降壓模塊穩(wěn)壓器
- PCB書簽 尺子 卡片
- PeanutPI
- 平衡自行車+獨(dú)輪車
- AM1DR-1209SZ 9V 1 瓦 DC-DC 轉(zhuǎn)換器的典型應(yīng)用
- NCV33074ADR2G 直流耦合反相放大器最大輸出擺幅的典型應(yīng)用
- 【明日方舟】羅德島本艦主控板V6.2
- DC795A,使用 LT5527EUF 4.5V 至 5.25V 高線性下變頻混頻器的演示板
- XL4016可調(diào)恒壓恒流實(shí)驗(yàn)電源
- 帶內(nèi)部開關(guān)的 PAM2863 2A LED 驅(qū)動(dòng)器的典型應(yīng)用
- 座椅、天窗、電動(dòng)尾門應(yīng)用 國產(chǎn)車規(guī)級高壓霍爾效應(yīng)傳感器推薦
- 突發(fā)!又一車企車機(jī)“崩了”
- 寧德時(shí)代為陳立泉院士頒發(fā)“卓越貢獻(xiàn)獎(jiǎng)”
- 一文速覽吉利雷神 AI 電混 2.0 發(fā)布會重點(diǎn)
- 2025年1-4月ADAS供應(yīng)商裝機(jī)量排行榜:頭部集中與國產(chǎn)突圍并存
- 國內(nèi)飛行汽車無線通信測試成功,通信安全新突破
- SPAD席卷車載激光雷達(dá)市場
- 大聯(lián)大品佳集團(tuán)推出基于Microchip和ams OSRAM產(chǎn)品的10Base-T1S萬級像素大燈方案
- 哈曼推出采用三星Neo QLED技術(shù)的全新顯示屏
- Syntiant推出超低功耗汽車AI創(chuàng)新技術(shù) 提升車輛安全性和用戶體驗(yàn)
- 看完這篇文章就知道新能源汽是否值得購買
- 特斯拉市值一路攀升,蔚來汽車向前追趕
- NI推出全新企業(yè)品牌形象并宣布新Slogan——Engineer Ambitiously
- 未來已來,這幾項(xiàng)汽車“黑科技”保命又省力
- 無線車載多媒體終端系統(tǒng)介紹
- “海盜”無人機(jī) 貌似是個(gè)純“偵察員”
- 國產(chǎn)機(jī)器人行業(yè)利潤增長 三成來自于補(bǔ)貼
- 三個(gè)月時(shí)間從14萬跌到1萬 比特幣礦機(jī)經(jīng)歷了什么?
- 波士頓動(dòng)力機(jī)器人再次進(jìn)化:能跑能跳 還能自主導(dǎo)航
- 探索機(jī)器視覺演進(jìn)的無限可能性