STM32CubeMX之串口接收不定长数据

发布时间:2023-07-20  

基本串口通信通常只能接收到定长数据,无法稳定接收不定长数据,本章介绍利用STM32单片机的IDLE空闲中断,接收不定长数据。


使能串口1的异步串行通信模式,开启Usart1的全局中断。添加DMA通道。b858f22c-ef9b-11ed-ba01-dac502259ad0.png

使用Stm32Cubemx生成源码, 打开生成的源码,删除whiel循环中的语句。

打开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()以避免使用半主机模式 void _sys_exit(int x) { x = x; } //重定义fputc函数int fputc(int ch, FILE *f){ while((USART1->SR&0X40)==0);//循环发送,直到发送完毕 USART1->DR=(uint8_t)ch; return ch;}#endif

打开uart.c文件,在文件顶部的USER CODE BEGIN 0下方添加下列变量。


volatile uint8_t rx1_len = 0; //接收一帧数据的长度volatile uint8_t rec1_end_flag = 0; //一帧数据接收完成标志uint8_trx1_buffer[BUFFER_SIZE]={0}; //接收数据缓存数组

打开uart.c文件,在文件末尾的USER CODE BEGIN 1下方添加下列函数。


void Usart1_IDLE(void) //USART1的IDLE接收{ uint32_t tmp_flag = 0; uint32_t temp; tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志位 if((tmp_flag != RESET))//idle标志被置位 { __HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位 HAL_UART_DMAStop(&huart1); // 停止DMA传输,防止 temp = __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);// 获取DMA中未传输的数据个数 rx1_len = BUFFER_SIZE - temp; //总计数减去未传输的数据个数,得到已经接收的数据个数 rec1_end_flag = 1; // 接受完成标志位置1 }}
void Usart1_Handle() //USART1对接收的一帧数据进行处理{ DMA_Usart1_Send(rx1_buffer, rx1_len); //将接收到的数据回发给发送端 rx1_len = 0;//清除计数 rec1_end_flag = 0;//清除接收结束标志位 HAL_UART_Receive_DMA(&huart1,rx1_buffer,BUFFER_SIZE);//重新打开DMA接收}
void DMA_Usart1_Send(uint8_t *buf,uint8_t len) //串口发送封装{ if(HAL_UART_Transmit_DMA(&huart1,buf,len)!= HAL_OK) //判断是否发送正常,如果出现异常则进入异常中断函数 { 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; //接收一帧数据的长度extern volatile uint8_t rec1_end_flag; //一帧数据接收完成标志extern uint8_t rx1_buffer[BUFFER_SIZE]; //接收数据缓存数组
void Usart1_Handle(void);void DMA_Usart1_Send(uint8_t *buf,uint8_t len);//串口发送封装voidUsart1_IDLE(void);

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

进入main.c文件,找到入口函数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帧数据{ Usart1_Handle(); //前往数据处理函数处理接收到的数据。}

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

打开stm32f4xx_it.c文件,在文件开头引入usart.h头文件。

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

向下翻stm32f4xx_it.c文件,找到void USART1_IRQHandler(void)函数,此函数为串口1的中断入口函数。在此函数中添加之前在usart.c文件中创建的IDLE接收函数。

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

源码修改完毕后,编译下载,打开串口助手,随意发送100个字节以内的任意长度内容进入单片机,都可得到同样的回复。

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


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    上位机串口中发过来的数据了。可以按照以下步骤进行:2.1 编写串口接收数据的代码```uint8_t uart_rx_data; // 定义接收数据的变量void......
    是你不会删除配置文件) 操作说明 注意由于QT自带文本显示窗口加载大量数据后会造成软件卡顿,现解决方案为设定一个显示缓冲区,在有刷新数据阶段(即串口接收数据阶段),如果需要保持刷新状态(即实时显示接收得数据......
    (),它会触发自定义的槽函数send_data(),实现通过串口传递给DSP控制指令。定义DSP接收的电机控制的数据格式,如表2所示,需要大小为13位的char型数组存储电机控制信息。槽函......
    ,可在stm32的USART2的TX引脚(PA2)收接收到数据。 4.4 设置USB虚拟串口波特率 在前面的发送和接收中,均不能进行波特率设置,usb发送到串口的数据波特率为默认值115200......
    上述的不足之处,将结合一个常用自定义通讯协议,提供一个完整的解决方案。 2、串口FIFO 串口FIFO可以理解为串口专用的缓存,该缓存采用先进先出方式。数据接收FIFO和数据发送FIFO通常是独立的两个硬件。 串口接收的数据......
    合一个常用自定义通讯协议,提供一个完整的解决方案。 2、串口FIFO 串口FIFO可以理解为串口专用的缓存,该缓存采用先进先出方式。数据接收FIFO和数据发送FIFO通常是独立的两个硬件。串口接收的数据......
    stm32怎么读取串口发来的指令;读取串口发来的指令是嵌入式系统中一项常见的任务,特别是在与外部设备进行通信时。在STM32系列微控制器中,提供了多个串口接口(USART、UART等),可以用于读取和处理串口接收到的数据......
    ,它主要包括供电电源、核心控制器LPC2214和双串口接口以及启动和ISP控制接口等电路。该系统设计采用优化的系统软件算法,能够节省大量硬件资源需求。由于数据量非常大且要求快速打印,通常......
    常可以通过设置相应的标志位或使用特定的寄存器位来完成。 2. 等待接收中断触发:当串口接收到一个字符时,接收缓冲区将接收到的数据存储在寄存器中,并检查相应的中断标志位。如果接收缓冲器非空,将会触发接收中断。 3. 中断处理函数的执行:一旦接收......
    ;内存,如uart、spi、i2c等总线接收数据过程;(3)内存—>外设,如uart、spi、i2c等总线发送数据过程。 串口有必要使用DMA吗? 串口(UART)是一种低速的串行异步通信,适用......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>