[应用相关] stm32串口空闲中断实现

[复制链接]
 楼主| xiaoqizi 发表于 2025-7-11 18:41 | 显示全部楼层 |阅读模式
在STM32里,串口通信是USART,STM32可以通过串口和其他设备进行传输并行数据,是全双工,异步时钟控制,设备之间是点对点的传输。对应的STM32引脚分别是RX和TX端。STM32的串口资源有USART1、USART2、USART3。
我们在使用串口接收时想要对接收数据进行处理时总是会碰到不知道接收数据的个数而不得不采用简单的命令控制,但是stm32为我们提供了一种串口接收模式----->串口空闲接收中断模式:
1.概念
空闲接收中断(Idle Line Detection Interrupt)是 STM32 串口模块的一种中断机制,当串口接收端检测到一段时间内无数据传输(即进入 “空闲状态”)时,会触发该中断。
2. 核心作用
自动识别数据帧边界:无需手动设置超时机制,可自动区分多帧数据(如区分连续发送的多个数据包)。
简化接收逻辑:尤其适用于不定长数据接收场景(如 Modbus 协议、自定义通信协议),避免因固定字节数接收导致的帧解析错误。
当满足以下条件时,串口会产生空闲中断:
接收端在检测到一帧数据(如一个字节)的停止位后,持续一段时间(与波特率相关)未接收到新数据。
具体时间阈值为:1 个数据帧长度 + 1 位时间(例如,9600bps、8 位数据位、1 位停止位时,空闲超时约为 1.04ms)
代码编写也很简单,直接cubemx生成基本模板

18561686f506719df7.png

83540686f50619645e.png

2363686f4f3f7a222.png

中断优先级根据项目要求

然后开启中断优先级
HAL_UARTEx_ReceiveToIdle_IT(&huart1,receive_buff,receive_size_max);


中断回调函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
    receive_size=Size;
    receive_flag=1;                                        //空闲中断触发标志位
    sprintf((char*)display,"receive_size=%d",receive_size);//格式化函数
    LCD_DisplayStringLine(Line0,display);                  //LCD显示函数
    HAL_UARTEx_ReceiveToIdle_IT(&huart1,receive_buff,receive_size_max);//重新开启中断使能
}


在主函数中进行处理
if(receive_flag==1)            //处理标志位
{

    if(receive_size==6&&receive_buff[0]=='t'&&receive_buff[1]=='u'&&
    receive_buff[2]=='r'&&receive_buff[3]=='n'&&
    receive_buff[4]=='o'&&receive_buff[5]=='n')
    {
           //如果收到6个字符并且为turnon就进行处理

                led_turnon();      //开灯
                HAL_UART_Transmit(&huart1,(char*)"turnon",receive_size,100);//发送接收到的
                receive_flag=0;    //重置标志位
                receive_size=0;    //重置计数值
                memset(receive_buff, 0, sizeof(receive_buff));//清空缓冲区
    }
    else if(receive_size==7&&receive_buff[0]=='t'&&receive_buff[1]=='u'&&
    receive_buff[2]=='r'&&receive_buff[3]=='n'&&
    receive_buff[4]=='o'&&receive_buff[5]=='f'&&
    receive_buff[6]=='f')
    {
            //如果收到7个字符并且为turnoff就进行处理

                led_turnoff();     //关灯
               HAL_UART_Transmit(&huart1,(char*)"turnoff",receive_size,100);//发送接收到的
                receive_flag=0;    //重置标志位
                receive_size=0;    //重置计数值
                memset(receive_buff, 0, sizeof(receive_buff));  //清空缓冲区
    }
    else
    {
                HAL_UART_Transmit(&huart1,(char*)"error",5,100);//收到非法字符发送error
                receive_flag=0;                                 //重置标志位
                receive_size=0;                                 //重置计数值
                memset(receive_buff, 0, sizeof(receive_buff));  //清空缓冲区
    }
}



这样处理的好处是可以自由拓展处理接收到的字符
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/2301_80143498/article/details/149118613

小小蚂蚁举千斤 发表于 2025-7-28 23:11 | 显示全部楼层
stm32串口空闲中断
您需要登录后才可以回帖 登录 | 注册

本版积分规则

126

主题

4320

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部

126

主题

4320

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部