OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4822|回复: 20

串口中断switch语句

[复制链接]

46

主题

117

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2016-9-13
在线时间
58 小时
发表于 2017-4-2 19:47:36 | 显示全部楼层 |阅读模式
10金钱
    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 ,灯就会灭掉。求大神帮我解释一下。

最佳答案

查看完整内容[请看2#楼]

if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) { //请开始你的表演 }
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

174

帖子

0

精华

高级会员

Rank: 4

积分
725
金钱
725
注册时间
2016-1-9
在线时间
64 小时
发表于 2017-4-2 19:47:37 | 显示全部楼层
WWCool 发表于 2017-4-2 22:36
我看了看这个判断中断是什么的语句不会写啊

if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
   //请开始你的表演
}
回复

使用道具 举报

115

主题

548

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2107
金钱
2107
注册时间
2013-11-27
在线时间
519 小时
发表于 2017-4-2 21:16:56 | 显示全部楼层
硬件仿真会吗?
回复

使用道具 举报

0

主题

174

帖子

0

精华

高级会员

Rank: 4

积分
725
金钱
725
注册时间
2016-1-9
在线时间
64 小时
发表于 2017-4-2 21:20:49 | 显示全部楼层
你把电脑端的串口助手的发送新行点选项点掉。因为勾选发送新行的话 每次发送的不单单是'I',而是‘I’,'\r','\n'3个字符,也就是说你的SWITCH会执行3遍,一次case‘I’,两次 default。这样就出现了你目前的状态
回复

使用道具 举报

46

主题

117

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2016-9-13
在线时间
58 小时
 楼主| 发表于 2017-4-2 21:55:44 | 显示全部楼层
whyviking 发表于 2017-4-2 21:20
你把电脑端的串口助手的发送新行点选项点掉。因为勾选发送新行的话 每次发送的不单单是'I',而是‘I’,'\r', ...

嗯,我照你的方法试了一下,还是不行啊。不过谢谢你的指导
回复

使用道具 举报

0

主题

174

帖子

0

精华

高级会员

Rank: 4

积分
725
金钱
725
注册时间
2016-1-9
在线时间
64 小时
发表于 2017-4-2 22:01:13 | 显示全部楼层
WWCool 发表于 2017-4-2 21:55
嗯,我照你的方法试了一下,还是不行啊。不过谢谢你的指导

你的SWITCH 语句有问题,清除中断应该放在switch外面
回复

使用道具 举报

46

主题

117

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2016-9-13
在线时间
58 小时
 楼主| 发表于 2017-4-2 22:08:42 | 显示全部楼层
whyviking 发表于 2017-4-2 22:01
你的SWITCH 语句有问题,清除中断应该放在switch外面

这个是我粘贴的时候放错了,清除中断放在switch外面还是不行
回复

使用道具 举报

0

主题

174

帖子

0

精华

高级会员

Rank: 4

积分
725
金钱
725
注册时间
2016-1-9
在线时间
64 小时
发表于 2017-4-2 22:13:56 | 显示全部楼层
本帖最后由 whyviking 于 2017-4-2 22:15 编辑
WWCool 发表于 2017-4-2 22:08
这个是我粘贴的时候放错了,清除中断放在switch外面还是不行

你接收到一个字符之后,就把接收中断关了试试,你目前的出现问题应该就是多次进入中断造成的
回复

使用道具 举报

46

主题

117

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2016-9-13
在线时间
58 小时
 楼主| 发表于 2017-4-2 22:21:15 | 显示全部楼层
whyviking 发表于 2017-4-2 22:13
你接收到一个字符之后,就把接收中断关了试试,你目前的出现问题应该就是多次进入中断造成的

我靠,大神,可以了,接收一次后把中断关掉灯可以亮。可是为什么呢?
回复

使用道具 举报

46

主题

117

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2016-9-13
在线时间
58 小时
 楼主| 发表于 2017-4-2 22:24:33 | 显示全部楼层
WWCool 发表于 2017-4-2 22:21
我靠,大神,可以了,接收一次后把中断关掉灯可以亮。可是为什么呢?

