一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

三種方法實(shí)現(xiàn)串口接收不定長(zhǎng)度的數(shù)據(jù)

CHANBAEK ? 來(lái)源:硬件設(shè)計(jì)工匠 ? 作者:魚 ? 2023-09-14 16:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

下面三種方式都親測(cè)可用,實(shí)際使用時(shí)應(yīng)采用第三種方法,更有效率。

方法一:

先說(shuō)重點(diǎn):

1)RXNE,表示一個(gè)字節(jié)產(chǎn)生一次中斷,這里要著重說(shuō)明一下,是一個(gè)字節(jié)。原因是DR寄存器是32位,有效位是8位。比如串口發(fā)送的字符或字符串,其對(duì)應(yīng)的ASICC碼的二進(jìn)制都是8位的,所以不管是發(fā)送“1”,都是8位

2)IDLE,表示DR先有數(shù)據(jù)(可以是一個(gè)字節(jié)的數(shù)據(jù),也可以是N個(gè)字節(jié)的數(shù)據(jù)連續(xù)發(fā)過(guò)來(lái)),然后空閑了一個(gè)字節(jié)的時(shí)間,就會(huì)產(chǎn)生中斷。

圖片

如果要讓串口發(fā)送不定長(zhǎng)度的的數(shù)據(jù),則先通過(guò)RXNE,把數(shù)據(jù)一個(gè)字節(jié)一個(gè)字節(jié)地存起來(lái),當(dāng)一串信息發(fā)送完時(shí),因?yàn)橐nD一下,則會(huì)產(chǎn)生IDLE中斷,利用IDLE中斷,表示完成接收數(shù)據(jù),具體方法如下:

先定義一個(gè)數(shù)組和數(shù)組長(zhǎng)度:

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

uint8_t rx_buffer_len=0;

圖片

方法二:

使用STM32串口中斷實(shí)現(xiàn)非阻塞方式接收不定長(zhǎng)數(shù)據(jù)

一、簡(jiǎn)介

1.1、開發(fā)環(huán)境

STM32CubeIDE V1.9。

1.2、實(shí)現(xiàn)功能

使用STM32的串口1,接收不定長(zhǎng)數(shù)據(jù),并返回接收數(shù)據(jù)

二、步驟解析

2.1、配置串口

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

圖片

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

2.2、初始化

初始化過(guò)程中,調(diào)用函數(shù)“HAL_UARTEx_ReceiveToIdle_IT”。

HAL庫(kù)中對(duì)該函數(shù)的定義:

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

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

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

Size:定義接收的字節(jié)長(zhǎng)度,填寫接收數(shù)據(jù)的最大字節(jié)數(shù)。

2.3、回調(diào)函數(shù)

調(diào)用函數(shù)“HAL_UARTEx_ReceiveToIdle_IT”后,當(dāng)接收長(zhǎng)度等于Size,或者串口接收數(shù)據(jù)過(guò)程中產(chǎn)生空閑時(shí),會(huì)執(zhí)行回調(diào)函數(shù)"HAL_UARTEx_RxEventCallback"。

HAL庫(kù)中對(duì)該函數(shù)的定義:

__weak void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)

huart:回調(diào)串口號(hào);

Size:實(shí)際接收的字節(jié)長(zhǎng)度。

注:該回調(diào)函數(shù)為空的弱函數(shù),函數(shù)主體需自己重新定義。

三、實(shí)例

從串口1接收不定長(zhǎng)數(shù)據(jù),存放在數(shù)組array[50]中,并返回所接收的數(shù)據(jù)。

3.1、定義

定義一維數(shù)組array:

uint8_t array[50];

3.2、主函數(shù)

在主函數(shù)的初始化過(guò)程,調(diào)用函數(shù)“HAL_UARTEx_ReceiveToIdle_IT”:

void main()

{

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

while(1);

}

3.3、重新定義回調(diào)函數(shù)

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); //把接收到的數(shù)據(jù)發(fā)送出去

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

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

}

}

初始化打開串口接收中斷,當(dāng)串口接收滿50字節(jié),或串口產(chǎn)生空閑時(shí),會(huì)執(zhí)行回調(diào)函數(shù)?;卣{(diào)函數(shù)里判斷串口后正確后,執(zhí)行對(duì)應(yīng)的功能函數(shù),并再次開啟串口接收中斷。

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

圖片

圖片

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

方法三:

1.CUBE的設(shè)置就不講了,CUBE設(shè)置完后,就進(jìn)行第二步。

2.生成代碼后,在main函數(shù)中打開串口空閑中斷,單個(gè)字符中斷用于接收用的,因?yàn)槲疫@例程作用是串口1發(fā)送數(shù)據(jù)并把數(shù)據(jù)發(fā)送回來(lái)。

圖片

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

圖片

4.DMA發(fā)送完后,要清除數(shù)組Rx1_Buff里的數(shù)據(jù),不然下次接收的數(shù)據(jù)會(huì)重復(fù)覆蓋,有可能覆蓋不全。其實(shí)HAL_UART_Transmit_DMA(), 這個(gè)函數(shù)接收完會(huì)調(diào)用回調(diào)函數(shù)。

HAL_UART_Transmit_DMA() - >

UART_DMATransmitCplt - >

HAL_UART_TxCpltCallback() - >

__weak void HAL_UART_TxCpltCallback()

