STM32G070RBT6基于STM32CubeMX创建串口中断接收数据

STM32G070RBT6基于STM32CubeMX创建串口中断接收数据


  • 相关篇《利用STM32CubeMX快速创建点灯带调试输出工程案例》
  • 《【硬件开源电路】STM32G070RBT6开发板》

✨这里只演示串口接收中断。不包含配置串口发送以及重映射printf函数。

  • STM32CubeMX配置演示和Keil代码补充全过程演示:

重写相关串口中断服务回调函数内容

在主程序main.c中添加全局接收字符变量以及串口中断接收数据处理部分内容。

  • ⛳实现串口中断接收字符长度小于10的数据才能完整接收并转发
uint8_t rx_buf;//定义中断接收变量

/*重写串口接收中断回调函数*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
		if(huart->Instance == USART1) {
				HAL_UART_Transmit(&huart1, &rx_buf, 1, 1000);//sizeof(rx_buf)
				HAL_UART_Receive_IT(&huart1, &rx_buf, 1);//sizeof(rx_buf)
		}//实现接收字符长度小于10的数据才能完整接收并转发

}
//在main函数体中添加初始化代码
/* 开启 USART 1 中断 */
	HAL_UART_Receive_IT(&huart1, &rx_buf, 1);//能够进入回调函数HAL_UART_RxCpltCallback的条件之一:&rx_buf==sizeof(rx_buf)
		HAL_UART_Transmit(&huart1, tx_buf, sizeof(tx_buf), 1000);
		HAL_Delay(1000);

⚡实现串口接收不定长数据

在主程序main.c中添加全局接收字符变量以及串口中断接收数据处理部分内容

#define MAX_RECV_LEN 1024         //设定可以接收的最大字节
uint8_t msg_buff[MAX_RECV_LEN] = {0}; //接收缓存区
uint8_t * msg = msg_buff;    //定义一个指针指向接收缓存区
int flag = 0;        //接收完成标志
int len_u4=0;  //数据长度记录

/*重写串口接收中断回调函数*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{	
	/*实现串口接收不定长数据*/
	uint8_t ret = HAL_OK;
    msg++;
        len_u4++;//数据长度计数
    if( msg == msg_buff + MAX_RECV_LEN)
    {
        msg = msg_buff;
    }
         do  
    {  
        ret = HAL_UART_Receive_IT(&huart1,(uint8_t *)msg,1);            
    }while(ret != HAL_OK);
        if(*(msg-1) == '\n')   //接收以\n为结尾字符,则表示接收完成
    {
        flag  = 1;
    }
}

//在main函数体中添加初始化代码
	/* 开启 USART 1 中断 */
	HAL_UART_Receive_IT(&huart1, &rx_buf, 1);//能够进入回调函数HAL_UART_RxCpltCallback的条件之一:&rx_buf==sizeof(rx_buf)
		HAL_UART_Transmit(&huart1, tx_buf, sizeof(tx_buf), 1000);
		HAL_Delay(1000);	

实现数据的不定长接收参考:https://blog.csdn.net/weixin_30616969/article/details/99339828

程序源码

链接:https://pan.baidu.com/s/1Cg1OnAM1BDUSjpQZgyracg
提取码:crgy

你可能感兴趣的:(stm32,stm32,STM32CubeMX,STM32G070RBT6,USART中断接收)