1、接收溢出丟失數(shù)據(jù)
指未及時取走數(shù)據(jù)導(dǎo)致溢出錯誤而丟失數(shù)據(jù),通常是發(fā)生在大量數(shù)據(jù)、以查詢方式接收數(shù)據(jù)的情況下。在MCU啟動過程中、接收數(shù)據(jù)過多處理不及時、復(fù)雜系統(tǒng)響應(yīng)不及時等情況都會出現(xiàn)數(shù)據(jù)丟失的情況。
解決辦法:
- 及時清除溢出錯誤標志
- 利用通信協(xié)議過濾因數(shù)據(jù)丟失導(dǎo)致的問題
2、接收中斷丟失數(shù)據(jù)
使用UART中斷接收數(shù)據(jù)相比查詢接收數(shù)據(jù)的方式更常見,中斷方式比查詢方式響應(yīng)更及時,但不合理處理同樣也會存在數(shù)據(jù)丟失的情況。
在數(shù)據(jù)量大時,UART接收中斷函數(shù)耗時、優(yōu)先級低等情況下容易丟失數(shù)據(jù)。
解決辦法:
-
中斷函數(shù)里減少不必要的耗時
- 合理分配中斷優(yōu)先級
- 使能中斷前清除標志位
3、時鐘誤差導(dǎo)致丟失數(shù)據(jù)
在通信波特率較高的情況下,如果時鐘誤差加大,很可能導(dǎo)致數(shù)據(jù)丟失。
解決辦法:
-
使用更高精度晶振
- 降低通信波特率
UART發(fā)送丟失數(shù)據(jù)
UART發(fā)送丟失數(shù)據(jù)很多工程師都遇到過,通常情況下是傳輸未完成的原因。
HAL庫已經(jīng)有幾年了,但還是有很多工程師都使用標準外設(shè)庫,這時如果自己封裝接口不當,就會存在發(fā)送最后一字節(jié)數(shù)據(jù)丟失的問題。
1、UART傳輸未完成導(dǎo)致數(shù)據(jù)丟失
如下代碼,只考慮非空,但實際傳輸并未完成。
void UART_SendByte(uint8_t Data)
不過,發(fā)送非空不代表發(fā)送完成,雖然在某些場合更高效,但某些場合就會導(dǎo)致數(shù)據(jù)丟失。
比如:
使用此函數(shù)發(fā)送之后進入休眠、關(guān)閉接收端設(shè)備電源等情況下。
解決辦法:
- 等待發(fā)送完成
void UART_SendByte(uint8_t Data)
如果使用標準外設(shè)庫,要根據(jù)實際情況封裝函數(shù),比如發(fā)送超時。
或者使用HAL封裝的接口,代碼包含判斷傳輸完成:
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
2、線路延時導(dǎo)致數(shù)據(jù)丟失
UART通常會使用232或者485以增加傳輸距離和增強干擾。但是一旦數(shù)據(jù)線路太長就存在傳輸延時的情況,特別是485傳輸長距離,并使用MCU控制傳輸方向的情況下。
解決辦法:
-
軟件增加延時處理
-
使用通信協(xié)議增加應(yīng)答機制
3、其他原因
UART應(yīng)用的場景比較多,有些應(yīng)用在復(fù)雜的工廠,干擾較大從而導(dǎo)致數(shù)據(jù)丟失;有些應(yīng)用在溫差較大的環(huán)境,時鐘偏移較大導(dǎo)致數(shù)據(jù)丟失。
解決辦法需要根據(jù)實際情況,有針對性解決問題。比如:使用更好的通信線,軟件做好容錯處理等。

審核編輯:湯梓紅
-
mcu
+關(guān)注
關(guān)注
146文章
17978瀏覽量
366663 -
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7256瀏覽量
91831 -
uart
+關(guān)注
關(guān)注
22文章
1276瀏覽量
103909
發(fā)布評論請先 登錄
請問6657upp丟失數(shù)據(jù)可能是什么原因導(dǎo)致?
UART的可能性會導(dǎo)致數(shù)據(jù)丟失嗎?
工控電腦使用中的“這些”原因會造成數(shù)據(jù)的丟失,請勿忽視,歡迎補充
芯片大批量生產(chǎn)時發(fā)現(xiàn)部分芯片flash里面數(shù)據(jù)丟失,可能是什么原因導(dǎo)致的?
UART 發(fā)送數(shù)據(jù)丟失最后一個字節(jié)
Flash數(shù)據(jù)丟失的原因

關(guān)于UART發(fā)送數(shù)據(jù)丟失最后一個字節(jié)問題的詳細解析-pdf
工控機數(shù)據(jù)丟失原因及解決方法
探析STM32上UART丟失的那一字節(jié)數(shù)據(jù)
UART發(fā)送數(shù)據(jù)丟失最后一個字節(jié)

評論