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

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

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

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

撞上電子 ? 2023-05-11 09:59 ? 次閱讀

基本串口通信通常只能接收到定長數(shù)據(jù),無法穩(wěn)定接收不定長數(shù)據(jù),本章介紹利用STM32單片機(jī)的IDLE空閑中斷,接收不定長數(shù)據(jù)。

使能串口1的異步串行通信模式,開啟Usart1的全局中斷。添加DMA通道。b858f22c-ef9b-11ed-ba01-dac502259ad0.png

使用Stm32Cubemx生成源碼, 打開生成的源碼,刪除whiel循環(huán)中的語句。

打開usart.h文件,在文件開頭的USER CODE BEGIN Includes下方引入stdio.h頭文件b88d39ba-ef9b-11ed-ba01-dac502259ad0.png

打開usart.c文件,在USER CODE BEGIN 0與 USER CODE END 0之間添加下列代碼。

#if 1 struct __FILE { int handle; };
FILE __stdout; //定義_sys_exit()以避免使用半主機(jī)模式 void _sys_exit(int x) { x = x; } //重定義fputc函數(shù)int fputc(int ch, FILE *f){ while((USART1->SR&0X40)==0);//循環(huán)發(fā)送,直到發(fā)送完畢 USART1->DR=(uint8_t)ch; return ch;}#endif

打開uart.c文件,在文件頂部的USER CODE BEGIN 0下方添加下列變量。

volatile uint8_t rx1_len = 0; //接收一幀數(shù)據(jù)的長度volatile uint8_t rec1_end_flag = 0; //一幀數(shù)據(jù)接收完成標(biāo)志uint8_trx1_buffer[BUFFER_SIZE]={0}; //接收數(shù)據(jù)緩存數(shù)組

打開uart.c文件,在文件末尾的USER CODE BEGIN 1下方添加下列函數(shù)。

void Usart1_IDLE(void) //USART1的IDLE接收{(diào) uint32_t tmp_flag = 0; uint32_t temp; tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //獲取IDLE標(biāo)志位 if((tmp_flag != RESET))//idle標(biāo)志被置位 { __HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除標(biāo)志位 HAL_UART_DMAStop(&huart1); // 停止DMA傳輸,防止 temp = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);// 獲取DMA中未傳輸?shù)臄?shù)據(jù)個(gè)數(shù) rx1_len = BUFFER_SIZE - temp; //總計(jì)數(shù)減去未傳輸?shù)臄?shù)據(jù)個(gè)數(shù),得到已經(jīng)接收的數(shù)據(jù)個(gè)數(shù) rec1_end_flag = 1; // 接受完成標(biāo)志位置1 }}
void Usart1_Handle() //USART1對接收的一幀數(shù)據(jù)進(jìn)行處理{ DMA_Usart1_Send(rx1_buffer, rx1_len); //將接收到的數(shù)據(jù)回發(fā)給發(fā)送端 rx1_len = 0;//清除計(jì)數(shù) rec1_end_flag = 0;//清除接收結(jié)束標(biāo)志位 HAL_UART_Receive_DMA(&huart1,rx1_buffer,BUFFER_SIZE);//重新打開DMA接收}
void DMA_Usart1_Send(uint8_t *buf,uint8_t len) //串口發(fā)送封裝{ if(HAL_UART_Transmit_DMA(&huart1,buf,len)!= HAL_OK) //判斷是否發(fā)送正常,如果出現(xiàn)異常則進(jìn)入異常中斷函數(shù) { Error_Handler(); }}

b8b4cf48-ef9b-11ed-ba01-dac502259ad0.png

打開usart.h文件,在文件開頭的USER CODE BEGIN Includes下方添加如下語句:

#include "stdio.h"#include "string.h"#define BUFFER_SIZE 100
extern volatile uint8_t rx1_len; //接收一幀數(shù)據(jù)的長度extern volatile uint8_t rec1_end_flag; //一幀數(shù)據(jù)接收完成標(biāo)志extern uint8_t rx1_buffer[BUFFER_SIZE]; //接收數(shù)據(jù)緩存數(shù)組
void Usart1_Handle(void);void DMA_Usart1_Send(uint8_t *buf,uint8_t len);//串口發(fā)送封裝voidUsart1_IDLE(void);