5.構(gòu)造HAL_UART_TxCpltCallback()函數(shù),不需要添加申明

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

    關(guān)注

    2293

    文章

    11032

    瀏覽量

    365060
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    905

    瀏覽量

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

    關(guān)注

    15

    文章

    1588

    瀏覽量

    79957
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    590

    瀏覽量

    22293
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    CW32L083串口中斷+定時(shí)器實(shí)現(xiàn)不定長(zhǎng)數(shù)據(jù)接收

    CW32L083 用串口中斷加定時(shí)器中斷實(shí)現(xiàn)串口不定長(zhǎng)數(shù)據(jù)接收,特別適用于AT指令的
    的頭像 發(fā)表于 07-12 09:00 ?2686次閱讀
    CW32L083<b class='flag-5'>串口</b>中斷+定時(shí)器<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>不定長(zhǎng)</b><b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>接收</b>

    如何使用DMA進(jìn)行USART不定長(zhǎng)度接收

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

    串口DMA傳輸不定長(zhǎng)度包的方式

    經(jīng)??吹接腥嗽趩?wèn)用DMA接收不定長(zhǎng)包的問(wèn)題,由于STM32DMA的特殊性,使其對(duì)接收不定長(zhǎng)數(shù)據(jù)不太方便,很多人都在為此傷腦筋,也有不少牛人
    發(fā)表于 12-26 08:48

    STM32單片機(jī)的接收不定長(zhǎng)度字節(jié)數(shù)據(jù)方法

    STM32串口使用IDLE中斷接收不定長(zhǎng)數(shù)據(jù)原理與源程序轉(zhuǎn)載 2016年07月16日 18:20:24原文來(lái)自 今天說(shuō)一下STM32單片機(jī)的接收
    發(fā)表于 08-04 09:05

    stm32串口是如何實(shí)現(xiàn)接收不定長(zhǎng)度數(shù)據(jù)的呢

    1.不定長(zhǎng)度數(shù)據(jù)為什么會(huì)存在串口接收不定長(zhǎng)度數(shù)據(jù)呢?首先,在通信雙方進(jìn)行數(shù)據(jù)傳輸?shù)臅r(shí)候,由于不同的設(shè)備在
    發(fā)表于 08-11 08:18

    不定長(zhǎng)數(shù)據(jù)接收的原理是什么?怎么實(shí)現(xiàn)串口數(shù)據(jù)不定長(zhǎng)接收?

    不定長(zhǎng)數(shù)據(jù)接收的原理是什么?怎么實(shí)現(xiàn)串口數(shù)據(jù)不定長(zhǎng)
    發(fā)表于 11-16 08:11

    STM32 HAL DMA串口接收不定長(zhǎng)度實(shí)現(xiàn)方法

    STM32 HAL DMA串口接收不定長(zhǎng)度實(shí)現(xiàn)方法
    發(fā)表于 12-08 07:59

    STM32串口接收不定長(zhǎng)數(shù)據(jù)實(shí)現(xiàn)方法

    STM32串口接收不定長(zhǎng)數(shù)據(jù)實(shí)現(xiàn)方法
    發(fā)表于 12-09 06:17

    HAL庫(kù)下串口接收不定長(zhǎng)數(shù)據(jù)方法

    STM32單片機(jī)HAL庫(kù)下串口接收不定長(zhǎng)數(shù)據(jù)HAL庫(kù)下的串口接收
    發(fā)表于 01-19 06:55

    STM32串口接收不定長(zhǎng)數(shù)據(jù)的幾種方法

    在使用串口接收其他設(shè)備的數(shù)據(jù)時(shí),應(yīng)該針對(duì)數(shù)據(jù)的特點(diǎn),譬如單字節(jié)與多字節(jié)、數(shù)據(jù)量大小、速度等,采用不同的
    發(fā)表于 11-26 13:21 ?17次下載
    STM32<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長(zhǎng)</b><b class='flag-5'>數(shù)據(jù)</b>的幾<b class='flag-5'>種方法</b>

    stm32 串口接收不定長(zhǎng)度數(shù)據(jù)及黏包處理 + 串口DMA接收

    1.不定長(zhǎng)度數(shù)據(jù) 為什么會(huì)存在串口接收不定長(zhǎng)度數(shù)據(jù)呢?首先,在通信雙方進(jìn)行數(shù)據(jù)傳輸?shù)臅r(shí)候,由于不同的設(shè)備在
    發(fā)表于 12-23 19:09 ?27次下載
    stm32 <b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長(zhǎng)度數(shù)據(jù)</b>及黏包處理 + <b class='flag-5'>串口</b>DMA<b class='flag-5'>接收</b>

    STM32 DMA串口接收不定長(zhǎng)數(shù)據(jù)

    STM32 DMA串口接收不定長(zhǎng)數(shù)據(jù)
    發(fā)表于 12-24 18:50 ?41次下載
    STM32  DMA<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長(zhǎng)</b><b class='flag-5'>數(shù)據(jù)</b>

    STM32之串口DMA接收不定長(zhǎng)數(shù)據(jù)

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

    STM32CubeMX之串口接收不定長(zhǎng)數(shù)據(jù)

    基本串口通信通常只能接收定長(zhǎng)數(shù)據(jù),無(wú)法穩(wěn)定接收不定長(zhǎng)數(shù)據(jù)
    的頭像 發(fā)表于 05-11 09:59 ?4113次閱讀
    STM32CubeMX之<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長(zhǎng)</b><b class='flag-5'>數(shù)據(jù)</b>

    【代碼分享】基于樂(lè)鑫ESP32的串口不定長(zhǎng)數(shù)據(jù)接收方法

    【代碼分享】基于樂(lè)鑫ESP32的串口不定長(zhǎng)數(shù)據(jù)接收方法
    的頭像 發(fā)表于 11-15 01:02 ?1462次閱讀
    【代碼分享】基于樂(lè)鑫ESP32的<b class='flag-5'>串口</b><b class='flag-5'>不定長(zhǎng)</b><b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>接收方法</b>