串口中断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条回答
WWCool
1楼-- · 2019-08-24 07:17
whyviking 发表于 2017-4-2 22:29
你在进入中断服务函数后,判断下串口中断状态,是接收中断再进行你的操作,我现在怀疑你的串口其他中断影 ...

我看了看这个判断中断是什么的语句不会写啊
fhiuergnjksk
2楼-- · 2019-08-24 07:53
应该是非预期的串口接收中断引起的,default后为空,然后用其他字符点亮LED
WWCool
3楼-- · 2019-08-24 11:59
whyviking 发表于 2017-4-2 19:47
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
   //请开始你的表演

不好意思,隔了一天才试了一下,我将你这句判断串口三接收中断是否打开的语句放进去之后烧录了一下,发现是不行的。但是这句话是锁定了只有接收中断才能执行switch语句,那么灯不亮就代表有多次接收。为什么会有多次接收,多次接受了几个数据?
WWCool
4楼-- · 2019-08-24 15:27
 精彩回答 2  元偷偷看……
WWCool
5楼-- · 2019-08-24 16:19
fhiuergnjksk 发表于 2017-4-2 22:59
应该是非预期的串口接收中断引起的,default后为空,然后用其他字符点亮LED

什么是非预期的串口接收中断呢?
fhiuergnjksk
6楼-- · 2019-08-24 18:17
你设定一个变量把进入中断服务程序的次数和信息记录下来进行分析就知道了,估计是有非你预期的中断

一周热门 更多>