找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3478|回复: 0
收起左侧

STM32单片机串口接收不定长无标志位字符串定时器判断结束

[复制链接]
ID:105323 发表于 2016-2-23 19:04 | 显示全部楼层 |阅读模式
写在前面的话,以警示所有程序员。

你们或许还没有发现,随着我们深入编程领域的时间越久,我们程序员的思维越来越简单,情商也越来越低,这就是编程行业对我们自身的影响。整体跟逻辑的东西打交道,思维当然会固化。如何避免呢?想知道的话留个言,我会在下一篇博文中更新。


还要警示的是:做一个程序员的能力是有限的,一个程序员团队才可以做成大事。无论哪种语言,哪种程序,都不重要,重要的是我们的思路和逻辑,语言只是工具,不是目的!

//串口1中断服务程序
void USART1_IRQHandler(void)  
{
u8 rec_data;
u8 i=0;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
{
rec_data =(u8)USART_ReceiveData(USART1);    //(USART1->DR) 读取接收到的数据
if((USART_RX_STA & 0x80)==0)    //接收未完成,未检测到  0x0d0x0a的结束符
{
USART_RX_BUF[USART_RX_STA & 0X7F]=rec_data;
USART_RX_STA++;
if(USART_RX_STA>127){USART_RX_STA=0;}//接收超过127,直接复位,重新接收
else {U1_Rx_Tout=0;Tout_Start=1;} //置零,开始计时
}
   }
}



//定时器2中断服务函数
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET) //溢出中断
{
if(Tout_Start==1){
U1_Rx_Tout++;//接收超时累加
if(U1_Rx_Tout>=2){USART_RX_STA|=0x80;Tout_Start=0;}}//超过20ms,接收结束
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位
}


//主循环:接收到数据,判断结束后,及时发送到电脑
while(1)
{
if(USART_RX_STA&0x80)  
{
len=USART_RX_STA&0x7F;//读取接收数据的长度
uart1SendChars(USART_RX_BUF,len);//发送
USART_RX_STA=0; //一定要清零,否则重复执行if以及无法接收新数据
}
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表