STM32-串口超时判断方式接收未知长度数据
2016-01-12 13:08
921 查看
usart.c串口中断处理函数:
u8 USART_RX_BUF[64]; //接收缓冲,最大64个字节. u8 res=0; u8 i=0,Rec_Len; //Rec_Len为接收到的字符个数 u8 Rec_Over_Flag=0; u8 RxTimeout=3; //串口接收超时; void USART1_IRQHandler(void) { if(USART1->SR&(1<<5))//接收到数据 { if(RxTimeout==0) { Rec_Len=i; i=0; Rec_Over_Flag=1; } RxTimeout=3; //定时器每隔10ms中断一次,3次的时间为30ms,超过30ms无数据发送就认定该次发送结束 USART_RX_BUF[i++]=USART1->DR; } }timer.c定时器中断函数
void TIM3_IRQHandler(void) { if(TIM3->SR&0X0001)//溢出中断 { if(RxTimeout>0) { RxTimeout--; if(RxTimeout==0) LED1=!LED1; //RxTimeout等于0,变换LED1表明该次发送结束 } } TIM3->SR&=~(1<<0);//清除中断标志位 }main.c主函数
int main(void) { u8 t; u8 len; extern u8 i,Rec_Len,Rec_Over_Flag; u8 Password[7]="123456"; u8 Tishi1[]="操作码长度不对"; u8 Tishi2[]="操作码不正确"; u8 Tishi3[]="指令成功执行!"; u16 times=0; Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 uart_init(72,9600); //串口初始化为9600 LED_Init(); //初始化与LED连接的硬件接口 Timerx_Init(100,7199); //10kHz的技术频率,计数到100为10ms while(1) { if(Rec_Over_Flag==1) { len=Rec_Len;//得到此次接收到的数据长度 if(len!=0x06) { Putstrings(Tishi1); } else // len等于6 { for(t=0;t<len;t++) { if(USART_RX_BUF[t]!=Password[t]) { Putstrings(Tishi2); break; } else if(t==(len-1)) { Putstrings(Tishi3); LED0=!LED0; } } } Rec_Over_Flag=0; } else { times++; // if(times%30==0)LED1=!LED1;//闪烁LED,提示系统正在运行. // if(times%30==0)RxTimeout--; delay_ms(10); } } } //------------输出字符串到串口------------------- void Putstrings(u8 *ptr) { while(*ptr!='\0') { USART1->DR=*ptr++; while((USART1->SR&0X40)==0);//等待发送结束 } USART1->DR='\n'; }
相关文章推荐
- VLAN间通信(单臂路由和SVI)
- PHP运行模式
- LeetCode Range Sum Query - Mutable
- ES中文学习指南---入门篇
- C#中的Dictionary字典类介绍
- 流行的MySql版本
- jQuery全选选择器(基本上来自慕课网)
- 匈牙利命名表
- Google技术专家的建议:各种SdkVersion如何选择?
- PA-项目转资基础篇
- 仿QQ主界面Fragment简单应用
- 【15-16年年末复习】递归快速幂与非递归快速幂
- 局部敏感哈希-Locality Sensitive Hashing
- NYOJ1016(德莱联盟)(判断线段相交)
- 'Building workspace' has encountered a problem.Errors occurred during the build.
- Quartz定时任务简单实现
- 局部敏感哈希(Locality-Sensitive Hashing, LSH)方法介绍
- 微信、qq信息汇总、回复(一)
- 关闭 mongodb 出错: Error: shutdown failed: not authorized
- mongodb 的 C++驱动安装过程以及注意问题