b8df94e4-ef9b-11ed-ba01-dac502259ad0.png

進(jìn)入main.c文件,找到入口函數(shù)void mian(void), 在USER CODE BEGIN 2下方開啟串口1的DILE中斷,并打開DMA接收。

__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //使能IDLE中斷 HAL_UART_Receive_DMA(&huart1,rx1_buffer,BUFFER_SIZE); //開啟DMA接收

在while語句中添加接收查詢語句。

if(rec1_end_flag) //判斷是否接收到1幀數(shù)據(jù){ Usart1_Handle(); //前往數(shù)據(jù)處理函數(shù)處理接收到的數(shù)據(jù)。}

b8ff32fe-ef9b-11ed-ba01-dac502259ad0.png

打開stm32f4xx_it.c文件,在文件開頭引入usart.h頭文件。

b9383bee-ef9b-11ed-ba01-dac502259ad0.png

向下翻stm32f4xx_it.c文件,找到void USART1_IRQHandler(void)函數(shù),此函數(shù)為串口1的中斷入口函數(shù)。在此函數(shù)中添加之前在usart.c文件中創(chuàng)建的IDLE接收函數(shù)。

b94cf58e-ef9b-11ed-ba01-dac502259ad0.png

源碼修改完畢后,編譯下載,打開串口助手,隨意發(fā)送100個(gè)字節(jié)以內(nèi)的任意長度內(nèi)容進(jìn)入單片機(jī),都可得到同樣的回復(fù)。

b9702af4-ef9b-11ed-ba01-dac502259ad0.png

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

    關(guān)注

    8

    文章

    6713

    瀏覽量

    88300
  • STM32
    +關(guān)注

    關(guān)注

    2257

    文章

    10828

    瀏覽量

    352433
