1、接收溢出丟失數據
指未及時取走數據導致溢出錯誤而丟失數據,通常是發生在大量數據、以查詢方式接收數據的情況下。在MCU啟動過程中、接收數據過多處理不及時、復雜系統響應不及時等情況都會出現數據丟失的情況。
解決辦法:
- 及時清除溢出錯誤標志
- 利用通信協議過濾因數據丟失導致的問題
2、接收中斷丟失數據
使用UART中斷接收數據相比查詢接收數據的方式更常見,中斷方式比查詢方式響應更及時,但不合理處理同樣也會存在數據丟失的情況。
在數據量大時,UART接收中斷函數耗時、優先級低等情況下容易丟失數據。
解決辦法:
-
中斷函數里減少不必要的耗時
- 合理分配中斷優先級
- 使能中斷前清除標志位
3、時鐘誤差導致丟失數據
在通信波特率較高的情況下,如果時鐘誤差加大,很可能導致數據丟失。
解決辦法:
-
使用更高精度晶振
- 降低通信波特率
UART發送丟失數據
UART發送丟失數據很多工程師都遇到過,通常情況下是傳輸未完成的原因。
HAL庫已經有幾年了,但還是有很多工程師都使用標準外設庫,這時如果自己封裝接口不當,就會存在發送最后一字節數據丟失的問題。
1、UART傳輸未完成導致數據丟失
如下代碼,只考慮非空,但實際傳輸并未完成。
void UART_SendByte(uint8_t Data)
不過,發送非空不代表發送完成,雖然在某些場合更高效,但某些場合就會導致數據丟失。
比如:
使用此函數發送之后進入休眠、關閉接收端設備電源等情況下。
解決辦法:
- 等待發送完成
void UART_SendByte(uint8_t Data)
如果使用標準外設庫,要根據實際情況封裝函數,比如發送超時。
或者使用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應用的場景比較多,有些應用在復雜的工廠,干擾較大從而導致數據丟失;有些應用在溫差較大的環境,時鐘偏移較大導致數據丟失。
解決辦法需要根據實際情況,有針對性解決問題。比如:使用更好的通信線,軟件做好容錯處理等。

審核編輯:湯梓紅
-
mcu
+關注
關注
146文章
17718瀏覽量
358031 -
數據
+關注
關注
8文章
7233瀏覽量
90725 -
uart
+關注
關注
22文章
1251瀏覽量
102833
發布評論請先 登錄
相關推薦
請問6657upp丟失數據可能是什么原因導致?
UART的可能性會導致數據丟失嗎?
工控電腦使用中的“這些”原因會造成數據的丟失,請勿忽視,歡迎補充
Flash數據丟失的原因

評論