STM32-串口超时判断方式接收未知长度数据

发布者:花海鱼最新更新时间:2016-01-11 来源: eefocus关键字:STM32  串口超时  判断方式  长度数据 手机看文章 扫描二维码
随时随地手机看文章
usart.c串口中断处理函数:

 

[cpp] view plaincopy
 
  1. void USART1_IRQHandler(void)  
  2. {      
  3.     u8 res;       
  4.     if(USART1->SR&(1<<5))//接收到数据  
  5.     {      
  6.         res=USART1->DR;             
  7.         if(USART1_Recv_Len
  8.         {  
  9.             TIM3->CNT=0;                             //计数器清空  
  10.             if(Rec_Over_Flag==0)TIM3_Set(1);        //使能定时器4的中断   
  11.             USART1_RX_BUF[USART1_Recv_Len++]=res;       //记录接收到的值      
  12.         }else   
  13.         {  
  14.             Rec_Over_Flag=1;                    //强制标记接收完成  
  15.         }   
  16.     }                                              
  17. }   
  18. timer.c定时器中断函数  
  19. //定时器3中断服务程序       
  20. void TIM3_IRQHandler(void)  
  21. {                                     
  22.     if(TIM3->SR&0X0001)//溢出中断  
  23.     {     
  24.         Rec_Over_Flag=1;  
  25.         TIM3->SR&=~(1<<0);     //清除中断标志位  
  26.         TIM3_Set(0);  
  27.         LED1=!LED1;      //RxTimeout等于0,变换LED1表明该次发送结束                                                            
  28.     }                             
  29. }  
  30. //设置TIM4的开关  
  31. //sta:0,关闭;1,开启;  
  32. void TIM3_Set(u8 sta)  
  33. {  
  34.     if(sta)  
  35.     {  
  36.         TIM3->CNT=0;         //计数器清空  
  37.         TIM3->CR1|=1<<0;     //使能定时器3  
  38.     }else TIM3->CR1&=~(1<<0);//关闭定时器3       
  39. }  

 

main.c主函数

 

[cpp] view plaincopy
 
  1. int main(void)  
  2. {             
  3.     u8 t;  
  4.     u8 Password[7]="123456";  
  5.     u8 Tishi1[]="操作码长度不对";  
  6.     u8 Tishi2[]="操作码不正确";  
  7.     u8 Tishi3[]="指令成功执行!";  
  8.     u16 times=0;    
  9.     Stm32_Clock_Init(9); //系统时钟设置  
  10.     delay_init(72);      //延时初始化   
  11.     uart_init(72,57600);     //串口初始化为57600  
  12.     LED_Init();          //初始化与LED连接的硬件接口   
  13.     Timerx_Init(99,7199);  //10kHz的技术频率,计数到100为10ms  
  14.     while(1)  
  15.     {     
  16.         if(Rec_Over_Flag==1)  
  17.         {                        
  18.             if(USART1_Recv_Len!=0x06)  //USART1_Recv_Len接收数据的长度不等于6  
  19.             {   
  20.                 Putstrings(Tishi1);  
  21.             }  
  22.             else                       // USART1_Recv_Len接收数据的长度等于6  
  23.             {  
  24.                 for(t=0;t
  25.                 {  
  26.                     if(USART1_RX_BUF[t]!=Password[t])  
  27.                     {  
  28.                         Putstrings(Tishi2);  
  29.                         break;  
  30.                     }  
  31.                     else if(t==(USART1_Recv_Len-1))  
  32.                     {  
  33.                         Putstrings(Tishi3);  
  34.                         LED0=!LED0;  
  35.                     }  
  36.                 }  
  37.             }  
  38.             Rec_Over_Flag=0;  
  39.             USART1_Recv_Len=0;    
  40.         }  
  41.         else  
  42.         {  
  43.             times++;  
  44. //          if(times%30==0)LED1=!LED1;//闪烁LED,提示系统正在运行.  
  45. //          if(times%30==0)RxTimeout--;   
  46.             delay_ms(10);             
  47.         }      
  48.     }   
  49. }  
  50. //------------输出字符串到串口-------------------  
  51. void Putstrings(u8 *ptr)  
  52. {  
  53.     while(*ptr!='')  
  54.     {  
  55.         USART1->DR=*ptr++;  
  56.         while((USART1->SR&0X40)==0);//等待发送结束  
  57.     }  
  58.     USART1->DR=' ';  
  59. }  

 

[cpp] view plaincopy
 
  1.   
  2.   
  3.   
  4.   
  5.   
  6.   
  7.   
  8.   
  9.      
  10.   
 

关键字:STM32  串口超时  判断方式  长度数据 引用地址:STM32-串口超时判断方式接收未知长度数据

上一篇:STM32嵌入式微控制器快速上手——笔记
下一篇:STM32-串口实验学习笔记

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

STM32定时器输出带有死区时间的PWM波形
要求得到下列波形,死区时间为1us,CH1,CH2,CH3之间的相位差为3us,频率为50KHz main.c /********************************************* 标题:定时器输出带有死区时间的PWM波形 软件平台:MDK-ARM Standard Version4.70 硬件平台:stm32f4-discovery 主频:168M Periph_Driver_version: V1.0.0 描述:用一个定时器(TIM1),输出带有死区时间的PWM波形,要求:死区时间为1us,CH1,CH2,CH3之间的相位差为3us,频率为50KHz 代码参考
[单片机]
<font color='red'>STM32</font>定时器输出带有死区时间的PWM波形
关于STM32的几种输入模式以及外部中断的配置
最近做毕业设计,需要用按键来触发外部中断。实验的时候是正常的,但是换了个核心板以及用上自己做的PCB电路板后,出现了一些问题。问题如下: 要求:将连接按键的IO口配置为上拉输入,按键一端接IO口,一端接地,即当按键按下后,该IO口会产生一个下降沿,触发下降沿中断。 问题:将相应的IO口配置好后,测了引脚的的电压,并不是3.3V左右,而是0.1V左右。于是猜想: 1. 外围电路对IO口产生了影响。 2. STM32内部上拉能力较弱,一次只能上拉一个IO口。 于是开始从这两个想法着手解决。首先第一个,很容易就排除了。将外围电路撤掉,我用的是杜邦线,直接拔掉测量引脚上的电压,依然是0.1V左右,于是第1个猜想排除。 第二个,查看万能
[单片机]
143条 超详细整理STM32单片机学习笔记(必看)
1、AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2 1,意思是APB2接高速设备 2、Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一个为stm32f10x_conf.h专门控制外围器件的配置,也就是开关头文件的作用 3、HSE Osc(High Speed External Oscillator)高速外部晶振,一般为8MHz,HSI RC(High Speed InternalRC)高速内部RC,8MHz 4、LSE Osc(Low Speed External Oscillator)低速外部晶振,一般为32.768KHz,LSI RC(Low Speed InternalRC
[单片机]
STM32入门系列-位带操作介绍
向大家介绍 STM32F1 的位带操作,让 STM32 的位操作和 51 单片机的位操作一样简单。 位带操作 在学习 51 单片机的时候就使用过位操作,通过关键字 sbit 对单片机 IO 口进行位定义。但是 STM32 没有这样的关键字,而是通过访问位带别名区来实现。即将每个比特位膨胀成一个 32 位字,当访问这些字的时候就达到了访问比特的目的。比方说 BSRR 寄存器有 32 个位,那么可以映射到 32 个地址上,当我们去访问这 32 个地址就达到访问 32 个比特的目的。 STM32F1 中有两个区域支持位带操作,一个是 SRAM 区的最低 1MB 范围,一个是片内外设区的最低 1MB 范围(APB1、APB2、
[单片机]
<font color='red'>STM32</font>入门系列-位带操作介绍
STM32实战七 数字滤波
数字滤波是数据处理是常用、灵活、有效的方法。前面的按键程序已经用到了滤波,属于开关量滤波,这里要讨论的是模拟量滤波程序,包括最常用的两种方法,中值滤波和平均值滤波。 中值滤波的原理是,每次取最近几个数的中间值作为输出数据,每个波形的最高和最低几个数被滤掉,优点是基本保留原有数据,能有效抑制大幅值低频尖峰干扰,俗称椒盐噪声。 平均值滤波,就是对最近一些数求平均,是最常用最简单的方法,对高频低幅值随机噪声有效,缺点是会损失原始数据中的高频分量,对高幅值干扰会扩大影响。下面的程序中应用了移位平均算法,效率高,且不受求平均的数据数目大小的影响。两种滤波方式都有一定延时。 AverageFilter.h #ifndef __
[单片机]
基于STM32的停车锁系统
一.系统设计 停车场车位锁设计有蓝牙控制功能,可以通过蓝牙控制启动开锁,用步进电机模拟,开锁之后当车进行倒车的时候,可以将超声波采集到的距离数据发送给APP,另外当光敏电阻监测到比较暗的时候,会控制LED灯亮,给车照明。车停好之后可以远程控制车锁上,电机模拟。车锁之后如果光电管监测到有车要进入车位的时候,控制蜂鸣器报警提示。 图1 系统框图 二.硬件设计 系统内的主要电路有单片机最小系统电路,步进电机驱动电路、光敏检测电路、超声波测距电路,蓝牙通信电路、光电开关电路、电源电路、报警电路。 图2 硬件电路 三.软件设计 系统的软件逻辑清晰,首先先进行一次系统初始化,此时就开始进行超声波测距,光强检测,开始进行蓝牙通信,判断手
[单片机]
基于<font color='red'>STM32</font>的停车锁系统
stm32驱动12864液晶显示程序
注意:stm32的3.3v工作电压,需要使用3.3v工作电压的12864液晶 #include stm32f10x_lib.h #define uint unsigned int #define uchar unsigned char #define RSH GPIO_SetBits(GPIOA,GPIO_Pin_0) #define RSL GPIO_ResetBits(GPIOA,GPIO_Pin_0) #define RWH GPIO_SetBits(GPIOA,GPIO_Pin_1) #define RWL GPIO_ResetBits(GPIOA,GPIO_Pin_1) #define ENH GPIO_Se
[单片机]
STM32学习 存储器和总线构架
主系统由以下部分构成: 1.四个驱动单元: Cortex-M3内核,DCode总线和系统总线(S-Bus),通用DMA1和通用DMA2 2四个被动单元 内部SRAM,内部闪存存储器,FSMC,AHB到APB的桥,它链接所有的APB设备。 程序存储器,数据存储器,寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。数据字节以小端格式存放在存储器中。 可访问的存储器空间被分成8个主要块,每一个块为512M。 STM32F10XX内置64K字节的静态SRAM,它可以以字节,半字,或字访问。 SRAM的起始地址是0x2000000 Cortex-M3存储器映像包括两个位段区。这两个位段区将别外存储区中的每个字映
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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