色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

探析STM32上UART丟失的那一字節數據

lcdz66 ? 來源:雨飛工作室 ? 作者:雨飛工作室 ? 2022-12-19 15:36 ? 次閱讀

串口UART=Universal Asynchronous Receiver / Transmitter,通用異步收發傳輸器,是工程師最常用的一種串行外設,常見的接口形式有TTL、 RS232RS485,但在實際應用中還是會經常遇到各種問題,比如:丟失一字節數據。下面就結合STM32來講講UART相關內容,談談容易丟失一字節數據的問題。

1、UART幾個標志位

STM32上UART狀態寄存器中的幾個標志位:TXE、TC、RXNE、ORE。這幾個標志位在編程中經常使用,數據丟失有可能就是對它們操作不當而導致出錯。

9edda93c-7f1b-11ed-8abf-dac502259ad0.png ?

TXE=Transmit dataregister empty,發送數據寄存器為空

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

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

TC=Transmission complete,發送完 0:傳送未完成;

1:傳送已完成

RXNE=Read dataregister not empty,取數據寄存器不為空

0:未接收到數據;

1:已準備好讀取接收到的數據

ORE=Overrun error,上溢錯誤 0:無上溢錯誤;

1:檢測到上溢錯誤

2、UART接收丟失數據

UART接收丟失數據與軟件和硬件都有可能有關系,下面說幾個常見丟失數據的原因及解決辦法。
問題描述 解決辦法
1.接收溢出丟失數據 指未及時取走數據導致溢出錯誤而丟失數據,通常是發生在大量數據、以查詢方式接收數據的情況下。MCU啟動過程中、接收數據過多處理不及時、復雜系統響應不及時等情況都會出現數據丟失的情況。

(1)及時清除溢出錯誤標志;(2)利用通信協議過濾因數據丟失導致的問題

2.接收中斷丟失數據 使用UART中斷接收數據相比查詢接收數據的方式更常見,中斷方式比查詢方式響應更及時,但不合理處理同樣也會存在數據丟失的情況。在數據量大時,UART接收中斷函數耗時、優先級低等情況下容易丟失數據。 (1)中斷函數里減少不必要的耗時;(2)合理分配中斷優先級;(3)使能中斷前清除標志位。
3.時鐘誤差導致丟失數據 在通信波特率較高的情況下,如果時鐘誤差加大,很可能導致數據丟失。 (1)使用更高精度晶振;(2)降低通信波特率。
在編程時需要考慮通信接口方式,在長距離通信的時候,需要考慮線路上的延時,如果操作不當也會導致數據丟失。

3、串口發送的幾種寫法

串口發送的幾種寫法:一、STM32用USART發送字符串

	
void UART_Send_Message(u8 *Data)
{
  while(*Data!='')
  {
      USART_SendData(USART1, *Data);
      while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//讀取串口狀態
      Data++;
  }
}


void main(void)
{
  u8 str_buf[500];
  memset((char *) &str_buf, 0, sizeof(str_buf));
  UART_Send_Message(str_buf);
}
9f147b74-7f1b-11ed-8abf-dac502259ad0.jpg
while(SET == USART_GetFlagStatus(USART1,USART_FLAG_RXNE));

含義是:當接收引腳有數據時,狀態寄存器的USART_FLAG_RXNE就會為1,此時USART_GetFlagStatus(USART1,USART_FLAG_RXNE)的返回值就為1(SET),若無數據則為RESET。


	
		二、USART_FLAG_TXE和USART_FLAG_TC怎么用這里主要說的是在特殊情況下發送字符軟件代碼的寫法:特殊情況指的是:1)調用發送字符串函數“發送完”本機立即掉電;2)調用發送字符串函數“發送完”從機立即掉電;【上面兩種主要用于芯片電源控制的項目中】3)調用發送字符串函數“發送完”立刻進入待機或停機。
		主要說的是兩個標志位:USART_FLAG_TXE 和 USART_FLAG_TC。USART_FLAG_TXE發送緩沖區空標志:說明可以往數據寄存器寫入數據了,但并不代表數據發送完成了。USART_FLAG_TC發送完成標志:這個才是代表USART在緩沖區的數據發送完成了,即從機接收到了數據。這兩個標志的區別在于:它們分別表示數據在發送過程中,在兩個不同的階段中的完成情況。TXE表示數據被從發送緩沖區中取走,轉移到的移位寄存器中,此時發送緩沖是空的,可以向其中補充新的數據了。而TC則表示最后放入發送緩沖區的數據已經完成了從移位寄存器向發送信號線Tx上的轉移。所以,判定數據最終發送完成的標志是TC,而不是TXE。
		
		
					