收藏 人收藏

    評論

    相關(guān)推薦

    STM32CUBEMX(8)--USART通過定時(shí)器中斷方式接收不定長數(shù)據(jù)

    概述 本文利用中斷實(shí)現(xiàn)串口不定長接收(非DMA),使用HAL庫,將接收數(shù)據(jù)打印出去。 DMA接收
    發(fā)表于 09-06 16:48

    STM32CUBEMX(6)--移植雅特力AT32F403AVGT7,雙串口通過DMA方式接收不定長數(shù)據(jù)

    每個(gè)外設(shè)都需要實(shí)現(xiàn)自己的本地數(shù)據(jù)存儲)相比,DMA解決方案在硅片成本和功耗方面的成本較低。 根據(jù)使用的產(chǎn)品型號的不同,有一個(gè)或兩個(gè)DMA模塊。 本篇文章主要介紹如何使用STM32CubeMX實(shí)現(xiàn)串口
    發(fā)表于 09-06 16:37

    STM32CUBEMX(2)--USART通過DMA方式接收不定長數(shù)據(jù)

    。 本篇文章主要介紹如何使用STM32CubeMX實(shí)現(xiàn)串口DMA讀取,并且打印出去。QQ群:615061293。 硬件準(zhǔn)備 首先需要準(zhǔn)備一個(gè)開發(fā)板,這里我準(zhǔn)備的是NUCLEO-F030R8的開發(fā)板
    發(fā)表于 09-04 11:48

    stm32串口燒錄怎么設(shè)置

    準(zhǔn)備工作 確保您擁有STM32開發(fā)板和相應(yīng)的硬件設(shè)備,如USB轉(zhuǎn)串口模塊。 安裝STM32CubeMXSTM32CubeProgrammer軟件,這些是ST官方提供的工具,用于配置和
    的頭像 發(fā)表于 08-22 09:33 ?447次閱讀

    stm32f103通過UART_RX空閑中斷服務(wù)函數(shù)接收不定長數(shù)據(jù),運(yùn)行一段時(shí)間后會進(jìn)入HardFault_Handler的原因?

    UART_RX_DMA接收。 問題:當(dāng)不使用串口調(diào)試助手發(fā)送時(shí),系統(tǒng)正常運(yùn)行(長時(shí)間),通過串口調(diào)試助手發(fā)送不定長數(shù)據(jù),剛開始正常運(yùn)行,運(yùn)
    發(fā)表于 04-26 06:43

    STM32 DMA雙緩沖發(fā)送不定長數(shù)據(jù)怎么解決?

    STM32 DMA雙緩沖發(fā)送不定長數(shù)據(jù),假如我需要發(fā)送100010個(gè)數(shù)據(jù),開辟了2塊1000數(shù)據(jù)區(qū),數(shù)據(jù)
    發(fā)表于 04-11 06:58

    STM32F030F4串口空閑中斷接收不定長數(shù)據(jù),發(fā)生中斷后不知道如何計(jì)算接收到的字節(jié)數(shù)?

    我用STM32F030F4串口空閑中斷接收不定長數(shù)據(jù),發(fā)生中斷后不知道怎樣計(jì)算接收到的字節(jié)數(shù)。
    發(fā)表于 04-03 07:12

    stm32f103如何實(shí)現(xiàn)spi從機(jī)接收不定長數(shù)據(jù)?

    stm32f103 如何實(shí)現(xiàn)spi從機(jī)接收不定長數(shù)據(jù)數(shù)據(jù)首字節(jié)說明了數(shù)據(jù)長度) 求個(gè)思路或例程
    發(fā)表于 03-28 07:47

    stm32cube怎么安裝 STM32CubeMX安裝步驟教程

    STM32CubeMXSTM32芯片圖形化配置工具,通過簡單的操作便能實(shí)現(xiàn)相關(guān)配置,省去了我們配置各種外設(shè)的時(shí)間,支持MDK、IAR For ARM、TrueStudio等多種工具。
    發(fā)表于 11-14 12:37 ?1414次閱讀
    <b class='flag-5'>stm32</b>cube怎么安裝 <b class='flag-5'>STM32CubeMX</b>安裝步驟教程

    STM8CubeMXSTM32CubeMX功能一樣嗎?

    STM8CubeMXSTM32CubeMX功能一樣嗎?
    的頭像 發(fā)表于 10-31 16:59 ?1539次閱讀
    STM8<b class='flag-5'>CubeMX</b>和<b class='flag-5'>STM32CubeMX</b>功能一樣嗎?

    STM32串口中斷接收不定長報(bào)文介紹

    本項(xiàng)目中,需要使用STM32的USART6串口與FPGA板(下位機(jī))通信,需要發(fā)送和接收數(shù)據(jù),有報(bào)文應(yīng)答機(jī)制。
    的頭像 發(fā)表于 10-26 11:01 ?865次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b>中斷<b class='flag-5'>接收</b><b class='flag-5'>不定長</b>報(bào)文介紹

    串口怎么才能實(shí)現(xiàn)接收不定長數(shù)據(jù)?

    大家都是怎么處理不定長數(shù)據(jù)
    發(fā)表于 10-24 06:43

    STM32如何把接收不定長的字符串到指定結(jié)構(gòu)體內(nèi)?

    STM32如何把接收不定長的字符串到指定結(jié)構(gòu)體內(nèi)
    發(fā)表于 10-15 07:20

    基于STM32CubeMX開發(fā)U盤訪問應(yīng)用

    電子發(fā)燒友網(wǎng)站提供《基于STM32CubeMX開發(fā)U盤訪問應(yīng)用.pdf》資料免費(fèi)下載
    發(fā)表于 09-25 09:19 ?2次下載
    基于<b class='flag-5'>STM32CubeMX</b>開發(fā)U盤訪問應(yīng)用

    基于STM32U5 的 STM32CubeMX環(huán)境搭建

    基于STM32U5 的 STM32CubeMX環(huán)境搭建
    的頭像 發(fā)表于 09-21 17:35 ?1295次閱讀
    基于<b class='flag-5'>STM32</b>U5 的 <b class='flag-5'>STM32CubeMX</b>環(huán)境搭建