日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

通信教程 | 串口丢数据常见的原因

發布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通信教程 | 串口丢数据常见的原因 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

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

UART幾個標志位

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

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

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

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

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

TC:發送完成 (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引腳,不需要外部轉換。如圖:

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

2.RS232

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

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

3.RS485

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

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

UART接收丟失數據

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

1.接收溢出丟失數據

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

解決辦法:

  • 及時清除溢出錯誤標志

  • 利用通信協議過濾因數據丟失導致的問題

2.接收中斷丟失數據

使用UART中斷接收數據相比查詢接收數據的方式更常見,中斷方式比查詢方式響應更及時,但不合理處理同樣也會存在數據丟失的情況。

在數據量大時,UART接收中斷函數耗時、優先級低等情況下容易丟失數據。

解決辦法:

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

  • 合理分配中斷優先級

  • 使能中斷前清除標志位

3.時鐘誤差導致丟失數據

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

解決辦法:

  • 使用更高精度晶振

  • 降低通信波特率

UART發送丟失數據

UART發送丟失數據很多工程師都遇到過,通常情況下是傳輸未完成的原因。

HAL庫已經有幾年了,但還是有很多工程師都使用標準外設庫,這時如果自己封裝接口不當,就會存在發送最后一字節數據丟失的問題。

1.UART傳輸未完成導致數據丟失

如下代碼,只考慮非空,但實際傳輸并未完成。

void UART_SendByte(uint8_t Data) {while(RESET?==?USART_GetFlagStatus(USART1,?USART_FLAG_TXE));USART_SendData(USART1, Data); }

但發送非空不代表發送完成,雖然在某些場合更高效,但某些場合就會導致數據丟失。

比如:使用此函數發送之后進入休眠、關閉接收端設備電源等情況下。

解決辦法:

等待發送完成:

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)); }

如果使用標準外設庫,要根據實際情況封裝函數,比如發送超時。

或者使用HAL封裝的接口,代碼包含判斷傳輸完成:

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)


2.線路延時導致數據丟失

UART通常會使用232或者485以增加傳輸距離和增強干擾。但是一旦數據線路太長就存在傳輸延時的情況,特別是485傳輸長距離,并使用MCU控制傳輸方向的情況下。

解決辦法:

  • 軟件增加延時處理

  • 使用通信協議增加應答機制

3.其他原因

UART應用的場景比較多,有些應用在復雜的工廠,干擾較大從而導致數據丟失;有些應用在溫差較大的環境,時鐘偏移較大導致數據丟失。

解決辦法需要根據實際情況,有針對性解決問題。比如:使用更好的通信線,軟件做好容錯處理等。

------------?END?------------

總結

以上是生活随笔為你收集整理的通信教程 | 串口丢数据常见的原因的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。