日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

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

撞上電子 ? 2023-05-11 09:59 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

打開(kāi)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

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

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

打開(kāi)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對(duì)接收的一幀數(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);//重新打開(kāi)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

打開(kāi)usart.h文件,在文件開(kāi)頭的USER CODE BEGIN Includes下方添加如下語(yǔ)句:

#include "stdio.h"#include "string.h"#define BUFFER_SIZE 100
extern volatile uint8_t rx1_len; //接收一幀數(shù)據(jù)的長(zhǎng)度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下方開(kāi)啟串口1的DILE中斷,并打開(kāi)DMA接收。

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

在while語(yǔ)句中添加接收查詢(xún)語(yǔ)句。

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

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

打開(kāi)stm32f4xx_it.c文件,在文件開(kāi)頭引入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

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7349

    瀏覽量

    95058
  • STM32
    +關(guān)注

    關(guān)注

    2313

    文章

    11196

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    如何在 STM32Cube CMake 工程中添加源文件

    STM32CubeMX 能夠很方便的導(dǎo)出 CMake 工程。例如,如下圖所示在 STM32CubeMX的 ToolChain/IDE 中選擇 Cmake。CMake 工程可以很容易被
    發(fā)表于 04-15 16:07 ?0次下載

    LAT1574_如何在 STM32Cube CMake 工程中添加源文件

    STM32CubeMX 能夠很方便的導(dǎo)出 CMake 工程。例如,如下圖所示在 STM32CubeMX的 ToolChain/IDE 中選擇 CmakeCMake 工程可以很容易被
    發(fā)表于 03-11 10:46 ?0次下載

    請(qǐng)問(wèn)CW32L的UART是不是沒(méi)有空閑中斷?

    CW32L083的UART是不是沒(méi)有空閑中斷?大家一般怎么實(shí)現(xiàn)不定長(zhǎng)數(shù)據(jù)接收?是串口中斷+定時(shí)器嗎?
    發(fā)表于 12-15 07:28

    串口空閑中斷與串口超時(shí)中斷介紹

    。 特點(diǎn) 依賴(lài)總線(xiàn)物理狀態(tài),而非時(shí)間。 常用于檢測(cè)不定長(zhǎng)數(shù)據(jù)幀的結(jié)束,無(wú)需依賴(lài)特定結(jié)束符。 應(yīng)用場(chǎng)景 Modbus通信:不定長(zhǎng)數(shù)據(jù)包的接收
    發(fā)表于 11-21 08:31

    請(qǐng)問(wèn)RT-Thread與stm32cubemx聯(lián)合開(kāi)發(fā)的原理是什么?

    在使用RT-Thread與stm32cubemx聯(lián)合開(kāi)發(fā)的原理是什么,cubemx在其中主要起到了哪些功能呢?
    發(fā)表于 10-11 15:49

    求助,關(guān)于串口設(shè)備驅(qū)動(dòng)fifo問(wèn)題

    目前在做高頻數(shù)據(jù)采集分析,使用串口設(shè)備驅(qū)動(dòng)(使用rs485),開(kāi)啟DMA+空閑中斷,接收不定長(zhǎng)數(shù)據(jù),接收
    發(fā)表于 09-12 08:18

    意法半導(dǎo)體:STM32CubeMX將不再集成到STM32CubeIDE中

    從2025年11月發(fā)布的版本開(kāi)始,我們將僅以 獨(dú)立 版本的形式提供 STM32CubeIDE 和 STM32CubeMX 。 STM32CubeMX將不再集成到STM32CubeIDE
    的頭像 發(fā)表于 09-01 17:18 ?3959次閱讀

    【RA4M2-SENSOR】—— 12.串口接收不定長(zhǎng)度數(shù)據(jù)

    ;, U1_RxBuff);//打印收到的數(shù)據(jù) user_uart_clear();//清空接收緩沖區(qū) } HAL_Delay(10); } 編譯代碼,燒錄到板子 打開(kāi)串口助手 發(fā)送
    發(fā)表于 09-01 11:22

    使用STM32CubeMX的時(shí)候創(chuàng)建的工程已經(jīng)使用的板載資源如何去掉?

    在使用STM32CubeMX的時(shí)候創(chuàng)建的工程已經(jīng)使用的板載資源如何去掉?在基于開(kāi)發(fā)板進(jìn)行工程創(chuàng)建的時(shí)候會(huì)把板載資源直接初始化,后面想要用不同的功能配置,如何把初始配置去掉?
    發(fā)表于 07-22 07:13

    對(duì)于在STM32CubeMx使用FMC中的NAND FLASH里面配置這些時(shí)間有什么說(shuō)明嗎?

    對(duì)于在STM32CubeMx使用FMC中的NAND FLASH里面配置這些時(shí)間有什么說(shuō)明嗎?
    發(fā)表于 07-21 07:07

    STM32L433VCT6進(jìn)入STOP模式2之后,功耗依然和正常運(yùn)行模式?jīng)]有差別,為什么?

    背景:STM32L433VCT6 運(yùn)行時(shí)鐘在2Mhz,所有的外設(shè)和IO口幾乎全部使用,如圖所示 外設(shè)使用: 1、三個(gè)串口,其中一個(gè)串口為IRDA模式;發(fā)送和接收都使用了DMA;利用空
    發(fā)表于 07-21 06:42

    stm32cubemx上的g031j6的管腳和數(shù)據(jù)手冊(cè)不一致,請(qǐng)問(wèn)哪個(gè)是正確的呢?

    stm32cubemx上的g031j6的管腳和數(shù)據(jù)手冊(cè)不一致,請(qǐng)問(wèn)哪個(gè)是正確的呢?
    發(fā)表于 07-10 06:39

    STM32CubeMX配置STM32G070RBT6TR時(shí)為什么無(wú)法使能PVD中斷?

    STM32CubeMX 配置STM32G070RBT6TR時(shí)無(wú)法使能PVD中斷
    發(fā)表于 06-18 07:59

    STM32CubeMX配置STM32G070RBT6TR時(shí)無(wú)法使能PVD中斷怎么辦?

    STM32CubeMX 配置STM32G070RBT6TR時(shí)無(wú)法使能PVD中斷
    發(fā)表于 06-16 06:32
    浮山县| 平阴县| 西充县| 漾濞| 郴州市| 通河县| 桐庐县| 邵阳市| 蒙城县| 贵定县| 兰考县| 左权县| 麻城市| 天峻县| 普陀区| 连州市| 那曲县| 长子县| 炉霍县| 山东| 清丰县| 昭平县| 洛浦县| 长白| 平山县| 芜湖县| 三明市| 农安县| 汉川市| 叙永县| 新蔡县| 霍城县| 元阳县| 石门县| 吴江市| 凌海市| 长白| 潍坊市| 榆林市| 介休市| 遂平县|