串口中断switch语句

2019-08-22 16:18发布

    void USART3_IRQHandler()
{
  char DATA=' ' ;
  DATA=USART_ReceiveData(USART3);
USART_SendData(USART3,DATA);

     switch(DATA)
   {
     case 'g': Go_Straight();break;
     case 'o': Go_Opposite();break;
     case 'l': PEout(5)=0; break;               //LED灯亮
     default : PEout(5)=1;                           //LED灯灭
     USART_ClearITPendingBit(USART3,USART_IT_RXNE);
   }

}
这个中断服务函数的功能是,当我接收到数据时触发该中断,将接收到的数再通过串口发送出来,然后执行下面的switch语句。然后我用串口助手发送 ‘ l ’,发现能够返回数据给串口助手,但是灯不会亮。然后我把下面的default语句注释掉发现灯亮了 ,我就怀疑是case ‘ l ’后面的语句和default语句同时执行了,所以LED灯不会亮。接着我将default后面的语句改了一下,看看是不是同时执行。我改成default :PEout(6)=0;就是将另一个LED灯也点亮,发现当我这样之后再发送一个数据给单片机后,两个灯全部亮了。也就是说case ‘ l ’后面的语句和default后面的语句在我发送一个  l  后全部都执行了。我很想知道为什么会这样。

最后为了实现原本的功能我又尝试将default语句改成 default:PEout(5)=!PEout(5);发现当我输入  ‘ l ’后灯会亮,再输入其它字符例如 s ,灯就会灭掉。求大神帮我解释一下。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。