OpenEdv-开源电子网

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

串口接收中断发生了很诡异的事情

[复制链接]

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
发表于 2017-8-8 11:19:22 | 显示全部楼层 |阅读模式
10金钱
我用STM32F103C8T6写串口接收中断,将接收的数据,再通过串口发送出来。但是出了一个很奇怪的问题,不知道具体什么原因,请问有没有大神能给个答复呢?怎么都想不到为什么会这样。我用串口调试助手发送55 04 58 22,点一次发送,串口助手收到单片机回应只有一个55,再点一次发送,收到回应04 58 22,再点一次又是55 就是这样,每次都是分两次才接受得完,不知道这个是什么原因呢。
[mw_shl_code=c,true]        while(1)
        {
                if(ReceiveState==1)
                {
                        ReceiveState=0;
                        for(i=0;i<4;i++)
                        {
                                USART_SendData(USART1,Rec);
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
                        }
                Rx_Counter=0;

                }
        }
void USART1_IRQHandler(void)
{
        u8 Clear=Clear;
        if (USART_GetITStatus(USART1,USART_IT_RXNE))
        {
                USART_ClearITPendingBit(USART1,USART_IT_RXNE);
               
                Rec[Rx_Counter++]=USART_ReceiveData(USART1);
                if(Rx_Counter==4)
                {
                        ReceiveState=1;       
                }
               
        }
}[/mw_shl_code]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2014-8-16
在线时间
193 小时
发表于 2017-8-8 11:25:21 | 显示全部楼层
你把Rx_Counter跟ReceiveState声明为volatile变量再试试看
回复

使用道具 举报

24

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2016-1-15
在线时间
64 小时
发表于 2017-8-8 13:01:48 | 显示全部楼层
本帖最后由 Anthony_brave 于 2017-8-8 13:05 编辑

中断函数里面 你把四个数放在了Rec[1] Rec[2] Rec[3] Rec[4]

但是在main函数里面发送的是Rec[0] Rec[1] Rec[2] Rec[3]
另外Rx_Counter应该设置为static变量。Rx_Counter清零应放在中断里面更规范。

回复

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-8-8 13:43:22 | 显示全部楼层
Theone 发表于 2017-8-8 11:25
你把Rx_Counter跟ReceiveState声明为volatile变量再试试看

您好,我volatile了过后还是一样的效果
回复

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-8-8 13:47:41 | 显示全部楼层
Anthony_brave 发表于 2017-8-8 13:01
中断函数里面 你把四个数放在了Rec[1] Rec[2] Rec[3] Rec[4]

但是在main函数里面发送的是Rec[0] Rec[1]  ...

您好,我有点没懂,第一次进中断函数的时候Rx_Counter应该就是0呀,执行了一次Rec[Rx_Counter++]=USART_ReceiveData(USART1);后,Rx_Counter才为1的。所以第一次应该是赋值到了Rec[0]里面呀。 Rx_Counter我之前是放在中断函数里面清零,但是,那样的话,同样发送55 04 58 22的话 收到的就更奇怪了,第一次收到55  第二次收到04 58 22 55了
回复

使用道具 举报

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2014-8-16
在线时间
193 小时
发表于 2017-8-8 13:52:40 | 显示全部楼层
Anthony_brave 发表于 2017-8-8 13:01
中断函数里面 你把四个数放在了Rec[1] Rec[2] Rec[3] Rec[4]

但是在main函数里面发送的是Rec[0] Rec[1]  ...

Rec[Rx_Counter++]

这句话会先执行Rec[Rx_Counter] 后执行Rx_Counter++,所以存放的地方还是0,1,2,3
回复

使用道具 举报

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2014-8-16
在线时间
193 小时
发表于 2017-8-8 13:54:53 | 显示全部楼层
oywjex 发表于 2017-8-8 13:47
您好,我有点没懂,第一次进中断函数的时候Rx_Counter应该就是0呀,执行了一次Rec[Rx_Counter++]=USART_R ...

楼主单步调试一下问题在哪吧。
回复

使用道具 举报

24

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2016-1-15
在线时间
64 小时
发表于 2017-8-8 13:55:02 | 显示全部楼层
本帖最后由 Anthony_brave 于 2017-8-8 13:58 编辑
oywjex 发表于 2017-8-8 13:47
您好,我有点没懂,第一次进中断函数的时候Rx_Counter应该就是0呀,执行了一次Rec[Rx_Counter++]=USART_R ...

那应该是这样

回复

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-8-8 14:18:37 | 显示全部楼层
Theone 发表于 2017-8-8 13:54
楼主单步调试一下问题在哪吧。

您好,这个串口怎么单步调试呀?我发送了4个字节,但是单步只执行接收一个字节的过程。接收了55然后就进while(1)了。
回复

使用道具 举报

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2014-8-16
在线时间
193 小时
发表于 2017-8-8 15:22:20 | 显示全部楼层
oywjex 发表于 2017-8-8 14:18
您好,这个串口怎么单步调试呀?我发送了4个字节,但是单步只执行接收一个字节的过程。接收了55然后就进w ...

你可以一个字节一个字节的发,然后再分析你的逻辑哪里出问题了。
回复

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-8-8 15:46:06 | 显示全部楼层
Theone 发表于 2017-8-8 15:22
你可以一个字节一个字节的发,然后再分析你的逻辑哪里出问题了。

一字节一个字节 就没问题。。。这个就是我最想不通的地方
回复

使用道具 举报

8

主题

72

帖子

0

精华

高级会员

Rank: 4

积分
673
金钱
673
注册时间
2014-1-14
在线时间
109 小时
发表于 2017-8-9 10:16:49 | 显示全部楼层
最好弄个定时器把一帧帧数据区分开来
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2012-6-3
在线时间
1 小时
发表于 2017-8-9 11:09:52 | 显示全部楼层
好像以前也遇到过,后面有没解决都忘记了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-20 13:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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