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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

串口幾種常見丟失數(shù)據(jù)的問題

strongerHuang ? 來源:嵌入式專欄 ? 2023-02-21 09:21 ? 次閱讀

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

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

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

UART幾個(gè)標(biāo)志位

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

6e72110c-b184-11ed-bfe3-dac502259ad0.png

這幾個(gè)標(biāo)志位在編程中經(jīng)常使用,數(shù)據(jù)丟失有可能就是對(duì)它們操作不當(dāng)而導(dǎo)致出錯(cuò)。

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

0:數(shù)據(jù)未傳輸?shù)揭莆患拇嫫?/p>

1:數(shù)據(jù)傳輸?shù)揭莆患拇嫫?/p>

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

0:傳送未完成

1:傳送已完成

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

0:未接收到數(shù)據(jù)

1:已準(zhǔn)備好讀取接收到的數(shù)據(jù)

ORE:上溢錯(cuò)誤 (Overrun error)

0:無上溢錯(cuò)誤

1:檢測(cè)到上溢錯(cuò)誤

UART通信接口

UART常見通信接口有:TTL、 RS232、 RS485。在編程時(shí)需要考慮通信接口方式,在長(zhǎng)距離通信的時(shí)候,需要考慮線路上的延時(shí),如果操作不當(dāng)也會(huì)導(dǎo)致數(shù)據(jù)丟失。 1.TTL

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

6ead74b8-b184-11ed-bfe3-dac502259ad0.png

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

2.RS232

RS-232標(biāo)準(zhǔn)接口是常用的串行通信接口標(biāo)準(zhǔn)之一,規(guī)定邏輯“1”的電平為-5V~-15 V,邏輯“0”的電平為+5 V~+15 V。選用該電氣標(biāo)準(zhǔn)的目的在于提高抗干擾能力,增大通信距離。

3.RS485

RS485一般采用兩線制接線方式,這種接線方式為總線式拓?fù)浣Y(jié)構(gòu),在同一總線上可以掛接多個(gè)節(jié)點(diǎn)。

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

6ee49966-b184-11ed-bfe3-dac502259ad0.jpg

UART接收丟失數(shù)據(jù)

UART接收丟失數(shù)據(jù)與軟件和硬件都有可能有關(guān)系,下面說幾個(gè)常見丟失數(shù)據(jù)的原因及解決辦法。

1.接收溢出丟失數(shù)據(jù)

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

解決辦法:

及時(shí)清除溢出錯(cuò)誤標(biāo)志

利用通信協(xié)議過濾因數(shù)據(jù)丟失導(dǎo)致的問題

2.接收中斷丟失數(shù)據(jù)

使用UART中斷接收數(shù)據(jù)相比查詢接收數(shù)據(jù)的方式更常見,中斷方式比查詢方式響應(yīng)更及時(shí),但不合理處理同樣也會(huì)存在數(shù)據(jù)丟失的情況。

在數(shù)據(jù)量大時(shí),UART接收中斷函數(shù)耗時(shí)、優(yōu)先級(jí)低等情況下容易丟失數(shù)據(jù)。

解決辦法:

中斷函數(shù)里減少不必要的耗時(shí)

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

使能中斷前清除標(biāo)志位

3.時(shí)鐘誤差導(dǎo)致丟失數(shù)據(jù)

在通信波特率較高的情況下,如果時(shí)鐘誤差加大,很可能導(dǎo)致數(shù)據(jù)丟失。

解決辦法:

使用更高精度晶振

降低通信波特率

UART發(fā)送丟失數(shù)據(jù)

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

HAL庫(kù)已經(jīng)有幾年了,但還是有很多工程師都使用標(biāo)準(zhǔn)外設(shè)庫(kù),這時(shí)如果自己封裝接口不當(dāng),就會(huì)存在發(fā)送最后一字節(jié)數(shù)據(jù)丟失的問題。

