当前位置:首页 > 单片机 > STM32CubeMX > 正文内容

STM32CubeMX系列教程5:串口接收不定长数据

ouyang4个月前 (10-01)STM32CubeMX1375



一、摘要

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

二、配置工程

  复制《STM32CubeMX系列教程0:创建工程》创建的工程目录GPIO_test,修改文件目录名称为USART_IDLE,双击打开GPIO_test.ioc。
  如果需要安装必备的开发环境,可参考《STM32开发环境安装》

1. 配置串口及DMA

  使能串口1的异步串行通信模式,开启Usart1的全局中断。添加DMA通道。
enter description here

2. 生成源码

  打开生成的源码,删除whiel语句中的指令。

三、修改源码

1. 重定向printf

  打开usart.h文件,在文件开头的USER CODE BEGIN Includes下方引入stdio.h头文件
enter description here
  打开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


enter description here


2. 添加串口接收所需变量

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

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

3. 添加串口及IDLE处理函数

  打开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;//清除接收结束标志位
   memset(rx1_buffer,0,rx1_len);
   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();
 }
}


enter description here


4. 声明变量及函数

  打开usart.h文件,在文件开头的USER CODE BEGIN Includes下方添加如下语句

#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);//串口发送封装void Usart1_IDLE(void);


enter description here


5. 启用IDLE中断

  进入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();  //前往数据处理函数处理接收到的数据。
		}		


enter description here


6. 修改中断函数

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

四、编译下载

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

STM32单片机程序下载方法有多种,有需要请转《STM32程序下载》专题查阅,选择你所需要的下载方法。http://oynote.top/?tags=57

如果有疑问可以留言,或给我发送邮件联系,本人邮箱ouyang_rui@outlook.com

    扫描二维码至手机访问

    扫描二维码推送至手机访问。

    版权声明:本文由电子科技Blog发布,如需转载请注明出处。

    转载请注明出处:http://oynote.top/?id=357

    分享给朋友:
    返回列表

    上一篇:STM32CubeMX系列教程4:基本串行通信

    没有最新的文章了...

    相关文章

    STM32CubeMX系列教程4:基本串行通信

    STM32CubeMX系列教程4:基本串行通信

    一、摘要二、配置工程2-1. 启动串口中断2-2. 编写用户代码2-3. 编写中断回调函数2-4. 编译下载1-1. 启用串口通信1-2. 编写用户代码1-3. 编译下载1. 轮询方式发送2. 中断方...

    STM32CubeMX系列教程1:GPIO输入与输出

    STM32CubeMX系列教程1:GPIO输入与输出

    一、摘要二、创建工程1-1. 配置RCC与Debug1-2. 选择GPIO引脚与功能1-3. 配置GPIO1. 配置外设与IO2. 时钟配置3. 工程输出设置三、编写用户代码1. 插入用户代码2. 编...

    STM32CubeMX系列教程2:外部中断EXIT

    STM32CubeMX系列教程2:外部中断EXIT

    一、摘要二、配置工程3-1. 中断优先级分组3-2. 中断优先级1. 修改引脚模式2. 配置GPIO3. 开启外部中断4. 生成工程三、编写用户程序1. 编写中断回调函数四、编译下载程序1. 注意一、...

    STM32CubeMX系列教程0:创建工程

    STM32CubeMX系列教程0:创建工程

    STM32Cube 是一个全面的软件平台,包括了ST产品的每个系列。平台包括了STM32Cube 硬件抽象层(一个STM32抽象层嵌入式软件,确保在STM32系列最大化的便携性)和一套的中间件组件(R...

    STM32CubeMX系列教程3:基本定时器中断

    STM32CubeMX系列教程3:基本定时器中断

    一、摘要二、配置工程1-1. 使能定时器1-2. 配置定时器参数1-3. 开启定时器中断1. 配置定时器参数2. 生成工程三、编写用户程序1. 编写中断回调函数2. 启动定时器四、编译下载程序一、摘要...

    发表评论

    访客

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。