STM32串口中断接收和中断发送

发布者:温柔心绪最新更新时间:2018-06-08 来源: eefocus关键字:STM32  串口中断  接收  中断发送 手机看文章 扫描二维码
随时随地手机看文章

先贴出中断函数:


void USART1_IRQHandler(void){  

        if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {  

                 USART_ClearITPendingBit(USART1, USART_IT_RXNE);  

                 USART1_Buffer[i++]=USART_ReceiveData(USART1);  //USART1_Buffesh是一个自己定义的接收数组  

                 if(i>3){  

                      SendFlag = 1;  

                 }  

         }  

        if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET){    //USART_IT_TC这里也可替换  

                if(Open_Send_Flag){     //这是一个发送的标志  

                      uart1_sendstring(temp_data);  

                     USART_ITConfig(USART1, USART_IT_TXE, DISABLE);   //USART_IT_TC  

                     Open_Send_Flag = 0;  

                 }  

                else{  

                     USART_ITConfig(USART1, USART_IT_TXE, DISABLE);   //USART_IT_TC  

                 }  

         }  

}  


发送字符串的函数:


void uart1_sendstring(uint8_t* cp)  

{  

    while((*cp)!='\0')  

    {  

        Usart1_Send_isr(*cp);  

        cp++;  

    }  

}  

发送单个字符的函数:


void Usart1_Send_isr(uint8_t ch){  

     USART_SendData(USART1, (uint8_t)ch);  

     while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET ); //这里做缓冲区是否发送完判断  

}  


然后在中断函数外面发送数据的时候,打开发送中断。USART_ITConfig(USART1, USART_IT_TXE, ENABLE);    //USART_IT_TC

之后再贴出两个简单的串口接收和发送的测试小例子:



第一种:中断接收并把接收到的数据直接发送。


void USART1_IRQHandler(void){  

      unsigned char RxData;  

      if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {  

            USART_ClearITPendingBit(USART1, USART_IT_RXNE);  

            RxData=USART_ReceiveData(USART1);   

            RxData = RxData + 1;  

           USART_SendData(USART1,RxData);  

      }  

}  


优点:简单,适合很少量数据传输。 

缺点:无缓存区,并且对数据的正确性没有判断,数据量稍大可能导致数据丢失 。


第二种:中断接收之后判断数据头和数据尾,如果正确就直接发送出去。


void USART1_IRQHandler(void){  

  

  

 if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {  

       USART_ClearITPendingBit(USART1, USART_IT_RXNE);  

       USART1_Buffer[i++]=USART_ReceiveData(USART1);   

   }  

 if((USART1_Buffer[0] == 0x01) && (USART1_Buffer[i-1] == 0x02)){  

      Flag = 1;  

 }  

 if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET){  //溢出,不明白?  

  USART_ClearFlag(USART1,USART_FLAG_ORE);  

  USART_ReceiveData(USART1);   

 }  

 if(Flag){  

  for(j = 0;j<20;j++){  

        USART_SendData(USART1,USART1_Buffer[j]);  

  }  

 }  

}  


关键字:STM32  串口中断  接收  中断发送 引用地址:STM32串口中断接收和中断发送

上一篇:STM32 不断进入串口中断问题 解决方法
下一篇:STM32 UART常用的3种中断接收

推荐阅读最新更新时间:2024-03-16 16:05

STM32 UART5 中断接收程序
/* 此函数是根据网上程序改写,串口5采用中断接收 收够20个字符 就向PC 返回20个数字 详见main函数和中断函数 */ #include stm32f10x_lib.h unsigned char TxBuffer5 ; unsigned int i; unsigned int flag; /*************************************************** * 函数名称 :void RCC_Configuration() * 功能描述 : 复位和时钟控制 配置 * 参数 : 无 * 返回值 : 无 * 全局变量 : 无 * 全局静态变量: 无 * 局
[单片机]
关于STM32定时器16位拓展32位的探讨
STM32的通用定时器可以实现很多功能,例如:定时计数、测量外部信号脉冲宽度、产生PWM波形、测量输入的PWM波形等。在所有这些操作中,定时器的位数主要影响两个参数,一个是定时或测量的精度,另一个是定时的时间长度。下面我们以一个列表看一下定时的精度和定时的长度有多少: 关于各个预分频器的作用请参考下图的右半部分: 从表中可以看出,在最高精度下(14ns)定时长度只有0.91ms,在精度为250ns(即4MHz)时定时长度可达16.38ms。这是仅使用了定时器的独立工作模式的情况。 对于需要高精度并且长延时的应用,16位的定时(上述精度和时间长度)就不够了,这个问题可以有两种解决办法;第一
[单片机]
关于<font color='red'>STM32</font>定时器16位拓展32位的探讨
基于STM32的无人售货机系统设计
一、项目背景 随着科技的发展和生活水平的提高,人们对于购物体验的要求越来越高。传统的商场、超市购物方式已经无法满足消费者的需求,因此无人售货机应运而生。本文针对现有售货机存在的缺陷,设计了一款基于STM32的无人售货机系统。该系统采用STM32作为主控芯片,使用液晶屏显示各种商品库存与售价,用户按下对应按键选择购买指定商品,在矩阵键盘输入账号密码付款。若付款成功,对应电机旋转一定角度使商品出库,同时修改库存;若余额不足,则进行声光提示。手机端还可查看消费流水、商品库存情况,并进行补货和充值操作。 二、系统设计 2.1 系统硬件设计 该系统的核心部件是STM32主控芯片,它负责整个售货机的控制和管理。液晶屏用于显示商品信息、价格
[单片机]
基于<font color='red'>STM32</font>的无人售货机系统设计
STM32 外部GPIO中断配置
源起:项目中需要使用统一的时间触发信号使得采样时间同步,因此需要某一个管脚来进行触发。 硬件情况:采用PA11管脚 需要明确的是,PxN管脚共用外部中断线EXTIN和外部中断向量EXTIN_IRQn和中断服务程序入口EXTIN_IRQHandler,但是需要注意的是 共用EXTI9_5_IRQn和EXTI9_5_IRQHandler、 共用EXTI15_10_IRQn和EXTI15_10_IRQHandler 基本过程: 1、设置时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);  注意需要打开AFIO时钟
[单片机]
STM32开发笔记83: SX1268驱动程序设计(芯片复位)
单片机型号:STM32L053R8T6 本系列开发日志,将详述SX1268驱动程序的整个设计过程,本篇介绍芯片复位驱动程序。 一、数据手册 1、NRESET是芯片第15引脚,低有效。 2、通过15引脚NREST,可以达到完整的芯片复位。复位后,会执行标准的校准程序,先前的内容将丢失。复位最短时间为50us,给100us较为合适。 3、这张图是芯片各个模式的引脚的状态表,可以看到除复位模式外,其余模式NREST引脚的状态都为IN PU,其意思是输入上拉,其上拉值为50K。 二、程序 1、由于其内部上来,我们可以给出低功耗的程序,不将单片机控制NREST的引脚设置为输出,而设置为analog引脚,程序如下: c
[单片机]
<font color='red'>STM32</font>开发笔记83: SX1268驱动程序设计(芯片复位)
STM32 USB NAND Flash模拟U盘无法格式化问题的解决
前几天,一直在寻找NAND Flash模拟U盘程序无法格式化的问题。在中秋月圆之夜,还苦逼地在实验室调代码,也许是杭州大圆月的原因,今晚感觉整人特别亢奋,效率也特别高,灵感也多。终于,在不懈的努力下,找到代码中的害群之马,把无法格式的问题解决掉了。下面就来说说。 这几天一直在想问题出在哪里,不知道自己的代码跟官方的例程对照了多少次,把不一样的地方全都改了一遍,最终未果。今晚思路特别清晰,于是在想到格式化实际上就是向存储器写数据而已,而设计到写数据部分的代码就只在mass_mal.c、memory.c以及存储器的驱动文件。于是反复检查这几个文件,终于发现一点端倪了,问题出在memroy.c这个文件里。 memory.c这个文
[单片机]
联发科芯片接收特定短信“=”便重启问题得到解决
    6月24日网上流传一件好玩的事情,只要联发科平台的智能手机,收到仅有“=”字符的短信,便会造成手机关闭并重启,引起广大网友的关注,集微网小编正好使用的是MT6589T平台的手机,尝试着给自己发了条短信“=”,没想到果真手机关闭并重启,果然神奇! 原来这是法国一名网友Korben发现的联发科平台智能手机的问题,文章内容表示虽然目前未显示该缺陷能否危及到数据安全,但仍然可以导致手机不断重启,通话时接收到该短信息会造成通话中断。影响法国的手机机型如下: 微博上有不少网友戏称可以发送短信“=”给熟悉的人,是否造成通话影响小编不得而知,但重启现象倒不是全部。经过集微网微博的回复内容可见,包括红米Note、大
[手机便携]
基于STM32模拟UART串口通信
UART工作原理 UART即通用异步收发器,是一种串行通信方式。数据在传输过程中是通过一位一位地进行传输来实现通信的,串行通信方式具有传输线少,成本底等优点,缺点是速度慢。串行通信分为两种类型:同步通信方式和异步通信方式。 但一般多用异步通信方式,主要因为接受和发送的时钟是可以独立的这样有利于增加发送与接收的灵活性。异步通信是一个字符接着一个字符传输,一个字符的信息由起始位、数据位、奇偶校验位和停止位组成。 每一个字符的传输靠起始位来同步,字符的前面一位是起始位,用下降沿通知收方开始传输,紧接着起始位之后的是数据位,传输时低位在前高位在后,字符本身由5~8位数据位组成。 数据位后面是奇偶校验位,
[单片机]
基于<font color='red'>STM32</font>模拟UART<font color='red'>串口</font>通信
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved