串口中断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-23 12:18
本帖最后由 whyviking 于 2017-4-2 22:15 编辑
WWCool 发表于 2017-4-2 22:08
这个是我粘贴的时候放错了,清除中断放在switch外面还是不行

你接收到一个字符之后,就把接收中断关了试试,你目前的出现问题应该就是多次进入中断造成的
WWCool
2楼-- · 2019-08-23 14:51
whyviking 发表于 2017-4-2 22:13
你接收到一个字符之后,就把接收中断关了试试,你目前的出现问题应该就是多次进入中断造成的

我靠,大神,可以了,接收一次后把中断关掉灯可以亮。可是为什么呢?
WWCool
3楼-- · 2019-08-23 16:21
WWCool 发表于 2017-4-2 22:21
我靠,大神,可以了,接收一次后把中断关掉灯可以亮。可是为什么呢?

程序为什么会在接收一个字符后多次进入中断呢?
whyviking
4楼-- · 2019-08-23 21:43
WWCool 发表于 2017-4-2 22:21
我靠,大神,可以了,接收一次后把中断关掉灯可以亮。可是为什么呢?

发送新行的选项 到底勾选没勾选?我还是怀疑这个问题
WWCool
5楼-- · 2019-08-24 02:36
 精彩回答 2  元偷偷看……
whyviking
6楼-- · 2019-08-24 05:26
WWCool 发表于 2017-4-2 22:26
我已经确认没有勾选发送新行的选项

你在进入中断服务函数后,判断下串口中断状态,是接收中断再进行你的操作,我现在怀疑你的串口其他中断影响了程序

一周热门 更多>