娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年06月01日(星期日)

2018年06月01日 | 串口通信的幀同步問(wèn)題

發(fā)布者:Tianyun2021 來(lái)源: eefocus關(guān)鍵字:串口通信  幀同步 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

封裝STM32串口的底層時(shí),遇到了串口幀同步的問(wèn)題。雖然以前也遇到類似場(chǎng)合,寫(xiě)出來(lái)的代碼基本能夠解決問(wèn)題,但是在邏輯上總是不能徹底的解釋一些細(xì)節(jié)。

當(dāng)前的工作環(huán)境:

由于代碼想用在一個(gè)簡(jiǎn)單的PID閉環(huán)上,做在線的參數(shù)整定。假設(shè)當(dāng)前PID解算周期是1ms,即每1ms,做一次串口的收包,解包,Pid解算,數(shù)據(jù)采集,然后打包,發(fā)包。也就是說(shuō)是固定步長(zhǎng)的解包。

串口的方案是開(kāi)啟收發(fā)的DMA以及DMA的中斷。(堅(jiān)決不考慮直接使用串口中斷。一個(gè)字節(jié)中斷一次太費(fèi)資源)。DMA數(shù)組作為串口的FIFO隊(duì)列(并不是真正意義上的隊(duì)列)。

當(dāng)前的需求:

1、時(shí)間節(jié)拍到來(lái)時(shí),檢查是否有收到數(shù)據(jù)。沒(méi)有則跳出,有則進(jìn)入下一步

2、檢查數(shù)據(jù)中的包格式,比如包頭是否正確,幀長(zhǎng)度是否對(duì)齊,CRC(目前還沒(méi)有做進(jìn)去)等

3、包格式檢查出錯(cuò)誤,回包時(shí)添加標(biāo)志位,聲明包格式錯(cuò)誤請(qǐng)求重發(fā)。包格式?jīng)]有錯(cuò)誤則進(jìn)行解包并設(shè)置對(duì)應(yīng)的寄存器和賦值。

4、具有合理的接收緩沖區(qū),大于緩沖區(qū)的數(shù)據(jù)進(jìn)行放棄。

5、能夠及時(shí)檢測(cè)出丟字節(jié),多字節(jié)等幀長(zhǎng)度出錯(cuò)的問(wèn)題。


幾套嘗試過(guò)的方案:

1、DMA數(shù)組的長(zhǎng)度和幀長(zhǎng)度相等。

觸發(fā)條件:DMA計(jì)數(shù)值減到0(即已經(jīng)收滿一個(gè)幀的長(zhǎng)度的數(shù)據(jù))產(chǎn)生DMA中斷,將觸發(fā)標(biāo)志位寫(xiě)1。PC機(jī)上可以通過(guò)開(kāi)啟一個(gè)線程監(jiān)視緩沖區(qū)數(shù)量實(shí)現(xiàn)。

解包操作:設(shè)置共用體,其中結(jié)構(gòu)體為幀協(xié)議,同時(shí)公用一個(gè)u8 數(shù)組作為DMA數(shù)組。判斷觸發(fā)條件,若滿足,讀取共用體中的包頭包尾,若正確,繼續(xù)讀取成員,解包賦值。

緩沖機(jī)制:無(wú)。DMA設(shè)置為normal模式,計(jì)數(shù)減到0后即停止。有新的數(shù)據(jù)到來(lái)也不會(huì)被傳入數(shù)組。PC機(jī)上可以手動(dòng)關(guān)閉串口。

報(bào)錯(cuò)機(jī)制:

幀錯(cuò)位:在包頭檢查中會(huì)發(fā)現(xiàn),舍棄當(dāng)前幀,設(shè)置重發(fā)標(biāo)志位請(qǐng)求重發(fā)。

字節(jié)缺失:字節(jié)缺失的幀發(fā)送完成后不會(huì)滿足觸發(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é)超出的幀會(huì)及時(shí)響應(yīng),并且由于包尾錯(cuò)誤,會(huì)立即響應(yīng)報(bào)錯(cuò)并請(qǐng)求重發(fā)。

解包過(guò)快:不會(huì)出現(xiàn)解包速度大于收包速度。因?yàn)閿?shù)據(jù)滿一個(gè)幀長(zhǎng)度才會(huì)解包。


2、DMA數(shù)組指向元素類型為幀結(jié)構(gòu)體的鏈表

觸發(fā)條件:DMA計(jì)數(shù)值減到0(即已經(jīng)收滿一個(gè)幀的長(zhǎng)度的數(shù)據(jù))產(chǎn)生DMA中斷,DMA中斷中對(duì)List進(jìn)行Push_back操作,增加一個(gè)element,然后將DMA的內(nèi)存地址指向新的element的首地址。觸發(fā)條件是List的size大于1(在沒(méi)有收到任何報(bào)文之前,得有一個(gè)空element用于放置馬上要到來(lái)的報(bào)文);

