STM32单片机串口接收不定长无标志位字符串定时器判断结束
扫描二维码
随时随地手机看文章
写在前面的话,以警示所有程序员。
你们或许还没有发现,随着我们深入编程领域的时间越久,我们程序员的思维越来越简单,情商也越来越低,这就是编程行业对我们自身的影响。整体跟逻辑的东西打交道,思维当然会固化。如何避免呢?想知道的话留个言,我会在下一篇博文中更新。
还要警示的是:做一个程序员的能力是有限的,一个程序员团队才可以做成大事。无论哪种语言,哪种程序,都不重要,重要的是我们的思路和逻辑,语言只是工具,不是目的!
//串口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以及无法接收新数据
}
}