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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

串口丟數據的幾個常見原因

凡億PCB ? 來源:嵌入式專欄 ? 作者:strongerHuang ? 2022-04-02 15:50 ? 次閱讀

UART:Universal Asynchronous Receiver / Transmitter,通用異步收發(fā)傳輸器,即我們通常說的串口。

串口是工程師最常用的串行外設之一,但在實際應用中還是會經常遇到各種問題。比如:丟失一字節(jié)數據。

今天我們就結合STM32來講講UART相關內容,以及容易丟失一字節(jié)數據的問題。

UART幾個標志位

這里重點說一下UART狀態(tài)寄存器中的幾個標志位:TXE、 TC、 RXNE、 ORE。

78bc95ce-b01d-11ec-aa7f-dac502259ad0.png

這幾個標志位在編程中經常使用,直接用函數庫的同學可能沒有關心過這幾個標志位,數據丟失有可能就是對它們操作不當而導致出錯。

TXE:發(fā)送數據寄存器為空 (Transmit data register empty)

0:數據未傳輸到移位寄存器

1:數據傳輸到移位寄存器

TC:發(fā)送完成 (Transmission complete)

0:傳送未完成

1:傳送已完成

RXNE:讀取數據寄存器不為空 (Read data register not empty)

0:未接收到數據

1:已準備好讀取接收到的數據

ORE:上溢錯誤 (Overrun error)

0:無上溢錯誤

1:檢測到上溢錯誤

UART通信硬件接口

UART通信硬件接口常見有:TTL、 RS232、 RS485。 在編程時需要考慮通信接口方式,在長距離通信的時候,需要考慮線路上的延時,如果操作不當也會導致數據丟失。

1.TTL

TTL比較簡單,就是直接連接UART的Tx和Rx引腳,不需要外部轉換。如圖:

78d5d8c2-b01d-11ec-aa7f-dac502259ad0.png

注意:Tx和Rx引腳需要交叉連接。

2.RS232

RS-232標準接口是常用的串行通信接口標準之一,規(guī)定邏輯“1”的電平為-5V~-15 V,邏輯“0”的電平為+5 V~+15 V。

選用該電氣標準的目的在于提高抗干擾能力,增大通信距離。

3.RS485

RS485一般采用兩線制接線方式,這種接線方式為總線式拓撲結構,在同一總線上可以掛接多個節(jié)點。

在低速、短距離、無干擾的場合可以采用普通的雙絞線;反之,在高速、長線傳輸時,則必須采用阻抗匹配(一般為120Ω)的RS485專用電纜;而在干擾惡劣的環(huán)境下還應采用鎧裝型雙絞屏蔽電纜。

78ff7a2e-b01d-11ec-aa7f-dac502259ad0.jpg

UART接收丟失數據

UART接收丟失數據與軟件和硬件都有可能有關系,下面說幾個常見丟失數據的原因及解決辦法。

1.接收溢出丟失數據

指未及時取走數據導致溢出錯誤而丟失數據,通常是發(fā)生在大量數據、以查詢方式接收數據的情況下。在MCU啟動過程中、接收數據過多處理不及時、復雜系統(tǒng)響應不及時等情況都會出現數據丟失的情況。

解決辦法:

及時清除溢出錯誤標志

利用通信協(xié)議過濾因數據丟失導致的問題

2.接收中斷丟失數據使用UART中斷接收數據相比查詢接收數據的方式更常見,中斷方式比查詢方式響應更及時,但不合理處理同樣也會存在數據丟失的情況。 在數據量大時,UART接收中斷函數耗時、優(yōu)先級低等情況下容易丟失數據。 解決辦法:

中斷函數里減少不必要的耗時

合理分配中斷優(yōu)先級

使能中斷前清除標志位

3.時鐘誤差導致丟失數據在通信波特率較高的情況下,如果時鐘誤差加大,很可能導致數據丟失。 解決辦法:

使用更高精度晶振

降低通信波特率

UART發(fā)送丟失數據

UART發(fā)送丟失數據很多工程師都遇到過,通常情況下是傳輸未完成的原因。 HAL庫已經有幾年了,但還是有很多工程師都使用標準外設庫,這時如果自己封裝接口不當,就會存在發(fā)送最后一字節(jié)數據丟失的問題。 1.UART傳輸未完成導致數據丟失如下代碼,只考慮非空,但實際傳輸并未完成。

void UART_SendByte(uint8_t Data){ while(RESET==USART_GetFlagStatus(USART1,USART_FLAG_TXE)); USART_SendData(USART1, Data);} 但發(fā)送非空不代表發(fā)送完成,雖然在某些場合更高效,但某些場合就會導致數據丟失。 比如:使用此函數發(fā)送之后進入休眠、關閉接收端設備電源等情況下。 解決辦法:等待發(fā)送完成:

void UART_SendByte(uint8_t Data){ while(RESET==USART_GetFlagStatus(USART1,USART_FLAG_TXE)); USART_SendData(USART1, Data); while(RESET == USART_GetFlagStatus(USART1, USART_FLAG_TC));}如果使用標準外設庫,要根據實際情況封裝函數,比如發(fā)送超時。 或者使用HAL封裝的接口,代碼包含判斷傳輸完成:

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)2.線路延時導致數據丟失UART通常會使用232或者485以增加傳輸距離和增強干擾。但是一旦數據線路太長就存在傳輸延時的情況,特別是485傳輸長距離,并使用MCU控制傳輸方向的情況下。 解決辦法:

軟件增加延時處理

使用通信協(xié)議增加應答機制

