在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

三種方法實現串口接收不定長度的數據

CHANBAEK ? 來源:硬件設計工匠 ? 作者:魚 ? 2023-09-14 16:16 ? 次閱讀

下面三種方式都親測可用,實際使用時應采用第三種方法,更有效率。

方法一:

先說重點:

1)RXNE,表示一個字節產生一次中斷,這里要著重說明一下,是一個字節。原因是DR寄存器是32位,有效位是8位。比如串口發送的字符或字符串,其對應的ASICC碼的二進制都是8位的,所以不管是發送“1”,都是8位

2)IDLE,表示DR先有數據(可以是一個字節的數據,也可以是N個字節的數據連續發過來),然后空閑了一個字節的時間,就會產生中斷。

圖片

如果要讓串口發送不定長度的的數據,則先通過RXNE,把數據一個字節一個字節地存起來,當一串信息發送完時,因為要停頓一下,則會產生IDLE中斷,利用IDLE中斷,表示完成接收數據,具體方法如下:

先定義一個數組和數組長度:

uint8_t Rx1_Buff[50]={'0'};

uint8_t rx_buffer_len=0;

圖片

方法二:

使用STM32串口中斷實現非阻塞方式接收不定長數據

一、簡介

1.1、開發環境

STM32CubeIDE V1.9。

1.2、實現功能

使用STM32的串口1,接收不定長數據,并返回接收數據

二、步驟解析

2.1、配置串口

打開“Device Configuration Tool”(即STM32CubeMX),配置串口1。

圖片

注:一定要在“NVIC Settings”欄,勾選“USART1 global interrupt”打開串口中斷。

2.2、初始化

初始化過程中,調用函數“HAL_UARTEx_ReceiveToIdle_IT”。

HAL庫中對該函數的定義:

HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)。

huart:定義串口,一般填寫 &huartx(x為串口號,取1、2、3……)。本案例使用串口1,則填寫&huart1;

pData:接收數據存放的首地址,一般填寫一維數組名;

Size:定義接收的字節長度,填寫接收數據的最大字節數。

2.3、回調函數

調用函數“HAL_UARTEx_ReceiveToIdle_IT”后,當接收長度等于Size,或者串口接收數據過程中產生空閑時,會執行回調函數"HAL_UARTEx_RxEventCallback"。

HAL庫中對該函數的定義:

__weak void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)

huart:回調串口號;

Size:實際接收的字節長度。

注:該回調函數為空的弱函數,函數主體需自己重新定義。

三、實例

從串口1接收不定長數據,存放在數組array[50]中,并返回所接收的數據。

3.1、定義

定義一維數組array:

uint8_t array[50];

3.2、主函數

在主函數的初始化過程,調用函數“HAL_UARTEx_ReceiveToIdle_IT”:

void main()

{

HAL_UARTEx_ReceiveToIdle_IT(&huart1, array, 50); //初始化開啟串口接收

while(1);

}

3.3、重新定義回調函數

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)

{

if(huart==&huart1) //判定:串口1接收

{

HAL_UART_Transmit(&huart1,Rx1_Buff,strlen((constchar*)Rx1_Buff),0x000A); //把接收到的數據發送出去

memset(Rx1_Buff,0,strlen((const char*)Rx1_Buff));//清空數組

HAL_UARTEx_ReceiveToIdle_IT(&huart1, array, 50) ; //重新開啟串口接收

}

}

初始化打開串口接收中斷,當串口接收滿50字節,或串口產生空閑時,會執行回調函數。回調函數里判斷串口后正確后,執行對應的功能函數,并再次開啟串口接收中斷。

HAL_UARTEx_ReceiveToIdle_IT(),其實是實現RXNE和IDLE中斷,和方式一是一樣的原理

圖片

圖片

以上兩種方式,每一個字符都會中斷一次,效率不高,采用DMA接收的方式會更高一點,DMA空閑中斷的方式見這份文檔《STM32F103用hal庫使用DMA+串口空閑中斷接收數據_L》,或下方第三種方式.

方法三:

1.CUBE的設置就不講了,CUBE設置完后,就進行第二步。

2.生成代碼后,在main函數中打開串口空閑中斷,單個字符中斷用于接收用的,因為我這例程作用是串口1發送數據并把數據發送回來。

圖片

3.在串口中斷中添加如下:

圖片

4.DMA發送完后,要清除數組Rx1_Buff里的數據,不然下次接收的數據會重復覆蓋,有可能覆蓋不全。其實HAL_UART_Transmit_DMA(), 這個函數接收完會調用回調函數。

HAL_UART_Transmit_DMA() - >

UART_DMATransmitCplt - >

HAL_UART_TxCpltCallback() - >

__weak void HAL_UART_TxCpltCallback()

5.構造HAL_UART_TxCpltCallback()函數,不需要添加申明

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

    關注

    2282

    文章

    10986

    瀏覽量

    361085
  • 中斷
    +關注

    關注

    5

    文章

    902

    瀏覽量

    42339
  • 串口
    +關注

    關注

    14

    文章

    1580

    瀏覽量

    78293
  • 字符串
    +關注

    關注

    1

    文章

    589

    瀏覽量

    20933