解包操作:檢查L(zhǎng)ist第1個(gè)元素的包頭包尾,如果正確,讀取成員解包賦值,然后對(duì)List進(jìn)行pop_front,直到list的size等于1.

緩沖機(jī)制:鏈表天然的緩沖機(jī)制,唯一擔(dān)心的是堆溢出,可以設(shè)置一個(gè)上限,在中斷里判斷。

報(bào)錯(cuò)機(jī)制:

幀錯(cuò)位:在包頭檢查中會(huì)發(fā)現(xiàn),但是需要丟棄緩沖區(qū)內(nèi)錯(cuò)位幀之后所有的幀。因?yàn)楹筮叺谋厝欢煎e(cuò)位了。

字節(jié)缺失:第2幀到來(lái)時(shí),檢查包尾時(shí)發(fā)現(xiàn)。同樣存在報(bào)錯(cuò)響應(yīng)不同步的問(wèn)題。

字節(jié)超出:報(bào)錯(cuò)同步響應(yīng)。丟棄緩沖區(qū)中所有幀

解包過(guò)快:不存在這個(gè)問(wèn)題。理由同 方式1.


3、DMA數(shù)組指向多倍于幀長(zhǎng)度的數(shù)組首地址

觸發(fā)條件:緩沖隊(duì)列非空。觸發(fā)響應(yīng)后,立即將緩沖隊(duì)列memcpy到臨時(shí)數(shù)組進(jìn)行解包。同時(shí)清空隊(duì)列。

解包操作:在臨時(shí)數(shù)組中搜索包頭的第1個(gè)字節(jié),一單滿足,立即檢查:包頭第2字節(jié),包尾是否在緩沖區(qū)長(zhǎng)度內(nèi),包尾是否正確。如果4個(gè)條件均滿足,立即開(kāi)始解包賦值。完成后重復(fù)上一步,在數(shù)組中搜索第2個(gè)包頭。直到最后在緩沖區(qū)末端,殘留幀的前一部分,舍棄該無(wú)尾幀。

緩沖機(jī)制:由緩沖隊(duì)列作為緩沖。

報(bào)錯(cuò)機(jī)制:

幀錯(cuò)位:在臨時(shí)數(shù)組中不存在幀錯(cuò)位的概念,幀錯(cuò)位完全可以被正確解包。

字節(jié)缺失:在解包步驟中被檢測(cè)到包尾有誤,則請(qǐng)求重發(fā)。而且能同步響應(yīng)。

字節(jié)超出:同字節(jié)缺失

解包過(guò)快:由于觸發(fā)方式為緩沖隊(duì)列非空。如果查詢觸發(fā)條件時(shí),恰好接收了部分幀,則仍然能滿足觸發(fā)條件。那么此時(shí)這個(gè)接收了一部分的幀會(huì)作為字節(jié)缺失的幀被舍棄并進(jìn)行報(bào)錯(cuò)


小結(jié):

三種方式對(duì)比下來(lái),第3種方式有著較優(yōu)越的性能,而且能夠很好地移植到PC機(jī)上實(shí)現(xiàn)。但是對(duì)于解包過(guò)快的問(wèn)題,仍然需要討論。


字節(jié)缺失同步響應(yīng)和解包過(guò)快的矛盾:

問(wèn)題可以被化簡(jiǎn)為:一個(gè)10字節(jié)的幀,解包時(shí),如果包里只有9個(gè)字節(jié),那這一幀到底是沒(méi)發(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ā)完的幀誤判。


因此需要針對(duì)當(dāng)前的應(yīng)用進(jìn)行分析。目前對(duì)于單片機(jī)的幀率和幀長(zhǎng)度為:

波特率:115200

發(fā)送幀率:5f/s

發(fā)送幀長(zhǎng):20 Bytes

接收幀檢測(cè)周期:1ms

接收幀長(zhǎng)度:10 Bytes


傳送1Byte數(shù)據(jù),由于沒(méi)有校驗(yàn)位,1個(gè)停止位,因此需要10bits。

那么傳輸速率為11520B/s(約11KB/S),即傳輸1Byte需要86.8us(約0.1ms)。

發(fā)送幀每一幀20Bytes,需要1.736ms(約2ms)

接收幀每一幀10Bytes,需要0.858ms(約1ms)


因此對(duì)于當(dāng)前的情況下單片機(jī)的接收條件,1ms解包一次,完全不需要緩沖區(qū),但是卻有很大可能發(fā)生在幀截?cái)唷?/p>

因此應(yīng)該采用“已收到等于幀長(zhǎng)度個(gè)字節(jié)的數(shù)據(jù)”作為觸發(fā)條件。放棄字節(jié)缺失幀的同步響應(yīng)。

但是對(duì)于PC機(jī)端,如果同樣為1ms間隔檢測(cè)觸發(fā)條件,接收幀的時(shí)常變?yōu)?.736毫秒,那么一個(gè)間隔內(nèi)是必然收不滿1幀的。

因此同樣可以采用“已收到等于幀長(zhǎng)度個(gè)字節(jié)的數(shù)據(jù)”作為觸發(fā)條件。放棄字節(jié)缺失幀的同步響應(yīng)。