4、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_StatusTypeDefHAL_UART_Transmit(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize,uint32_tTimeout)

2.線路延時導致數據丟失UART通常會使用232或者485以增加傳輸距離和增強干擾。但是一旦數據線路太長就存在傳輸延時的情況,特別是485傳輸長距離,并使用MCU控制傳輸方向的情況下。解決辦法:軟件增加延時處理;使用通信協議增加應答機制。 3.其他原因UART應用的場景比較多,有些應用在復雜的工廠,干擾較大從而導致數據丟失;有些應用在溫差較大的環境,時鐘偏移較大導致數據丟失。解決辦法需要根據實際情況,有針對性解決問題。比如:使用更好的通信線,軟件做好容錯處理等。 下面講述在不同代碼寫法下,得到不同實驗效果【調試助手接收數據】:常見寫法一:9f5bf9e0-7f1b-11ed-8abf-dac502259ad0.png ?9f74f774-7f1b-11ed-8abf-dac502259ad0.png這種寫法在不是特殊(不掉電、不待機等)情況下,問題不大,USART數據會成功發送出去。但是在上面說的特殊情況下,問題就來了,代碼只將數據放到了發送緩沖區,而沒有發送出去就掉電或待機了,這個時候其實最后兩個字符是沒有發送出去的。2、常見寫法二:9f8444ea-7f1b-11ed-8abf-dac502259ad0.png ?9f932b40-7f1b-11ed-8abf-dac502259ad0.png這種寫法達到的效果和上面存在不同的就是倒數第二個數據發送出去了,也就是只有最后一個字符是沒有發送出去的。3、常見寫法三:9fa14630-7f1b-11ed-8abf-dac502259ad0.png ?9fb6976a-7f1b-11ed-8abf-dac502259ad0.png這種寫法達到的效果和上面兩種寫法又不一樣,發送了10個字符。4、寫法四:9fc86ada-7f1b-11ed-8abf-dac502259ad0.png ?9fe21340-7f1b-11ed-8abf-dac502259ad0.png這種寫法按理說可以實現功能,但實際多次試驗結果卻是第一字節數據丟失了。5、寫法五(正確寫法):9ff57f48-7f1b-11ed-8abf-dac502259ad0.png ?a0104742-7f1b-11ed-8abf-dac502259ad0.png這種寫法是比較完整,為了保守起見,在特殊情況下使用該寫法。

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5343

    瀏覽量

    120426
  • 數據
    +關注

    關注

    8

    文章

    7048

    瀏覽量

    89072
  • STM32
    +關注

    關注

    2270

    文章

    10901

    瀏覽量

    356196
  • uart
    +關注

    關注

    22

    文章

    1237

    瀏覽量

    101426

原文標題:探析STM32上UART丟失的那一字節數據