收藏 人收藏

    評論

    相關推薦

    CW32L083串口中斷+定時器實現不定長數據接收

    CW32L083 用串口中斷加定時器中斷實現串口不定長數據接收,特別適用于AT指令的
    的頭像 發表于 07-12 09:00 ?2397次閱讀
    CW32L083<b class='flag-5'>串口</b>中斷+定時器<b class='flag-5'>實現</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b><b class='flag-5'>接收</b>

    如何使用DMA進行USART不定長度接收

    在上一講中,我們對USART進行了簡單介紹,并講解了如何在不使用DMA的情況下進行不定長度數據接收,本講將著重講解如何使用DMA進行USART不定長度接收
    的頭像 發表于 02-18 17:01 ?663次閱讀
    如何使用DMA進行USART<b class='flag-5'>不定長度</b><b class='flag-5'>接收</b>

    串口DMA傳輸不定長度包的方式

    經常看到有人在問用DMA接收不定長包的問題,由于STM32DMA的特殊性,使其對接收不定長數據不太方便,很多人都在為此傷腦筋,也有不少牛人
    發表于 12-26 08:48

    STM32單片機的接收不定長度字節數據方法

    STM32串口使用IDLE中斷接收不定長數據原理與源程序轉載 2016年07月16日 18:20:24原文來自 今天說一下STM32單片機的接收
    發表于 08-04 09:05

    stm32串口是如何實現接收不定長度數據的呢

    1.不定長度數據為什么會存在串口接收不定長度數據呢?首先,在通信雙方進行數據傳輸的時候,由于不同的設備在
    發表于 08-11 08:18

    不定長數據接收的原理是什么?怎么實現串口數據不定長接收

    不定長數據接收的原理是什么?怎么實現串口數據不定長
    發表于 11-16 08:11

    STM32 HAL DMA串口接收不定長度實現方法

    STM32 HAL DMA串口接收不定長度實現方法
    發表于 12-08 07:59

    STM32串口接收不定長數據實現方法

    STM32串口接收不定長數據實現方法
    發表于 12-09 06:17

    HAL庫下串口接收不定長數據方法

    STM32單片機HAL庫下串口接收不定長數據HAL庫下的串口接收
    發表于 01-19 06:55

    STM32串口接收不定長數據的幾種方法

    在使用串口接收其他設備的數據時,應該針對數據的特點,譬如單字節與多字節、數據量大小、速度等,采用不同的
    發表于 11-26 13:21 ?17次下載
    STM32<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b>的幾<b class='flag-5'>種方法</b>

    stm32 串口接收不定長度數據及黏包處理 + 串口DMA接收

    1.不定長度數據 為什么會存在串口接收不定長度數據呢?首先,在通信雙方進行數據傳輸的時候,由于不同的設備在
    發表于 12-23 19:09 ?27次下載
    stm32 <b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長度數據</b>及黏包處理 + <b class='flag-5'>串口</b>DMA<b class='flag-5'>接收</b>

    STM32 DMA串口接收不定長數據

    STM32 DMA串口接收不定長數據
    發表于 12-24 18:50 ?41次下載
    STM32  DMA<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b>

    STM32之串口DMA接收不定長數據

    目錄STM32之串口DMA接收不定長數據引言DMA簡介什么是DMA在STM32的DMA資源DMA接收數據
    發表于 12-24 19:03 ?30次下載
    STM32之<b class='flag-5'>串口</b>DMA<b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b>

    STM32CubeMX之串口接收不定長數據

    基本串口通信通常只能接收定長數據,無法穩定接收不定長數據
    的頭像 發表于 05-11 09:59 ?3871次閱讀
    STM32CubeMX之<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b>

    【代碼分享】基于樂鑫ESP32的串口不定長數據接收方法

    【代碼分享】基于樂鑫ESP32的串口不定長數據接收方法
    的頭像 發表于 11-15 01:02 ?1157次閱讀
    【代碼分享】基于樂鑫ESP32的<b class='flag-5'>串口</b><b class='flag-5'>不定長</b><b class='flag-5'>數據</b><b class='flag-5'>接收方法</b>
    主站蜘蛛池模板: 老司机精品视频免费 | 热久久这里只有精品 | 黄色a站| 1024免费永久福利视频 | 国产乱淫a∨片免费视频 | 涩涩高清无乱码在线观看 | 久久久夜 | 人与牲动交xxxbbb | 性色在线观看 | 97av视频在线播放 | 亚洲色图2| a级毛片网站 | 免费成人黄色网址 | 亚洲国产精品嫩草影院 | 求av网址| 韩国黄色三级视频 | 一道精品一区二区三区 | 91中文在线观看 | 亚洲精品日韩专区silk | 亚洲1页 | 伊人小婷婷色香综合缴缴情 | 97射射 | 亚洲免费视频播放 | 东北老女人啪啪对白 | 国产亚洲美女精品久久久久狼 | 女人张开腿让男人桶免费网站 | 成人人免费夜夜视频观看 | 李老汉和小花的性生生活 | 欧美性xxxx交 | 亚洲综合色就色手机在线观看 | 午夜在线观看视频在线播放版 | 拍拍拍无挡视频免费全程1000 | 5g影院天天| 国产综合13p| 五月婷婷激情五月 | 女人张开腿让男人做爽爽 | 男女做视频网站免费观看 | 久青草国产手机在线观 | 男人的天堂天堂网 | 色婷婷基地 | 国产免费久久精品 |