程序为什么会在接收一个字符后多次进入中断呢?
回复

使用道具 举报

0

主题

174

帖子

0

精华

高级会员

Rank: 4

积分
725
金钱
725
注册时间
2016-1-9
在线时间
64 小时
发表于 2017-4-2 22:25:05 | 显示全部楼层
WWCool 发表于 2017-4-2 22:21
我靠,大神,可以了,接收一次后把中断关掉灯可以亮。可是为什么呢?

发送新行的选项 到底勾选没勾选?我还是怀疑这个问题
回复

使用道具 举报

46

主题

117

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2016-9-13
在线时间
58 小时
 楼主| 发表于 2017-4-2 22:26:13 | 显示全部楼层
whyviking 发表于 2017-4-2 22:25
发送新行的选项 到底勾选没勾选?我还是怀疑这个问题

我已经确认没有勾选发送新行的选项
回复

使用道具 举报

0

主题

174

帖子

0

精华

高级会员

Rank: 4

积分
725
金钱
725
注册时间
2016-1-9
在线时间
64 小时
发表于 2017-4-2 22:29:19 | 显示全部楼层
WWCool 发表于 2017-4-2 22:26
我已经确认没有勾选发送新行的选项

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

使用道具 举报

46

主题

117

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2016-9-13
在线时间
58 小时
 楼主| 发表于 2017-4-2 22:36:02 | 显示全部楼层
whyviking 发表于 2017-4-2 22:29
你在进入中断服务函数后,判断下串口中断状态,是接收中断再进行你的操作,我现在怀疑你的串口其他中断影 ...

我看了看这个判断中断是什么的语句不会写啊
回复

使用道具 举报

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2017-2-12
在线时间
19 小时
发表于 2017-4-2 22:59:58 | 显示全部楼层
应该是非预期的串口接收中断引起的,default后为空,然后用其他字符点亮LED
回复

使用道具 举报

46

主题

117

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2016-9-13
在线时间
58 小时
 楼主| 发表于 2017-4-4 10:13:56 | 显示全部楼层
whyviking 发表于 2017-4-2 19:47
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
   //请开始你的表演

不好意思,隔了一天才试了一下,我将你这句判断串口三接收中断是否打开的语句放进去之后烧录了一下,发现是不行的。但是这句话是锁定了只有接收中断才能执行switch语句,那么灯不亮就代表有多次接收。为什么会有多次接收,多次接受了几个数据?
回复

使用道具 举报

46

主题

117

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2016-9-13
在线时间
58 小时
 楼主| 发表于 2017-4-4 10:16:30 | 显示全部楼层

就是用硬件仿真的,我不会用软件仿真输入字符啊,能不能教教我怎么用软件做这个实验
回复

使用道具 举报

46

主题

117

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2016-9-13
在线时间
58 小时
 楼主| 发表于 2017-4-4 10:17:23 | 显示全部楼层
fhiuergnjksk 发表于 2017-4-2 22:59
应该是非预期的串口接收中断引起的,default后为空,然后用其他字符点亮LED

什么是非预期的串口接收中断呢?
回复

使用道具 举报

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2017-2-12
在线时间
19 小时
发表于 2017-4-4 15:56:45 | 显示全部楼层
你设定一个变量把进入中断服务程序的次数和信息记录下来进行分析就知道了,估计是有非你预期的中断
回复

使用道具 举报

0

主题

174

帖子

0

精华

高级会员

Rank: 4

积分
725
金钱
725
注册时间
2016-1-9
在线时间
64 小时
发表于 2017-4-4 18:46:21 | 显示全部楼层
怎么还不行呢,把你代码传上来看看吧。
回复

使用道具 举报

46

主题

117

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2016-9-13
在线时间
58 小时
 楼主| 发表于 2017-4-5 12:37:07 | 显示全部楼层
whyviking 发表于 2017-4-4 18:46
怎么还不行呢,把你代码传上来看看吧。

可以了,谢谢你了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-8-22 10:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表