文章出處:【微信號:雨飛工作室,微信公眾號:雨飛工作室】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何限制IPD語句中的最大字節數

    數據可用時,我正在使用帶有 IP 和 PORT 的擴展 IPD 語句。 我的問題是,如何限制 IPD 語句中的最大字節數? 當我嘗試從服務器作為客戶端檢索數據時,響應包含大約 20k 的
    發表于 07-17 06:06

    TL16C752D具有64字節FIFO的雙路UART數據

    電子發燒友網站提供《TL16C752D具有64字節FIFO的雙路UART數據表.pdf》資料免費下載
    發表于 07-10 09:19 ?0次下載
    TL16C752D具有64<b class='flag-5'>字節</b>FIFO的雙路<b class='flag-5'>UART</b><b class='flag-5'>數據</b>表

    如何獲取FIFO中接收的字節數

    我正在嘗試在 UART0 上接收個字符串,并在最基本的步驟中獲取 RX FIFO 緩沖區中可用的字節數。 我試著使用神奇的公式fifo_len = (READ_PERI_REG
    發表于 07-10 06:03

    具有128字節FIFO的TL16C750E UART數據

    電子發燒友網站提供《具有128字節FIFO的TL16C750E UART數據表.pdf》資料免費下載
    發表于 07-08 09:10 ?0次下載
    具有128<b class='flag-5'>字節</b>FIFO的TL16C750E <b class='flag-5'>UART</b><b class='flag-5'>數據</b>表

    使用ESP32的NVS-BLOB存儲12000個字節數據報錯的原因?

    使用ESP32的NVS-BLOB存儲12000個字節數據,每次完全擦除flash后編程寫第次都沒問題,但之后再寫就報錯誤ESP_ERR_NVS_NOT_ENOUGH_SPACE (0x1105
    發表于 06-21 06:53

    ESP32 BLE如何才能接收大于20字節數據

    我使用例程修改功能,發現在修改MTU加上app 發送了MTU request (512)后,app 讀特征值數據的時候可以次性讀入42個字節數據,但是app 向 ESP32 寫入數據
    發表于 06-20 06:44

    請問SPI如何實現一字節的收發?

    通過SPI方式實現一字節的收發,主要是為了適配以下接口:
    發表于 06-18 07:17

    CC2640R2F BLE如何實現次連接事件傳輸的數據量為500字節,或者更大?

    您好,我想實現次連接事件傳輸的數據量為500字節,或者更大。是如何實現的? MTU設置成255,應該是可以傳輸251字節數據。MAX_NUM_PDU設置成5,應該可以傳送251*5=
    發表于 05-30 06:12

    STM32L431復位后第次接收數據,第一個字節丟失的原因?

    if(__HAL_UART_GET_FLAG( hlpuart1, UART_FLAG_IDLE) != RESET) //判斷已經接受到一字節數據后的空閑中斷{LPUART_IDLECallBack
    發表于 05-29 06:14

    如何在AURIX TC375控制器中向DFLASH存儲器寫入單字節數據

    我可以使用頁面地址在 DFLASH 存儲器中寫入 8 字節數據。 我需要在任意內存地址寫入一個字節數據。 是否可以在任何內存地址位置寫入單字節數據
    發表于 05-27 07:03

    求助,關于stm32的HAL庫對UART采用DMA發送的地址位標志問題求解

    stm32 UART多機通訊可以采用地址喚醒模式,在發送地址字節時設置USART_DR第9位置1即可,原來的標準庫對這種模式的驅動沒問題,現在最新的HAL驅動庫對UART采用DMA發送
    發表于 05-09 07:01

    STM32F030F4串口空閑中斷接收不定長數據,發生中斷后不知道如何計算接收到的字節數

    我用STM32F030F4串口空閑中斷接收不定長數據,發生中斷后不知道怎樣計算接收到的字節數
    發表于 04-03 07:12

    請問cyw20719b2的nvram的存儲空間有多少字節

    1)請問cyw20719b2的nvram 的存儲空間有多少字節? 2)用wiced_hal_write_nvram()或wiced_hal_read_nvram()從nvram 寫入或讀出一字節數據需要多少時間
    發表于 03-01 12:42

    can總線的數據幀中數據長度碼和數據字節數的關系?

    can總線的數據幀中數據長度碼和數據字節數的關系? CAN總線是種常用于數據通信的協議,它使用數據
    的頭像 發表于 01-31 11:31 ?2411次閱讀

    M451讓串口接收8個字節數據,為什么每次用串口調試工具接收到的數據都是2次RxData數據

    如下面的段程序,就是讓串口接收8個字節數據,然后把它們通過串口發送出去。 uint8_t RxData[8]; uint8_t i = 0; void UART0_IRQHandler(void
    發表于 01-17 06:44
    主站蜘蛛池模板: 闺蜜撬开我的腿用黄瓜折磨我| 国产精品自产拍在线观看中文 | 精品亚洲AV无码蜜芽麻豆 | 久久免费看少妇高潮A片2012| 两个人在线观看的视频720| 美女网站免费看| 日韩欧美亚洲精品综合在线| 射90黑b丝女| 亚洲人人为我我为人人| 97视频免费在线观看| 粉嫩国产14xxxxx0000| 京香在线观看| 人性本色联盟| 亚洲欧美综合在线中文| 99RE6这里只有精品国产AV| 国产乱人视频在线观看| 老师真棒无遮瑕版漫画免费| 四川少妇大战4黑人| 中文亚洲大香伊蕉不卡一区| 高清国产在线播放成人| 久久精品18| 视频一区二区中文字幕| 91在线一区二区| 好大好爽CAO死我了BL| 热热久久这里只有精品| 一本二卡三卡四卡乱码麻豆| 差差差差差差差差免费观看| 久久国产高清字幕中文| 四虎影5151毛片在线看| a级男女性高爱潮高清试看| 国产呦精品一区二区三区网站| 嫩草伊人久久精品少妇AV网站| 亚洲精品不卡视频| 成人国产一区| 男人和女人全黄一级毛片| 玄幻全黄h全肉后宫| YELLOW日本动漫免费动漫| 久久久精品成人免费看 | 暖暖视频在线观看高清...| 亚洲粉嫩美白在线| 各种场合肉H校园1V1|