封裝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é)的幀。
上一篇: 導(dǎo)出函數(shù)給APP調(diào)用出現(xiàn)malloc無(wú)法分配內(nèi)存的問(wèn)題
下一篇:STM32F10X USART發(fā)送詳解,測(cè)試無(wú)誤
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 人形機(jī)器人馬拉松背后的思考,兆易創(chuàng)新如何賦能機(jī)器人產(chǎn)業(yè)
- 一種基于STM32的智能柜控制器設(shè)計(jì)
- 小型傾轉(zhuǎn)旋翼機(jī)的無(wú)刷直流電機(jī)驅(qū)動(dòng)器設(shè)計(jì)
- 超高速攝影機(jī)電控系統(tǒng)設(shè)計(jì)
- 基于GPS自動(dòng)授時(shí)的無(wú)線智能控制器的設(shè)計(jì)
- 基于PTR2000的無(wú)線氣象信息采集系統(tǒng)設(shè)計(jì)
- Microchip推出MEC175xB系列器件,為嵌入式控制器引入硬件 抗量子攻擊能力
- 無(wú)人飛行器機(jī)載穩(wěn)定云臺(tái)控制系統(tǒng)的設(shè)計(jì)
- 匠芯創(chuàng)推出面向具身智能高性能實(shí)時(shí)處理器M7000
- 3核A7+單核M0多核異構(gòu),米爾全新低功耗RK3506核心板發(fā)布
- 自動(dòng)化控制中智能技術(shù)的應(yīng)用研究
- OEM機(jī)器制造商利用仿真軟件提高效率
- 基于機(jī)器視覺(jué)的帶鋼焊縫定位
- 米爾RK3576核心板適配多種系統(tǒng),解鎖多樣化應(yīng)用
- 實(shí)時(shí)控制和通信領(lǐng)域的IT/OT融合如何推動(dòng)工業(yè)自動(dòng)化
- IXD0579M高壓側(cè)和低壓側(cè)柵極驅(qū)動(dòng)器提供緊湊型即插即用解決方案
- 如何讓自動(dòng)化領(lǐng)域的串口設(shè)備具備聯(lián)網(wǎng)能力?
- MBD應(yīng)用于霍爾組件位置選定
- 村田汽車和工業(yè)設(shè)備用PoC系統(tǒng)靜噪對(duì)策:難點(diǎn)及攻略全解析,別錯(cuò)過(guò)
- 快速獲取TI 工業(yè)電機(jī)驅(qū)動(dòng)資源 答題贏好禮
- 【已結(jié)束】TI 有獎(jiǎng)直播|CAN SIC(信號(hào)改進(jìn)功能)
- 2017年恩智浦物聯(lián)網(wǎng)設(shè)計(jì)大賽
- 2018開(kāi)“芯”學(xué):Mentor兩場(chǎng)知識(shí)有獎(jiǎng)問(wèn)答邀你新年充電
- MPS EMI 知識(shí)充電節(jié)盛大開(kāi)啟!賺積分贏好禮!
- 有獎(jiǎng)直播|安森美高能效產(chǎn)品在 EV-Charger 市場(chǎng)的應(yīng)用
- 參與e絡(luò)盟與 TE 傳感器的問(wèn)卷活動(dòng),贏50元亞馬遜購(gòu)物券!
- 更新個(gè)人資料贏驚喜大禮
- 以更開(kāi)放的姿態(tài)推動(dòng)泛在電力物聯(lián)網(wǎng)建設(shè)
- 使用STM32CubeMX進(jìn)行STM32F429 LCD編程<一> 全局配置
- 山西電力:支撐客戶側(cè)泛在電力物聯(lián)網(wǎng)建設(shè)
- 基于STM32F429的RGB屏使用
- 長(zhǎng)三角一體化發(fā)展電力行動(dòng)計(jì)劃在滬發(fā)布
- 高質(zhì)量發(fā)展制造業(yè)項(xiàng)目,長(zhǎng)三角進(jìn)一步夯實(shí)產(chǎn)業(yè)底氣
- 教你設(shè)計(jì)工業(yè)以太網(wǎng)監(jiān)控系統(tǒng)電路
- 智能家居,你了解有多少?
- 海信視像利潤(rùn)逆勢(shì)暴增,除靠激光電視還有何“殺手锏”?
- 113kWh能量的旗艦純電轎跑Lucid Air
- 暫時(shí)沒(méi)分了,此貼會(huì)加分,請(qǐng)教:怎樣才能在PB里安裝NETCFv35.wce.armv4.cab的內(nèi)容?而不是在設(shè)備上安裝
- 做了個(gè)播放器
- 參與Silicon Labs 2014技術(shù)創(chuàng)新巡回研討會(huì),贏新穎大禮
- SCA60C-N1000060求角度,精度一度
- 【藏書(shū)閣】中興通訊EDA工具手冊(cè)
- 運(yùn)算參數(shù)的詳細(xì)解釋和分析-輸入阻抗和輸入電容
- 如何用DeviceIOControl 函數(shù)對(duì)USB開(kāi)發(fā)芯片(8051F320)進(jìn)行讀寫(xiě)
- S5PV210 uboot 分區(qū)大小和可下載文件大小調(diào)整方法
- 51單片機(jī)簡(jiǎn)介及常用術(shù)語(yǔ)
- 世界上至少你還有10個(gè)不知道的問(wèn)題