但是對(duì)于Qt上的串口類,現(xiàn)在還沒(méi)有摸清他的工作原理,尚無(wú)法討論何種方法比較合適。


/**********************************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)維持超過(guò)2ms,則說(shuō)明傳輸已經(jīng)完成,缺字節(jié)。

而程序本身的step timer已經(jīng)有了計(jì)時(shí)的功能。因此,實(shí)現(xiàn)方式如下。


聲明一個(gè)標(biāo)志位1:FIFO隊(duì)列有數(shù)據(jù)但不滿幀長(zhǎng)度。

聲明一個(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ù)長(zhǎng)度仍然沒(méi)有達(dá)到幀長(zhǎng)度,說(shuō)明該包有數(shù)據(jù)丟失。set報(bào)錯(cuò)標(biāo)志位。

即可檢測(cè)出丟字節(jié)的幀。


關(guān)鍵字:串口通信  幀同步 引用地址:串口通信的幀同步問(wèn)題

上一篇: 導(dǎo)出函數(shù)給APP調(diào)用出現(xiàn)malloc無(wú)法分配內(nèi)存的問(wèn)題
下一篇:STM32F10X USART發(fā)送詳解,測(cè)試無(wú)誤

推薦閱讀

5月31日,商湯科技宣布完成6.2億美元的C+輪融資,由厚樸投資、銀湖投資、老虎基金、富達(dá)國(guó)際等聯(lián)合領(lǐng)投,深圳市創(chuàng)新投資集團(tuán)、中銀集團(tuán)投資有限公司、上海自貿(mào)區(qū)基金、全明星投資基金等跟投,高通創(chuàng)投、保利資本、世茂集團(tuán)等作為戰(zhàn)略投資人參與。商湯科技表示,此次融資將用于研發(fā)和人才引入兩個(gè)方面。此時(shí)距離其上一輪6億美元的C輪融資剛過(guò)去一個(gè)多月。截...
5月蘋(píng)果股價(jià)已經(jīng)累計(jì)下挫了15.2%,從5月1日開(kāi)盤(pán)的209.11美元一路俯沖至29日收盤(pán)的177.38美元。 盡管如此,華爾街并不認(rèn)為蘋(píng)果已經(jīng)見(jiàn)底。 摩根士丹利的分析師Katy L. Huberty在最新的研究報(bào)告中提到,近期蘋(píng)果股價(jià)最低或在160美元,也就是說(shuō),和29日的收盤(pán)價(jià)相比,蘋(píng)果可能還要再跌10%左右。 Huberty在報(bào)告中稱:“我們預(yù)計(jì)蘋(píng)果股價(jià)將繼續(xù)波動(dòng),近期蘋(píng)果...
全球汽車電動(dòng)化勢(shì)不可擋,多個(gè)國(guó)家/地區(qū)已經(jīng)明確提出燃油車禁售時(shí)間,并加速推動(dòng)新能源汽車產(chǎn)業(yè)發(fā)展。據(jù)數(shù)據(jù)顯示,全球新能源乘用車銷量由2015年的41.9萬(wàn)輛增長(zhǎng)至2018年的184.1萬(wàn)輛,年均復(fù)合增長(zhǎng)率為64%。隨著全球政策驅(qū)動(dòng)、行業(yè)技術(shù)進(jìn)步、配套設(shè)施改善以及市場(chǎng)認(rèn)可度提高,預(yù)計(jì)到2025年,全球新能源乘用車銷量將達(dá)到1150萬(wàn)輛,相較于2019年,年均復(fù)合增...
美國(guó)商務(wù)部長(zhǎng)雷蒙多日前(Gina Raimondo)表示,美國(guó)可能會(huì)新建六、七家半導(dǎo)體工廠來(lái)幫助解決全球芯片短缺問(wèn)題。 雷蒙多在接受彭博電視采訪時(shí)表示,美國(guó)的計(jì)劃是,美國(guó)嚴(yán)重依賴臺(tái)積電,以獲取高比例的半導(dǎo)體,故未來(lái)可能需要在國(guó)內(nèi)興建6至7間半導(dǎo)體工廠,幫助解決全球芯片短缺問(wèn)題,以免美國(guó)脆弱地過(guò)分依賴單一公司或國(guó)家/地區(qū)。 這是昨日外媒透露的最新...

史海拾趣

小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 涿鹿县| 盖州市| 南涧| 尼玛县| 屯留县| 扬中市| 噶尔县| 嘉祥县| 牟定县| 井研县| 六安市| 东台市| 安福县| 乌恰县| 威远县| 莲花县| 通山县| 五大连池市| 大城县| 右玉县| 张家港市| 东至县| 凤城市| 资源县| 容城县| 龙州县| 安丘市| 康定县| 六安市| 北川| 方城县| 广东省| 开远市| 五家渠市| 濮阳县| 富民县| 奉节县| 林周县| 邹城市| 融水| 冷水江市|