×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-05-21 发布时间:
|

写在前面的话,以警示所有程序员。


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


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

//串口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)     //接收未完成,未检测到  0x0d 0x0a的结束符

{

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以及无法接收新数据

}

}


关键字:STM32  单片机  串口接收  无标志位字符串 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈msp430f5529入门(2)----时钟配置.例程分析