1.UART傳輸未完成導(dǎo)致數(shù)據(jù)丟失

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

void UART_SendByte(uint8_t Data)

{

while(RESET == USART_GetFlagStatus(USART1, USART_FLAG_TXE));

USART_SendData(USART1, Data);

}

但發(fā)送非空不代表發(fā)送完成,雖然在某些場(chǎng)合更高效,但某些場(chǎng)合就會(huì)導(dǎo)致數(shù)據(jù)丟失。

比如:使用此函數(shù)發(fā)送之后進(jìn)入休眠、關(guān)閉接收端設(shè)備電源等情況下。

解決辦法:

等待發(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));

}

如果使用標(biāo)準(zhǔn)外設(shè)庫(kù),要根據(jù)實(shí)際情況封裝函數(shù),比如發(fā)送超時(shí)。

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

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

2.線路延時(shí)導(dǎo)致數(shù)據(jù)丟失

UART通常會(huì)使用232或者485以增加傳輸距離和增強(qiáng)干擾。但是一旦數(shù)據(jù)線路太長(zhǎng)就存在傳輸延時(shí)的情況,特別是485傳輸長(zhǎng)距離,并使用MCU控制傳輸方向的情況下。

解決辦法:

軟件增加延時(shí)處理

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

3.其他原因

UART應(yīng)用的場(chǎng)景比較多,有些應(yīng)用在復(fù)雜的工廠,干擾較大從而導(dǎo)致數(shù)據(jù)丟失;有些應(yīng)用在溫差較大的環(huán)境,時(shí)鐘偏移較大導(dǎo)致數(shù)據(jù)丟失。

解決辦法需要根據(jù)實(shí)際情況,有針對(duì)性解決問題。比如:使用更好的通信線,軟件做好容錯(cuò)處理等。

審核編輯 :李倩

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

    關(guān)注

    31

    文章

    5304

    瀏覽量

    119876
  • 串口
    +關(guān)注

    關(guān)注

    14

    文章

    1540

    瀏覽量

    76095
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1221

    瀏覽量

    101132

原文標(biāo)題:串口幾種常見丟失數(shù)據(jù)的問題