3.其他原因UART應用的場景比較多,有些應用在復雜的工廠,干擾較大從而導致數據丟失;有些應用在溫差較大的環(huán)境,時鐘偏移較大導致數據丟失。 解決辦法需要根據實際情況,有針對性解決問題。比如:使用更好的通信線,軟件做好容錯處理等。

審核編輯 :李倩

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5253

    瀏覽量

    119205
  • STM32
    +關注

    關注

    2258

    文章

    10828

    瀏覽量

    352490
  • 串口
    +關注

    關注

    14

    文章

    1533

    瀏覽量

    75463

原文標題:串口丟數據的幾個常見原因

文章出處:【微信號:FANYPCB,微信公眾號:凡億PCB】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    常見的網絡包故障定位?法

    本期分享一個比較常見的?絡問題--包。例如我們去ping?個?站,如果能ping通,且?站返回信息全?,則說明與?站服務器的通信是暢通的,如果ping不通,或者?站返回的信息不全等,則很可能是數據
    的頭像 發(fā)表于 12-07 09:48 ?1176次閱讀
    <b class='flag-5'>常見</b>的網絡<b class='flag-5'>丟</b>包故障定位?法

    常見串口通信的幾個問題請教?

    有關常見串口通信的幾個問題請教論壇里的專家? 1、常見串口通信CAN,DP,PN,ETHER IP/TCP,ETHERCAT等,這些
    發(fā)表于 04-04 16:30

    ESP8266_RTOS3.0串口0傳輸大量數據包的原因

    多個分段進入處理函數,后來使用example示例中的uart_echo,發(fā)現接收可以完整接收,但是當把數據原樣從串口0的tx輸出時,數據中間出現多次中斷包。 我發(fā)現用系統(tǒng)自帶的打印
    發(fā)表于 07-09 06:32

    請問Z-stack SerialApp通訊包是什么原因?

    ,也就幾KB),包還是會發(fā)生,而且一旦發(fā)生,通訊就好像完全堵上,后續(xù)的數據都沒法傳輸,要等好幾秒才能又繼續(xù)。請問照成這樣的原因是什么?buffer小了?有沒有改進的方法(減少包率,
    發(fā)表于 08-13 06:11

    串口連續(xù)讀取數據錯包,包,死機

    `串口波特率115200,發(fā)送速率1S/500包,一包9個字節(jié),程序框圖如下圖1,正確讀取,不正確用0 填補:因為while和延遲的原因,實際是20ms讀一次,而發(fā)是2ms一次,時間差導致了不同步
    發(fā)表于 12-09 16:37

    TFT畫點數據,所謂的數據怎么?

    TFT畫點數據,所謂的數據怎么? 是寫什么呢?
    發(fā)表于 08-07 08:00

    網絡數據及攝像機包的原因

      不少人在使用網絡和監(jiān)控攝像系統(tǒng)的時候都有遇到過數據包的情況,數據包的原因是多種多樣的,以下就為大家介紹一下網絡
    發(fā)表于 02-19 17:30

    如何解決stm32DMA+消息隊列串口數據接收包的問題?

    如何解決stm32DMA+消息隊列串口數據接收包的問題?
    發(fā)表于 12-09 06:31

    N76E003雙串口+MC8618無卡校時會數據原因?

    踩了很多坑終于搞定這個玩意,N76E003雙串口,代碼中已經,將主頻調到16.6M不過115200串口0還是偶爾數據,串口1用了一個323
    發(fā)表于 06-25 07:58

    網絡數據包的原因及攝像機包的原因

    不少人在使用網絡和監(jiān)控攝像系統(tǒng)的時候都有遇到過數據包的情況,數據包的原因是多種多樣的,以下就為大家介紹一下網絡
    的頭像 發(fā)表于 01-11 09:27 ?1.3w次閱讀

    常見的云網絡包故障定位?法

    本期分享一個比較常見的?絡問題--包。例如我們去ping?個?站,如果能ping通,且?站返回信息全?,則說明與?站服務器的通信是暢通的,如果ping不通,或者?站返回的信息不全等,則很可能是數據
    的頭像 發(fā)表于 02-23 11:30 ?4299次閱讀
    <b class='flag-5'>常見</b>的云網絡<b class='flag-5'>丟</b>包故障定位?法

    分享一個比較常見的?絡問題--

    數據在Internet上是以數據包為單位傳輸的,單位為字節(jié),數據在?絡上傳輸,受?絡設備,?絡質量等原因的影響,使得接收到的數據?于發(fā)送出去
    的頭像 發(fā)表于 03-11 11:26 ?5007次閱讀
    分享一個比較<b class='flag-5'>常見</b>的?絡問題--<b class='flag-5'>丟</b>包

    STM32串口中斷及DMA接收常見幾個問題

    STM32串口中斷及DMA接收常見幾個問題
    的頭像 發(fā)表于 10-26 16:41 ?3174次閱讀
    STM32<b class='flag-5'>串口</b>中斷及DMA接收<b class='flag-5'>常見</b>的<b class='flag-5'>幾個</b>問題

    GD32 串口接受異常的幾個原因

    前面我們介紹過GD32 485發(fā)送時出現異常的最常見原因,有小伙伴反饋想要知道GD32 串口接受異常的可能原因,今天我們就來安排。
    的頭像 發(fā)表于 01-18 09:57 ?3830次閱讀
    GD32 <b class='flag-5'>串口</b>接受異常的<b class='flag-5'>幾個</b><b class='flag-5'>原因</b>

    步進電機步的原因和解決方法

    步進電機步的原因和解決方法 步進電機是一種常見的電動機類型,特點是可以實現精確的位置控制和旋轉運動。然而,在實際使用過程中,步進電機有時會出現步的現象,即無法按照預定步長準確移動。
    的頭像 發(fā)表于 02-01 16:32 ?3966次閱讀