本例程通过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); //读SR
USART_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函数里按照查询方式执行。
优点:较简单,采用缓存区接收,对提高数据的正确行有一定的改善 。
缺点:要是第一次数据接收错误,回不到初始化状态,必须复位操作 。
实例三:
vvoid 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 串口中断 接收方式
引用地址:
STM32串口中断接收方式详细比较
推荐阅读最新更新时间:2024-03-16 14:33
stm32 定时器响应时间计算
以TIM3_Int_Init(u16 arr,u16 psc)为例:(st的标准库) arr:自动重装载值 psc:时钟预分频系数 arr 有四种计数方式:加1、减1,加减、减加。(可单次可多次) 要计算时间必须知道单片机的时钟源频率 F(由时钟频率的方波来计数) 定时器响应时间(T)计算:T= / F (us)
[单片机]
STM32之_keil编译内存大小解析
Program Size: Code=28784 RO-data=6480 RW-data=60 ZI-data=3900 的含义 1. Code: 程序所占用的FLASH大小,存储在FLASH. 2. RO-data: Read-only-data,程序定义的常量,存储在FLASH中。 3. RW-data:Read-write-data,已经被初始化的变量,存储在SRAM中。 4. ZI-data:Zero-Init-data,未被初始化的变量,存储在SRAM中。 简单的说就是在烧写的时候是FLASH中的被占用的空间为: ROM(Flash) size = Code+RO-data+RW-data; 上面代码大小
[单片机]
STM32的八种GPIO模式
STM32有八种IO口模式,分别是:模拟输入、浮空输入、上拉输入、下拉输入、开漏输出、推挽输出、复用开漏输出和复用推挽输出。 1、模拟输入 GPIO_Mode_AIN模拟输入,即关闭施密特触发器,将电压信号传送到片上外设模块(不接上下拉电阻)。 2、浮空输入 GPIO_Mode_IN_FLOATING浮空输入。浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。 3、上下拉输入 GPIO_Mode_IPD下拉输入,GPIO_Mode_IPU上拉输入。一般来讲,上拉电阻为1K-10K,电阻越小,驱动能力越强。 电阻的作用:防止输入端悬空,减少外部
[单片机]
STM32通过FSMC读写FPGA
硬件平台:icore板(STM32F103VC + EP4C6E22C8) STM32F103VC是100管脚的,FSMC引脚定义: 地址仅有A19-23 A16-18 共8根地址线,数据线有16根,控制信号RD、WR、NE1 FPGA挂在BANK1的第一区(NE1,还可以有NE2、3、4) 这样可以在FPGA内定义8个寄存器(仅解析A16-18三根地址线) /*********************************************************** 据此定义如下STM32与FPGA间通信用的寄存器 ************************************************
[单片机]
stm32复位电路设计 浅析stm32复位电路方法
说到复位,我们都不会陌生,系统基本都有一个复位按键。复位的种类有很多:上电复位、掉电复位、复位引脚复位、看门狗复位、软件复位等。本文探讨的就是在stm32中复位电路如何设计。 STM32介绍 STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex®-M0,M0+,M3, M4和M7内核在STM32F105和STM32F107互连型系列微控制器之前,意法半导体已经推出STM32基本型系列、增强型系列、USB基本型系列、互补型系列;新系列产品沿用增强型系列的72MHz处理频率。内存包括64KB到256KB闪存和 20KB到64KB嵌入式SRAM。新系列采用LQFP64、LQFP100和LFBGA10
[单片机]
STM32之限位开关
一、简介 本文介绍如何在STM32上使用限位开关。 二、实验平台 库版本:STM32F10x_StdPeriph_Lib_V3.5.0 编译软件:MDK4.53 硬件平台:STM32开发板(主芯片stm32f103c8t6) 仿真器:JLINK 三、版权声明 四、实验前提 在进行本文步骤前,请先阅读并实现以下博文: 1、《STM32之NVIC》:http://blog.csdn.net/feilusia/article/details/52819709 五、基础知识 1、限位开关是什么? 答:限位开关其实就是会复原开关的开关按键。 也就是说按下限位开关的开关能触发STM32的IO
[单片机]
ST推出低功耗高安全的STM32U5
意法半导体(STMicroelectronics)宣布推出新一代节能微控制器(MCU),即STM32U5系列,该产品专为可穿戴设备,个人医疗设备,家庭自动化和工业传感器等智能应用中对功率/性能比敏感的应用而设计。 新的MCU采用40纳米工艺制造,可在动态工作模式和节能模式下节省功耗。新的STM32U5系列结合了Arm Cortex-M33内核,使用Arm Keil MDK进行最大功率优化的功能以及诸如高级安全性和针对PSA 安全3级和SESIP(针对IoT平台SESIP的安全评估标准)的基于硬件的保护之类的新功能 ,以及图形加速器以增强用户体验。 面向未来的物联网 在物联网(IoT)不断发展的时代,为了使事物连接到网络
[单片机]
基于STM32的PS2遥控小车
摘要:PS2手柄是索尼的PlayStation2游戏机的遥控手柄。索尼的psx系列游戏主机在全球很是畅销。不知什么时候便有人打起ps2手柄的主意,破解了通讯协议,使得手柄可以接在其他器件上遥控使用,比如遥控我们熟悉的智能小车。突出的特点是这款手柄性价比极高,按键丰富,方便扩展到其它应用中。 1.PS2手柄控制 PS2手柄由手柄与接收器两部分组成,手柄主要负责发送按键信息;接收器与单片机(也可叫作主机,可直接用在PS2游戏机上)相连,用于接收手柄发来的信息,并传递给单片机,单片机也可通过接收器,向手柄发送命令,配置手柄的发送模式。 2.PS2手柄时序 1、CS线在通讯期间拉低,通信过程中CS信号线在一串数据(9个字节,每
[单片机]