首页 > 其他分享 >STM32-使用串口空闲中断,实现串口不定长接收

STM32-使用串口空闲中断,实现串口不定长接收

时间:2024-09-26 17:34:05浏览次数:10  
标签:CR1 STM32 串口 rec 接收 usart2 空闲

示例代码是直接操作寄存器的
核心思路很简单:

  1. 接收到消息后,打开串口总线空闲中断
  2. 总线进入空闲中断后,关闭空闲中断

代码如下:

``

点击查看代码
#include "myusart2.h"
#include "string.h"
#include "tool.h"

char usart2_rec_buff[usart2_rec_len];
u8 usart2_rec_flag=0;              //数据达到指定长度置1,接收错误或主函数处理完成置0
u16 usart2_rec_count=0;             //接收数量,接收完成后置0,接收报错置零。

char usart2_rec_too_long[]="too long!";
   
void myusart2_init(u32 clk,u32 baudrate)   //串口3
{
    u32 temp=0;
    RCC->APB1ENR |=1<<18;     //使能串口时钟   APB1
    RCC->APB2ENR |=1<<3;      //使能IO口时钟   APB2 GPIOB  PB10 PB11
    
    sys_gpio_set(GPIOB, SYS_GPIO_PIN10,SYS_GPIO_MODE_AF, SYS_GPIO_OTYPE_PP, SYS_GPIO_SPEED_HIGH, SYS_GPIO_PUPD_PU);  ///USARTx_TX
    sys_gpio_set(GPIOB, SYS_GPIO_PIN11,SYS_GPIO_MODE_IN, SYS_GPIO_OTYPE_PP, SYS_GPIO_SPEED_HIGH, SYS_GPIO_PUPD_PU);  //USARTx_RX
    
    temp = (clk * 1000000 + baudrate / 2) / baudrate;  /* 得到BRR, 采用四舍五入计算 */
    
    MYUSART2->BRR = temp;       // 波特率设置 
    MYUSART2->CR1 = 0;          // 清零CR1寄存器 
    MYUSART2->CR1 |= 0 << 12;   // M = 0, 1个起始位, 8个数据位, n个停止位(由USART_CR2 STOP[1:0]指定, 默认是0, 表示1个停止位) 
    MYUSART2->CR1 |= 1 << 3;    //TE = 1, 串口发送使能    
    MYUSART2->CR1 |= 1 << 2;    // RE = 1, 串口接收使能           
    MYUSART2->CR1 |= 1 << 5;    // RXNEIE = 1, 接收缓冲区非空中断使能 
    
    sys_nvic_init(2, 2, MYUSART2_IRQn, 2); //组2,优先级 2,2   
    MYUSART2->CR1 |= 1<<13;   //使能串口x
    
    MYUSART2->SR  &=~(1<<7);//解决单片机复位时,第一个字节发送丢失问题
}

/*中断函数*/
void MYUSART2_IRQHandler(void)    
{
    u8 rec_data;
    if (MYUSART2->SR & (1 << 5))                    //确认接收非空。数据放入缓存。如果超长,接收长度置0,接收报错。
    {                  
        rec_data=MYUSART2->DR;  
       
        if(usart2_rec_flag==0){
            MYUSART2->CR1 |= 1<<4;                //使能总线空闲中断
            
            if(usart2_rec_count<usart2_rec_len-1){
                usart2_rec_buff[usart2_rec_count]=rec_data;
                usart2_rec_count++;
            }else{
                usart2_rec_count=0;
                usart2_send_data(usart2_rec_too_long);
             }
        }
            
    }
    else if(MYUSART2->SR & (1<<4))                //如果总线空闲
    {
        usart2_rec_buff[usart2_rec_count]='\0';               //rec_buff添加字符串结束标志。这里是为了让接收的数据变成一个字符串。
        usart2_rec_flag=1;
        usart2_rec_count=0;
        
//        usart2_send_data(usart2_rec_buff);        //返回接收的数据
 //       usart2_send_data("\r\n");
        MYUSART2->CR1 &= ~(1<<4);                  //关闭总线空闲中断
        MYUSART2->SR &=~(1<<4);
    }  
}


/*只发送字符串数据*/
void usart2_send_data(char *str)                
{   
    u8 len = strlen(str);
    for(u8 i=0;i<len;i++){
        MYUSART2->DR = str[i];  
        while ((MYUSART2->SR & 0X40) == 0);                           //等待发送结束 
    }      
}

标签:CR1,STM32,串口,rec,接收,usart2,空闲
From: https://www.cnblogs.com/ftest/p/18433845

相关文章

  • 基于STM32的智能家庭安全监控系统
    目录引言项目背景环境准备硬件准备软件安装与配置系统设计系统架构关键技术代码示例传感器数据采集摄像头监控与数据处理实时报警功能实现应用场景结论1.引言智能家庭安全监控系统使用嵌入式设备,如STM32微控制器,来实时监控家庭环境。通过集成摄像头、运动传感......
  • VScode开发STM32笔记(一)生成bin文件
    操作步骤软件条件1、基于stm32-for-vscode工具开发;2、项目处于打开状态,且生成elf文件;具体的安装环境详见文档:https://blog.csdn.net/weixin_42435984/article/details/141894449具体操作1、通过VScode打开对应的STM32项目;2、使用stm32-for-vscode工具对其进行编译;3......
  • STM32F103C8T6+ESP8266+MQTT+EMQX完成数据上传和点灯环节
    本文参考以下文章:【最简单】STM32+ESP8266+MQTT+EMQX完成数据上传和点灯环节_stm32如何连接emqx-CSDN博客STM32+ESP8266通过MQTT协议连接本地EMQX(保姆级教学!资料开放!)_stm32驱动esp8266本地emqx-CSDN博客 一、在windows环境下或Ubuntu搭建EMQX云平台 参看这篇文章:搭建自己的M......
  • python接口串口数据
    importtimeimportserialdeftest_receive():#配置串口参数port='/dev/ttyUSB0'#根据你的设备更改端口号baud_rate=9600#波特率bytesize=serial.EIGHTBITS#数据位parity=serial.PARITY_NONE#校验位stop_bits=serial.......
  • 基于STM32设计的智慧路灯(OneNet)(232)
    文章目录一、前言1.1项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成1.2设计思路1.3项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】项目背景【5】摘要1.4开发工具的选择【1】设备端开发【2】上位机......
  • 24 基于51单片机的公交车报站仿真(LCD12864、DS1302、串口)
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于51单片机,采用DS1302时钟模块读取时间,通过LCD12864显示实时时间,然后两个按键,一个按下表示到站,一个按下表示没到站。到达站点,蜂鸣器发出声音,屏幕显示到站,通过串口发送信息如果没到站,屏幕显示未......
  • C# 串口助手
    以实现下图效果为例:privatevoidForm1_Load(objectsender,EventArgse){BindPort();BindBaudRate();BindStopBits();BindDateBits();BindParity();SettingDDefault();}#region绑定参数//端口privatevoidBindPort()......
  • STM32入门之定时器输入捕获部分
            IC输入捕获,与输出比较一样也有有四个通道,分别与输出比较共用4个CCR寄存器,通过通道输入电平信号,我们可以检测到电平跳变,然后将CNT的值锁存到CCR寄存器中,实现测量频率,占空比,用于电机测速等。那我们首先来介绍一下测量频率的原理         频率测量的......
  • 基于 STM32 和 Modbus 协议的公路隧道照明环境数据采集系统设计
    一、项目概述在现代高速公路的隧道照明系统中,实时监控环境参数(如照度、温度和湿度)是确保安全与高效运营的重要环节。本项目旨在设计一个多通道数据采集器,能够实时采集隧道内的照明及环境数据,并通过工业标准的Modbus协议将数据传输到上位机进行监控和分析。技术栈关键词......
  • 基于STM32单片机的病人护理监测系统
    基于STM32单片机的病人护理监测系统0、毕业设计选题原则说明(重点)1、项目简介1.1系统功能1.2演示视频2、部分电路设计2.1STM32单片机核心板电路设计2.2DS18B20温度采集电路2.3MKB0805血压心率检测电路设计2.4、非接触式水位检测电路设计2.5、OLED显示电路设计3、单片机代码展......