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)
不過,發(fā)送非空不代表發(fā)送完成,雖然在某些場合更高效,但某些場合就會導致數據丟失。
比如:
使用此函數發(fā)送之后進入休眠、關閉接收端設備電源等情況下。
解決辦法:
- 等待發(fā)送完成
void UART_SendByte(uint8_t Data)
如果使用標準外設庫,要根據實際情況封裝函數,比如發(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)境,時鐘偏移較大導致數據丟失。
解決辦法需要根據實際情況,有針對性解決問題。比如:使用更好的通信線,軟件做好容錯處理等。
審核編輯:湯梓紅
-
mcu
+關注
關注
147文章
18614瀏覽量
387224 -
數據
+關注
關注
8文章
7315瀏覽量
93988 -
uart
+關注
關注
22文章
1304瀏覽量
106120
發(fā)布評論請先 登錄
請問6657upp丟失數據可能是什么原因導致?
UART的可能性會導致數據丟失嗎?
工控電腦使用中的“這些”原因會造成數據的丟失,請勿忽視,歡迎補充
芯片大批量生產時發(fā)現部分芯片flash里面數據丟失,可能是什么原因導致的?
Flash數據丟失的原因
工控機數據丟失原因及解決方法
探析STM32上UART丟失的那一字節(jié)數據
UART發(fā)送數據丟失最后一個字節(jié)

UART數據丟失可能原因
評論