文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    介紹了關(guān)于RAID5系統(tǒng)發(fā)生數(shù)據(jù)丟失常見問題

    本文介紹了關(guān)于RAID5系統(tǒng)發(fā)生數(shù)據(jù)丟失常見問題,同時(shí)提醒大家,如果你的系統(tǒng)出現(xiàn)了數(shù)據(jù)丟失,沒有把握的情況下不要再對(duì)該系統(tǒng)輕舉妄動(dòng),以免錯(cuò)
    的頭像 發(fā)表于 02-07 09:07 ?1.4w次閱讀

    串口發(fā)送的這幾種寫法,你用過幾種?

    串口發(fā)送的這幾種寫法,你用過幾種?
    的頭像 發(fā)表于 11-02 16:20 ?1047次閱讀
    <b class='flag-5'>串口</b>發(fā)送的這<b class='flag-5'>幾種</b>寫法,你用過<b class='flag-5'>幾種</b>?

    【求助】串口定時(shí)發(fā)送數(shù)據(jù)丟失

    labview通過串口發(fā)送數(shù)據(jù),定時(shí)循環(huán)1ms,通過示波器測(cè)量發(fā)送出來的數(shù)據(jù)有大量丟失,求高手幫忙看一下怎么解決示波器測(cè)得的數(shù)據(jù)
    發(fā)表于 12-04 17:14

    串口發(fā)送數(shù)據(jù)超過十個(gè)數(shù)據(jù)就出現(xiàn)數(shù)據(jù)丟失

    自己編寫的程序,給串口1發(fā)送數(shù)據(jù),然后串口1再發(fā)回主機(jī),但是出現(xiàn)個(gè)問題,只能發(fā)十個(gè)數(shù)據(jù),超過十個(gè)就出現(xiàn)數(shù)據(jù)
    發(fā)表于 01-29 07:35

    如何解決串口輸出數(shù)據(jù)丟失問題

    SerialChart測(cè)試,發(fā)現(xiàn)數(shù)據(jù)經(jīng)常丟失,或者出現(xiàn)一個(gè)很大的數(shù)(明顯超出ADC的輸出范圍)??沙醪綌喽?,是串口輸出部分出了問題。調(diào)試得出的結(jié)果很簡(jiǎn)單,但一開始走了很多彎路,如下:
    發(fā)表于 07-23 08:28

    UCOS串口丟失數(shù)據(jù)怎么解決?

    大家好,在下也沒用過幾次UCos,同樣一塊板子我用LL函數(shù)庫(kù)調(diào)試出來的串口串口只接受數(shù)據(jù),不發(fā)送,發(fā)送10000+次,數(shù)據(jù)都沒丟失的現(xiàn)象;
    發(fā)表于 05-25 04:36

    串口循環(huán)發(fā)送數(shù)據(jù)時(shí),數(shù)據(jù)丟失的原因?

    請(qǐng)問原子哥用串口循環(huán)發(fā)送數(shù)據(jù)時(shí)為什么會(huì)有數(shù)據(jù)丟失
    發(fā)表于 07-08 06:05

    常見數(shù)據(jù)定義偽指令有哪幾種

    常見數(shù)據(jù)定義偽指令有哪幾種?啟動(dòng)代碼作用一般是什么?
    發(fā)表于 11-29 06:17

    怎樣去使用串口空閑中斷避免數(shù)據(jù)丟失

    STM32的串口中斷標(biāo)記中有哪幾種?基于CubeMx生成的HAL庫(kù)代碼該如何去實(shí)現(xiàn)呢?怎樣去使用串口空閑中斷避免數(shù)據(jù)丟失呢?
    發(fā)表于 12-09 07:59

    STM32串口數(shù)據(jù)的接收與發(fā)送處理的幾種模式分別是哪些

    STM32串口發(fā)送數(shù)據(jù)為什么會(huì)丟失呢?怎樣去解決?STM32串口數(shù)據(jù)的接收與發(fā)送處理的幾種模式分
    發(fā)表于 12-10 07:37

    stm32串口首次發(fā)送數(shù)據(jù)丟失的原因?怎么解決?

    stm32串口首次發(fā)送數(shù)據(jù)丟失的原因?怎么解決?
    發(fā)表于 12-13 07:15

    如何解決STM32串口輸出數(shù)據(jù)丟失問題?

    如何解決STM32串口輸出數(shù)據(jù)丟失問題?
    發(fā)表于 12-13 06:07

    串口中斷丟失數(shù)據(jù)問題

    關(guān)于51單片機(jī),串口中斷發(fā)送與接收出現(xiàn)數(shù)據(jù)丟失問題串口中斷的接收器具有雙緩沖結(jié)構(gòu),即在從接收寄存器中讀出前一個(gè)已收到的字節(jié)之前,便能接收第2個(gè)字節(jié),如果第2個(gè)字節(jié)已經(jīng)接收完畢,第1個(gè)字
    發(fā)表于 02-17 00:13 ?3526次閱讀

    串口屏的幾種安裝方式

    串口屏的幾種安裝方式
    的頭像 發(fā)表于 05-10 11:28 ?1486次閱讀

    ROM數(shù)據(jù)丟失常見原因

    常見原因 1. 硬件故障 1.1 物理?yè)p壞 ROM芯片可能因?yàn)槲锢頉_擊、高溫、濕度、腐蝕等因素而損壞。這些因素可能導(dǎo)致芯片內(nèi)部電路斷裂或短路,從而造成數(shù)據(jù)丟失。 1.2 老化 隨著時(shí)間的推移,ROM芯片會(huì)逐漸老化,其性能會(huì)逐漸
    的頭像 發(fā)表于 11-04 10:29 ?171次閱讀