在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文知道串口通信的幀同步問題

電子工程師 ? 作者:工程師a ? 2018-06-03 04:26 ? 次閱讀

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

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

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

串口的方案是開啟收發(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ù)中的包格式,比如包頭是否正確,幀長(zhǎng)度是否對(duì)齊,CRC(目前還沒有做進(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ò)的問題。

幾套嘗試過的方案:

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)志位寫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ù)到來也不會(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ā)。

解包過快:不會(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(在沒有收到任何報(bào)文之前,得有一個(gè)空element用于放置馬上要到來的報(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幀到來時(shí),檢查包尾時(shí)發(fā)現(xiàn)。同樣存在報(bào)錯(cuò)響應(yīng)不同步的問題。

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

解包過快:不存在這個(gè)問題。理由同 方式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è)條件均滿足,立即開始解包賦值。完成后重復(fù)上一步,在數(shù)組中搜索第2個(gè)包頭。直到最后在緩沖區(qū)末端,殘留幀的前一部分,舍棄該無尾幀。

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

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

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

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

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

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

小結(jié):

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

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

問題可以被化簡(jiǎn)為:一個(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ā)完的幀誤判。

因此需要針對(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ù),由于沒有校驗(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)在還沒有摸清他的工作原理,尚無法討論何種方法比較合適。

/**********************************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ù)但不滿幀長(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)度仍然沒有達(dá)到幀長(zhǎng)度,說明該包有數(shù)據(jù)丟失。set報(bào)錯(cuò)標(biāo)志位。

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 幀同步
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    9394
  • 串口通信
    +關(guān)注

    關(guān)注

    34

    文章

    1626

    瀏覽量

    55530
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式系統(tǒng)中串口通信同步方法

    個(gè)同類型或其他類型的中斷,從而造成主程序得不到執(zhí)行或后續(xù)中斷數(shù)據(jù)丟失所以,嵌入式系統(tǒng)中的串口通信雖然看似簡(jiǎn)單,但其中仍有許多問題值得研究,例如串口
    發(fā)表于 10-09 19:17

    求大佬分享種嵌入式系統(tǒng)中串口通信同步方法

    本文針對(duì)該問題給出了逐次比較、基于FIFO隊(duì)列和基于狀態(tài)機(jī)的3種同步方法。通過測(cè)試、分析和比較得出,基于有限狀態(tài)機(jī)的方法是嵌入式系統(tǒng)串口通信中很有效的
    發(fā)表于 05-27 06:52

    種并行同步設(shè)計(jì)方案的提出、設(shè)計(jì)與應(yīng)用

    針對(duì)設(shè)計(jì)某高速衛(wèi)星數(shù)據(jù)通信同步系統(tǒng)中所遇到的問題,提出了種新的并行同步設(shè)計(jì)方案,解決了
    發(fā)表于 07-05 16:11 ?12次下載

    基于FPGA的光纖通信系統(tǒng)中同步頭檢測(cè)設(shè)計(jì)

     為實(shí)現(xiàn)設(shè)備中存在的低速數(shù)據(jù)光纖通信同步復(fù)接/ 分接,提出種基于FPGA 的同步頭信號(hào)提取檢測(cè)方案,其中
    發(fā)表于 10-26 16:56 ?46次下載

    同步通信,同步通信原理是什么

    同步通信,同步通信原理是什么? 同步通信種連續(xù)
    發(fā)表于 03-17 16:34 ?6165次閱讀
    <b class='flag-5'>同步</b><b class='flag-5'>通信</b>,<b class='flag-5'>同步</b><b class='flag-5'>通信</b>原理是什么

    同步,同步是什么意思

    同步,同步是什么意思 在數(shù)字通信時(shí),般總是以
    發(fā)表于 03-17 17:30 ?2.4w次閱讀

    VHDL語言實(shí)現(xiàn)的同步算法

    數(shù)字通信網(wǎng)中,同步同步復(fù)接設(shè)備中最重要的部分,他包括同步碼的產(chǎn)生和
    發(fā)表于 07-02 18:33 ?1744次閱讀
    VHDL語言實(shí)現(xiàn)的<b class='flag-5'>幀</b><b class='flag-5'>同步</b>算法

    采用FPGA實(shí)現(xiàn)同步同步系統(tǒng)的設(shè)計(jì)

    為了能在GPS接收端獲取正確導(dǎo)航電文,研究了CJPS接收機(jī)位同步同步的基本原理和實(shí)現(xiàn)方式。提出種采用FPGA來實(shí)現(xiàn)位同步
    發(fā)表于 11-07 17:13 ?12次下載
    采用FPGA實(shí)現(xiàn)<b class='flag-5'>同步</b>、<b class='flag-5'>幀</b><b class='flag-5'>同步</b>系統(tǒng)的設(shè)計(jì)

    基于DSP Builder的同步檢出模型

    基于信號(hào)在進(jìn)行遠(yuǎn)距離傳輸?shù)臅r(shí)候,不可避免地存在信號(hào)干擾、延遲、非線性失真等,為了確保數(shù)字通信系統(tǒng)傳輸?shù)挠行裕仨毑捎?b class='flag-5'>同步。按照同步的作用可以將其分為載波同步、位
    發(fā)表于 11-13 16:16 ?3次下載
    基于DSP Builder的<b class='flag-5'>幀</b><b class='flag-5'>同步</b>檢出模型

    串口數(shù)據(jù)轉(zhuǎn)CAN格式詳解

    MCU沒有CAN或CAN接口數(shù)量不夠怎么辦?目前市面上有串口轉(zhuǎn)CAN的相關(guān)模塊或設(shè)備,但大家知道串口轉(zhuǎn)CAN是如何實(shí)現(xiàn)的嗎?轉(zhuǎn)換后的格式是如何的?本文將為大家詳細(xì)介紹
    的頭像 發(fā)表于 02-02 16:30 ?1.5w次閱讀

    基于有限狀態(tài)機(jī)的嵌入式系統(tǒng)串口通信同步方法設(shè)計(jì)

    同類型或其他類型的中斷,從而造成主程序得不到執(zhí)行或后續(xù)中斷數(shù)據(jù)丟失。所以,嵌入式系統(tǒng)中的串口通信雖然看似簡(jiǎn)單,但其中仍有許多問題值得研究,例如串口通信過程中的
    發(fā)表于 04-10 08:48 ?2676次閱讀
    基于有限狀態(tài)機(jī)的嵌入式系統(tǒng)<b class='flag-5'>串口</b><b class='flag-5'>通信</b><b class='flag-5'>幀</b><b class='flag-5'>同步</b>方法設(shè)計(jì)

    STM32之匯編語言的串口通信

    、USART簡(jiǎn)介通用同步異步收發(fā)器(Universal Synchronous Asynchronous Receiver and Transmitter)是個(gè)串行通信設(shè)備,可以靈活地與外部設(shè)備進(jìn)行全雙工數(shù)據(jù)交換。串行
    發(fā)表于 12-06 21:06 ?9次下載
    STM32之匯編語言的<b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    淺談串口通信

    線和根發(fā)送線就可以完成系統(tǒng)間交換信息 盡管串行通訊的比按字節(jié)傳輸?shù)牟⑿?b class='flag-5'>通信慢,但是串口具有通信線路少,布線簡(jiǎn)便易行,施工方便,結(jié)構(gòu)靈活,系統(tǒng)間協(xié)商協(xié)議,自由度及靈活度較高的特點(diǎn)。
    的頭像 發(fā)表于 01-09 12:56 ?1711次閱讀

    簡(jiǎn)析插值法同步

    同步方式:具有搜索、校驗(yàn)、同步三種狀態(tài):長(zhǎng)、同步字、搜索容錯(cuò)位數(shù)、校核容錯(cuò)位數(shù)、同步容錯(cuò)位數(shù)
    的頭像 發(fā)表于 02-10 14:00 ?825次閱讀

    了解串口通訊與MODBUS協(xié)議

    串行通信的兩種基本形式:同步通信和異步通信。 異步通信所傳輸?shù)臄?shù)據(jù)格式是由1個(gè)起始位、1
    的頭像 發(fā)表于 03-23 09:59 ?4268次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b>了解<b class='flag-5'>串口</b>通訊與MODBUS協(xié)議
    主站蜘蛛池模板: 中文永久免费看电视网站入口| 国产 日韩 欧美 高清| 97色涩| 狠狠干在线观看| 久久99热精品| 欧美视频一区在线观看| 午夜网站免费版在线观看| 情久久| 夜夜爽一区二区三区精品| 日本xxxxxxxxx18| 五月激情综合婷婷| 国产美女作爱| 1024手机在线看片| 香港三级理论在线观看网站| 四虎影院网址大全| xx在线| xxxxxx日本老师hd68| 色播丁香| 午夜精品一区二区三区在线视| 亚洲一区二区三区免费| 日韩毛片在线视频| 天天干夜夜看| 免费黄色欧美| 日本中文字幕在线播放| 午夜撸| 看黄网站免费| 国产精品久久久久久久久ktv| bt天堂新版中文在线地址| 亭亭色| 天天综合色天天综合网| 久久99久久精品国产99热| 国产精品李雅在线观看| kkk4444免费观看| 六月天色婷婷| 性欧美性| 女人张腿让男子桶免费动态图| 欧美黄页网| 天天综合色一区二区三区| 午夜精品久久久久久久| 中日韩在线视频| 2020夜夜操|