串口中断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 ,灯就会灭掉。求大神帮我解释一下。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
20条回答
whyviking
1楼-- · 2019-08-22 16:43
 精彩回答 2  元偷偷看……
wmh19910511
2楼-- · 2019-08-22 22:11
硬件仿真会吗?
whyviking
3楼-- · 2019-08-23 03:00
你把电脑端的串口助手的发送新行点选项点掉。因为勾选发送新行的话 每次发送的不单单是'I',而是‘I’,' ',' '3个字符,也就是说你的SWITCH会执行3遍,一次case‘I’,两次 default。这样就出现了你目前的状态
WWCool
4楼-- · 2019-08-23 04:40
whyviking 发表于 2017-4-2 21:20
你把电脑端的串口助手的发送新行点选项点掉。因为勾选发送新行的话 每次发送的不单单是'I',而是‘I’,' ', ...

嗯,我照你的方法试了一下,还是不行啊。不过谢谢你的指导
whyviking
5楼-- · 2019-08-23 09:09
WWCool 发表于 2017-4-2 21:55
嗯,我照你的方法试了一下,还是不行啊。不过谢谢你的指导

你的SWITCH 语句有问题,清除中断应该放在switch外面
WWCool
6楼-- · 2019-08-23 09:29
 精彩回答 2  元偷偷看……

一周热门 更多>