STM32 HAL库使用中断实现串口接收不定长数据

发布者:真诚友谊最新更新时间:2025-02-18 来源: cnblogs关键字:STM32  HAL库  中断  串口接收  不定长数据 手机看文章 扫描二维码
随时随地手机看文章

以前用DMA实现接收不定长数据,DMA的方法接收串口助手的数据,全部没问题,不过如果接收模块返回的数据,而这些数据如果包含回车换行的话就会停止接收,例如接收:ATrnOKrn,就只能接收到ATr,导致没有接收完成,具体原因还没搞懂,有了解的,希望可以告知一下,DMA不定长接收方法传输门:https://www.cnblogs.com/xingboy/p/9714907.html。


好了,不多说了,现在进入正文。首先建立一个STM32Cumebx的工程,打开串口中断,完成配置,具体的配置流程就不细说了,没什么难度就只是打开串口跟中断而已。


生成工程代码后,先定义好一些变量:


//串口4中断接收定义

#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*UartHandle)

{

     uint8_t ret = HAL_OK;

    msg++;

        len_u4++;//数据长度计数

    if( msg == msg_buff + MAX_RECV_LEN)

    {

        msg = msg_buff;

    }

         do  

    {  

        ret = HAL_UART_Receive_IT(UartHandle,(uint8_t *)msg,1);            

    }while(ret != HAL_OK);

        if(*(msg-1) == 'n')   //接收以n为结尾字符,则表示接收完成

    {

        flag  = 1;

    }

}


最后在main函数里面编写接收后的逻辑,注意要在while(1){ }前打开串口接收中断


int main(void)

{

  /* USER CODE BEGIN 1 */


  /* USER CODE END 1 */


  /* MCU Configuration----------------------------------------------------------*/


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();


  /* USER CODE BEGIN Init */


  /* USER CODE END Init */


  /* Configure the system clock */

  SystemClock_Config();


  /* USER CODE BEGIN SysInit */


  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */

  MX_GPIO_Init();


 MX_DMA_Init();

  MX_USART3_UART_Init();


  MX_UART4_Init();

  /* USER CODE BEGIN 2 */


  /* USER CODE END 2 */


  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

    //自己添加代码部分:while前打开串口中断接收

    HAL_UART_Receive_IT(&huart4, (uint8_t *)msg, 1); //开启第一次中断

  while (1)

  {

  /* USER CODE END WHILE *//* USER CODE BEGIN 3 */

//======自己添加代码部分=========        

            if (flag == 1)

    {

            printf('msg_buff = %s ;len = %drn',msg_buff,len_u4);

       HAL_Delay(100); //加延时,保证接收到数据过长的时候,等待数据存入缓存区发送

            HAL_UART_Transmit(&huart3,msg_buff, len_u4,100);     //将串口4接收到的数据通过串口3传出    

            memset(msg_buff, 0, sizeof(msg_buff));   //清空缓存区

           // 指向接收缓存的头部

            msg = msg_buff;

            (&huart4)->pRxBuffPtr = msg;

            flag = 0;

                        len_u4=0;//每次数据长度清0

    }

        HAL_Delay(10);

  }

//==============================

  /* USER CODE END 3 */


}


运行结果如下,效果正确

谈谈串口RS232跟RS485:这两个串口除了逻辑电平不同外,还有传输距离也不同,如果对速度要求不高,传输距离要比较远的就用RS485比较好,虽然RS485是个半双工,但是抑制共模干扰能力比较强,不过这些只是对于硬件层面的,对于软件层面来说他们的本质都是串口,在STM32Cubemx中,都是只是配置为串口,按照串口的编程来处理即可。

关键字:STM32  HAL库  中断  串口接收  不定长数据 引用地址:STM32 HAL库使用中断实现串口接收不定长数据

上一篇:STM32 ADC多通道转换DMA模式与非DMA模式两种方法(HAL库)
下一篇:STM32使用HAL库实现ADC单通道转换

推荐阅读最新更新时间:2026-03-25 11:22

