本例程通过PC机的串口调试助手将数据发送至STM32,接收数据后将所接收的数据又发送至PC机。

实例一:

void USART1_IRQHandler(u8 GetData)
{u8 BackData;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //中断产生{  USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志.GetData = UART1_GetByte(BackData);   //也行GetData=USART1->DR;   USART1_SendByte(GetData);      //发送数据GPIO_SetBits(GPIOE, GPIO_Pin_8 ); //LED闪烁,接收成功发送完成delay(1000);GPIO_ResetBits(GPIOE, GPIO_Pin_8 );}
}  

这是最基本的,将数据接收完成后又发送出去,接收和发送在中断函数里执行,main函数里无其他要处理的。
优点:简单,适合很少量数据传输。
缺点:无缓存区,并且对数据的正确性没有判断,数据量稍大可能导致数据丢失 。

实例二:

void USART2_IRQHandler()
{if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中断产生{  USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志Uart2_Buffer[Uart2_Rx_Num] = USART_ReceiveData(USART2);Uart2_Rx_Num++;}//判断最后接收的数据是否为设定值,确定数据正确性if((Uart2_Buffer[0] == 0x5A)&&(Uart2_Buffer[Uart2_Rx_Num-1] == 0xA5))
Uart2_Sta=1;
if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出{USART_ClearFlag(USART2,USART_FLAG_ORE);  //读SRUSART_ReceiveData(USART2); //读DR  }
}if( Uart2_Sta )
{for(Uart2_Tx_Num=0;Uart2_Tx_Num < Uart2_Rx_Num;Uart2_Tx_Num++)USART2_SendByte(Uart2_Buffer[Uart2_Tx_Num]); //发送数据Uart2_Rx_Num = 0; //初始化Uart2_Tx_Num = 0;Uart2_Sta = 0;
}

这是加了数据头和数据尾的接收方式,数据头和尾的个数可增加,此处只用于调试之用。中断函数用于接收数据以及判断数据的头尾,第二个函数在main函数里按照查询方式执行。
优点:较简单,采用缓存区接收,对提高数据的正确行有一定的改善 。
缺点:要是第一次数据接收错误,回不到初始化状态,必须复位操作 。

实例三:

void USART2_IRQHandler()
{ if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中断产生 { USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志. Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(USART2); Uart2_Rx++; Uart2_Rx &= 0x3F; //判断是否计数到最大} if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出 { USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR USART_ReceiveData(USART2); //读DR }
}if( Uart2_Tx != Uart2_Rx )
{ USART2_SendByte(Uart2_Buffer[Uart2_Tx]); //发送数据 Uart2_Tx++; Uart2_Tx &= 0x3F; //判断是否计数到最大
}  

采用FIFO方式接收数据,由0x3F可知此处最大接收量为64个,可变,中断函数只负责收,另一函数在main函数里执行,FIFO方式发送。
优点:发送和接收都很自由,中断占用时间少,有利于MCU处理其它。
缺点:对数据的正确性没有判断,一概全部接收。

实例四:

void USART2_IRQHandler()
{ if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中断产生 { USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中断标志Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(USART2); Uart2_Rx++; Uart2_Rx &= 0xFF; } if(Uart2_Buffer[Uart2_Rx-1] == 0x5A) //头 Uart2_Tx = Uart2_Rx-1; if((Uart2_Buffer[Uart2_Tx] == 0x5A)&&(Uart2_Buffer[Uart2_Rx-1] == 0xA5)) //检测到头的情况下检测到尾 { Uart2_Len = Uart2_Rx-1- Uart2_Tx; //长度 Uart2_Sta=1; //标志位 } if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出 { USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR USART_ReceiveData(USART2); //读DR }
}if( Uart2_Sta )
{ for(tx2=0;tx2 <= Uart2_Len;tx2++,Uart2_Tx++) USART2_SendByte(Uart2_Buffer[Uart2_Tx]); //发送数据 Uart2_Rx = 0; //初始化 Uart2_Tx = 0; Uart2_Sta = 0;
}

数据采用数据包的形式接收,接收后存放于缓存区,通过判断数据头和数据尾(可变)来判断数据的“包”及有效性,中断函数用于接收数据和判断头尾以及数据包长度,另一函数在main函数里执行,负责发送该段数据。
优点:适合打包传输,稳定性和可靠性很有保证,可随意发送,自动挑选有效数据。
缺点:缓存区数据长度要根据“包裹”长度设定, 要是多次接收后无头无尾,到有头有尾的那一段数据恰好跨越缓存区最前和最后位置时,可能导致本次数据丢失,不过这种情况几乎没有可能。

STM32串口中断的4种接收数据的实现方式相关推荐

  1. STM32串口中断接收实验

    STM32串口中断接收实验的详细说明 准备 代码实现 总结 准备 材料:STM32F407ZGT6最小系统板,串口1通过跳线帽连接到了CH340上. 需求:从电脑向板子的串口1发送一个字符串(以回车和 ...

  2. 关于STM32串口3的使用,接收并解析一帧数据

    关于STM32串口3的使用,接收并解析一帧数据 当stm32的串口1被使用时,我们可以使用其他串口来使用. 步骤: 串口3定义.初始化: 串口3中断服务函数(接收的一帧数据并判断是否正确): 主函数使 ...

  3. STM32串口通信中使用printf发送数据配置方法 开发环境 Keil

    STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) 已有 12456 次阅读2011-6-29 23:29 | 在STM32串口通信程序中使用printf发送数据, ...

  4. STM32串口中断程序-迪文屏,

    STM32串口中断程序-迪文屏,串口接收准确数值 这几天一直在做原子开发板与迪文屏的通信,开发板向迪文屏写数据已经完成,但是从迪文屏读的数据总是无法返回开发板.原始及调试程序见下图: 在串口接收到从d ...

  5. 【redis】三种redis数据导出导入方式

    文章目录 1.概述 一.redis-dump方式 二.aof方式导入 三.rdb文件迁移方式 1.概述 转载:三种redis数据导出导入方式 一.redis-dump方式 redis-dump安装 y ...

  6. mysql 导入 rdb_几种redis数据导出导入方式

    几种redis数据导出导入方式 1 环境说明: 192.168.1.101 node1 redis源实例 192.168.1.102 node2 redis目标实例 192.168.1.103 nod ...

  7. STM32使用串口IDLE中断的两种接收不定长数据的方式

    现在有很多数据处理都要用到不定长数据,而单片机串口的RXNE中断一次只能接收一个字节的数据,没有缓冲区,无法接收一帧多个数据,现提供两种利用串口IDLE空闲中断的方式接收一帧数据,方法如下: 方法1: ...

  8. STM32串口中断接收帧数据并返回给上位机总结(配合MAX3483)

    一.前言 这是我的第一篇CSDN,记录一些代码总结,一方面与大家分享交流,另一方面方便以后再次使用能够快速回忆,再就是提高自身写作水平.如有错误之处,欢迎各位大佬批评指正. 二.所涉及的芯片 1.ST ...

  9. STM32串口中断接收HAL库超详解析

    之前一直用的固件库跑c8t6和zet6,现在有幸接触到stm32H743用到HAL库,学习嘛都是踩坑,csdn,然后...理解底层库的代码 本人有幸遇到了H7的串口中断接收只进去一次的Bug,于是马上 ...

最新文章

  1. ui设计培训需要什么基础?如何入门学习?
  2. OpenvSwitch代码分析之bridge和port
  3. python开发需要掌握哪些知识-Python基础学习需要掌握哪些知识
  4. java窗口绘图_JAVA-窗口中绘制图形
  5. 洛谷 1858 多人背包
  6. OpenGL depthclamp深度夹紧实例
  7. BAdI to control ALV grid display
  8. nstimer循环引用_ios开发中经典循环引用场景?
  9. 【bzoj2521】[Shoi2010]最小生成树 网络流最小割
  10. java aspose 导出word_使用aspose.word 第三方的插件实现导出word
  11. mysql键太长_数据库,主键为何不宜太长长长长长长长长?(转)
  12. WeLive开源PHP在线客服系统源码
  13. linux java jdk配置_Linux环境下安装JDK并配置环境变量
  14. SpringBoot使用@Scheduled创建定时任务
  15. 实验2-1-1 计算摄氏温度 (5 分)
  16. 获取手机网络状态之ConnectivityManager
  17. 基于JavaWeb的房屋出租管理系统设计与实现
  18. 史上最详细How to Use Time Information Effectively Combining with Time Shift Module for Lipreading文章记录
  19. 解决linux下.AppImage文件无法运行问题
  20. 求矩阵的逆的三种方法

热门文章

  1. Dart 调用C语言混合编程
  2. HihoCoder#1509 : 异或排序(二进制)
  3. 2.对于所有对象都通用的方法_EJ
  4. ●BZOJ 4596 [Shoi2016]黑暗前的幻想乡
  5. 关于Unity中的光照(六)
  6. Angular学习记录一
  7. .NET Framework、C#语言、IDE、CLR 版本历史及其差异(最新)
  8. 程序员到底要不要用框架开发?
  9. time.h 详细介绍
  10. LeetCode算法题5:双指针