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

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

發(fā)布者:Tianran2021最新更新時(shí)間:2024-06-20 來源: elecfans關(guān)鍵字:串口通信  幀同步  STM32 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

封裝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é)的幀。


關(guān)鍵字:串口通信  幀同步  STM32 引用地址:一文知道串口通信的幀同步問題

上一篇:制作一個(gè)0-20mA的信號發(fā)生器,可以給很多儀器儀表做校準(zhǔn)或測試
下一篇:HID+CDC復(fù)合設(shè)備在WIN10的識別問題

推薦閱讀最新更新時(shí)間:2025-06-07 23:35

STM32微控制器的可靠串口通信技術(shù)研究
引言 STM32F107微控制器是意法半導(dǎo)體推出的高性能32位以CortexM3為內(nèi)核的面向工業(yè)控制的處理器。該處理器內(nèi)部通過一個(gè)多層的AHB總線構(gòu)架相連,其內(nèi)部集成了豐富的外設(shè),如USART、SPI、ADC等等。另外,STM32F107處理器還提供多達(dá)80個(gè)通用I/O接口,如此豐富的資源使STM32系列微控制器能夠很理想地用于工業(yè)控制。本文設(shè)計(jì)出一種基于STM32F107的可靠串口通信設(shè)計(jì)方案,可以完成STM32F107處理器和PC機(jī)以及其他串口之間的可靠通信 。 1 串口通信的實(shí)現(xiàn) 1.1 硬件設(shè)計(jì) STM32F107處理器的通用同步異步通信單元(USART)提供 5個(gè)獨(dú)立的異步串行接口,并且都能工作在中斷和DMA模式
[單片機(jī)]
<font color='red'>STM32</font>微控制器的可靠<font color='red'>串口通信</font>技術(shù)研究
串口通信(用CubeMX學(xué)習(xí)STM32)
前言: STM32串口介紹 串行通信是單片機(jī)與外部設(shè)備或其他計(jì)算機(jī)交換信息的一個(gè)方式, 數(shù)據(jù)一位一位的按順序傳送, 其優(yōu)點(diǎn)是只需要一條傳輸線, 協(xié)議簡單, 但是缺點(diǎn)就是傳送速度較慢。 串口是單片機(jī)上非常便捷的一個(gè)工具, 當(dāng)寫程序需要調(diào)試的時(shí)候, 它可以很方便的提供調(diào)試方法, 只要在一些關(guān)鍵代碼執(zhí)行的地方, 通過串口給串口調(diào)試助手發(fā)送相關(guān)信息, 就可以使我們很方便的查看代碼在這個(gè)位置的執(zhí)行情況。 下面看一下我所使用的單片機(jī)上串口的原理圖接線 外部的發(fā)送端TXD就是單片機(jī)串口的接收端USART_RX, ??外部接收端RXD就是單片機(jī)串口的發(fā)送端USART_TX TXD : Transmit(TX) Data(D)??Rec
[單片機(jī)]
STM32單片機(jī)學(xué)習(xí)(7) 串口通信printf重定向
此處是為了在串口中斷通信 中添加printf重定向功能 1、添加頭文件 #include stdio.h 2、工程 Target -- 勾選 Use MicroLIB 3、重定義fputc函數(shù) int fputc(int ch, FILE *f) { Uart1_PutChar((u8)ch); //此處為自定義函數(shù),參見串口中斷通信,請勿盲目 return (ch); } 經(jīng)過上述配置后即可在項(xiàng)目中使用printf( Hello~ );等來發(fā)送字符串了 (printf( 格式化字符串 , 參量表 ) 與C語言使用一樣)
[單片機(jī)]
幀同步系統(tǒng)的FPGA設(shè)計(jì)與實(shí)現(xiàn)
   1 引言   數(shù)字通信時(shí),一般以一定數(shù)目的碼元組成一個(gè)個(gè)“字”或“句”,即組成一個(gè)個(gè)“幀”進(jìn)行傳輸,因此幀同步信號的頻率很容易由位同步信號經(jīng)分頻得出,但每個(gè)幀的開頭和末尾時(shí)刻卻無法由分頻器的輸出決定。為此,幀同步的任務(wù)就是要給出這個(gè)“開頭”和“末尾”的時(shí)刻。通常提取幀同步信號有兩種方法:一類是在信息流中插入一些特殊的碼組作為每幀的頭尾標(biāo)記。另一類則不需要加入碼組,而是利用數(shù)據(jù)碼組本身之間彼此不同的特性實(shí)現(xiàn)同步。這里采取第一種方法——連貫式插人法實(shí)現(xiàn)幀同步。所謂連貫式插入法就是在每幀開頭插入幀同步碼。所用的幀同步碼為巴克碼,巴克碼是一種具有特殊規(guī)律的非周期序列,其局部自相關(guān)函數(shù)具有尖銳的單峰特性,這些特性正是連貫式插入幀同步
[嵌入式]
<font color='red'>幀同步</font>系統(tǒng)的FPGA設(shè)計(jì)與實(shí)現(xiàn)
51單片機(jī)串口通信編程
51單片機(jī)是對所有兼容Intel 8031指令系統(tǒng)的單片機(jī)的統(tǒng)稱。該系列單片機(jī)的始祖是Intel的8004單片機(jī),后來隨著Flash rom技術(shù)的發(fā)展,8004單片機(jī)取得了長足的進(jìn)展,成為應(yīng)用最廣泛的8位單片機(jī)之一,其代表型號是ATMEL公司的AT89系列,它廣泛應(yīng)用于工業(yè)測控系統(tǒng)之中。很多公司都有51系列的兼容機(jī)型推出,今后很長的一段時(shí)間內(nèi)將占有大量市場。51單片機(jī)是基礎(chǔ)入門的一個(gè)單片機(jī),還是應(yīng)用最廣泛的一種。需要注意的是51系列的單片機(jī)一般不具備自編程能力。 一、 pc機(jī)上的 串口通信編程過程如下: 1.建立項(xiàng)目 打開VC++6.0,建立一個(gè)基于對話框的MFC應(yīng)用程序SCommTest(與我源代碼一致,等會你會方便一點(diǎn));
[單片機(jī)]
51單片機(jī)<font color='red'>串口通信</font>編程
STM32F429 串口通信_初始化
一、相關(guān)原理: 1. 初始化HAL庫; 2. 初始化stm32系統(tǒng)時(shí)鐘,設(shè)置時(shí)鐘,包括PLL時(shí)鐘、以及外設(shè)時(shí)鐘APB1,APB2....... 3. 初始化時(shí)延系統(tǒng); 4. 初始化串口,包括串口、串口使用的GPIO口、使能串口本身的中斷、使能串口在NVIC上對應(yīng)的中斷; 二、 代碼實(shí)現(xiàn): 1. 初始化HAL庫 HAL_StatusTypeDef HAL_Init() { HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); HAL_InitTick(TICK_INT_PRIORITY); HAL_MspInit(); } 2. 時(shí)鐘初始化 Stm32_Clock_In
[單片機(jī)]
Stm32RS232串口通信——中斷接收發(fā)送數(shù)據(jù)
main.c配置: /* *說明: *PA0:KEY1;PA1:KEY2; *PA2:LED1;PA3:LED2; *PA9:USART1_TX;PA10:USART1_RX */ #include stm32f10x.h #include stm32f10x_rcc.h #include stm32f10x_gpio.h #include stm32f10x_usart.h #include stm32f10x_exti.h #include system_stm32f10x.h #include misc.h void RCC_Configurati
[單片機(jī)]
C51串口通信(中斷模式)T2產(chǎn)生波特率
#include reg52.h #define uchar unsigned char uchar temp; void serial()interrupt 4 using 1 { if(RI) { RI=0; temp=SBUF; SBUF=temp; } else if(TI) TI=0; } main() { uchar string = AT89C52 Microcomputer!Designer: Grarry Meng ; uchar i=0; RCLK=1; TCLK=1; TH2=0XFF; TL2=0XDC; RCAP2H=0XFF; RCAP2L=0XDC;
[單片機(jī)]
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

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

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 焦作市| 汝南县| 博湖县| 吴江市| 蓬溪县| 侯马市| 惠来县| 饶阳县| 丹江口市| 图木舒克市| 克什克腾旗| 西城区| 临泉县| 满城县| 连城县| 仁寿县| 千阳县| 历史| 乌拉特前旗| 汨罗市| 清镇市| 礼泉县| 镇雄县| 喀什市| 罗城| 东兰县| 荥经县| 习水县| 桓台县| 介休市| 林西县| 长兴县| 溧水县| 呼和浩特市| 黄浦区| 石楼县| 昭通市| 奉化市| 苏尼特右旗| 凤冈县| 江西省|