STM32 HAL库使用中断实现串口接收定长数据
以前用DMA实现接收不定长数据,DMA的方法接收串口助手的数据,全部没问题,不过如果接收模块返回的数据,而这些数据如果包含回车换行的话就会停止接收,例如接收:ATrnOKrn,就只能接收到ATr,导致没有接收完成,具体原因还没搞懂,有了解的,希望可以告知一下,DMA不定长接收方法传输门:https://www.cnblogs.com/xingboy/p/9714907.html。 好了,不多说了,现在进入正文。首先建立一个STM32Cumebx的工程,打开串口中断,完成配置,具体的配置流程就不细说了,没什么难度就只是打开串口跟中断而已。 生成工程代码后,先定义好一些变量: //串口4中断接收定义 #define MAX
[单片机]
<font color='red'>STM32</font> <font color='red'>HAL库</font>使用<font color='red'>中断</font>实现<font color='red'>串口</font><font color='red'>接收</font>不<font color='red'>定长</font><font color='red'>数据</font>
STM32 使用HAL库串口的DMA发送和中断接收
HAL库使用太死板 HAL串口中断接收 HAL库使用起来太不灵活,限制太多,后面如有时间,将使用寄存器和HAL库混合操作的方式。 如使用串口中断接收,在接收到数据后,库里做了关闭接收非空中断RXNEIE,如下 HAL库DMA发送 目前,我用的是DMA发送,本来向直接将数据扔给DMA,不想开发送DMA的中断,但是,HAL库考虑的比较周详,使用HAL库的DMA发送API,就会使用了DMA句柄中的相关标志位,这些标志位得你开了中断后,在DMA发送完成后,才会做相应的清除,并且,使用了__HAL_LOCK(),这样你用了他的库发送,剩下的其他处理你也得用他的库;前面说的,用了库的DMA发送,不开中断,就会因为上次是__HAL_LOCK
[单片机]
STM32hal库串口中断接收任意字符
cubeMCX设置: 生成工程文件 usart.c /** ****************************************************************************** * @file usart.c * @brief This file provides code for the configuration * of the USART instances. ****************************************************************************** * @attenti
[单片机]
STM32<font color='red'>hal库</font><font color='red'>串口</font><font color='red'>中断</font><font color='red'>接收</font>任意字符
STM32 一直进入串口接收中断
解决方法一: 串口初始化配置时,需要打开ORE 溢出中断,否则串口中断没有及时读取数据会触发溢出中断(打开接收中断默认开启溢出中断,但是为了读取溢出标志位还需要明确执行以下打开溢出中断),如果没有清溢出中断就会一直进串口中断。 USART_ITConfig(USART2, USART_IT_ORE, ENABLE);//USART_IT_ORE参数在这个函数中是不合法,参数检测过不去,关闭参数检测这样写确实有效 串口接收中断函数要增加如下代码: if (USART_GetITStatus(USART2, USART_IT_ORE) == SET) {   USART_ClearITPendingBit(USART2,USART
[单片机]
STM32 串口接收流程-串口接收中断
串口接收 串口接收流程 编程USARTx_CR1的M位来定义字长。 编程USARTx_CR2的STOP位来定义停止位位数。 编程USARTx_BRR寄存器确定波特率。 使能USARTx_CR1的UE位使能USARTx。 如果进行多缓冲通信,配置USARTx_CR3的DMA使能(DMAT)。 使能USARTx_CR1的RE位为1使能接收器。 如果要使能接收中断(接收到数据后产生中断),使能USARTx_CR1的RXNEIE位为1。 当串口接收到数据时 USARTx_SR(ISR)的RXNE位置1。表明移位寄存器内容已经传输到RDR(DR)寄存器。已经接收到数据并且等待读取。 如果开启了接收数据中断(USART
[单片机]
STM32串口中断及DMA接收常见的几个问题
今天再给大家分享一些关于STM32串口中断及DMA接收常见的几个问题。 UART串口中断接收 使能UART串口中断之后,有接收到UART数据,进入中断,此时要清除RXNE接收标志位: 1)通过软件向该RXNE标志位写入零来清零; 2)通过对 USART_DR 寄存器执行读入操作将该位清零。 这里可以查看对应《参考手册》,一般我们选择第2种,通过读取UART串口数据来清零。 1、中断接收数据丢失 在UART串口中断函数中,或者更高优先级中断函数中长时间执行,导致接收丢失,所以,请勿在中断函数中长时间执行。 特别有些人,还在中断函数添加延时函数。实际应用中,只要不是特殊情况,比如测试某个功能可以添加延时函数,都不建议在中断函数添加延时
[单片机]
<font color='red'>STM32</font><font color='red'>串口</font><font color='red'>中断</font>及DMA<font color='red'>接收</font>常见的几个问题
STM32单片机串口空闲中断+DMA接收定长数据
在上一篇文章STM32单片机串口空闲中断接收不定长数据中介绍了利用串口空闲中断接收不定长数据,这种方式有一个问题就是串口每接收到一个字节就会进入一次中断,如果发送的数据比较频繁,那么串口中断就会不停打断主程序运行,影响系统运行。那么能不能在串口接收数据过程中不要每接收一个数据中断一次,只有在一帧数据接收结束完成后只中断一次? 用串口的空闲中断加上DMA功能,就可以实现每帧数据接收完成后只中断一次,而在数据接收过程中,由DMA存储串口接收到的每个字节。 关于串口的空闲检测和DMA在STM32参考手册中有详细介绍。 下面看如何初始化串口空闲中断和 DMA。 void uart2_init( u16 baud )
[单片机]
<font color='red'>STM32</font>单片机<font color='red'>串口</font>空闲<font color='red'>中断</font>+DMA<font color='red'>接收</font>不<font color='red'>定长</font><font color='red'>数据</font>
STM32 | 串口空闲中断接收定长数据(DMA方式)
在使用STM32的串口接收数据的时候,我们常常会使用接收中断的方式来接收数据,常用的是RXNE。这里分享另一种接收数据的方式——IDLE中断(PS:本文的例子运行在STM32F103ZET6上)。 一、IDLE中断什么时候发生? IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。 二、RXNE中断和IDLE中断的区别? 当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就会产生IDLE中断。比如给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。 三、IDLE中断如何配
[单片机]
<font color='red'>STM32</font> | <font color='red'>串口</font>空闲<font color='red'>中断</font><font color='red'>接收</font>不<font color='red'>定长</font><font color='red'>数据</font>(DMA方式)
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved