OpenEdv-开源电子网

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

关于写接收中断函数中的buffer问题

[复制链接]

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
发表于 2017-8-5 10:45:11 | 显示全部楼层 |阅读模式
10金钱
请问大神们,我自己写了一个在中断函数中的buffer,用于接收上位机通过串口发送的数据。但是这样写后为什么标志位rx_flag始终不能置1呢?我发送 55 10 10 10 输出不了收到的数据,请问我是哪里有问题么?[mw_shl_code=c,true]int main(void)
{       
        while(1)
        {
                if(rx_flag==1)
                {
                        rx_flag=0;
                        for(i=0;i<4;i++)
                        {
                                USART_SendData(USART1,Rec);
                                while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
                        }
               

                       
                }
        }
}
void USART1_IRQHandler(void)
{
        u8 Rx_Counter;
        u8 ch;
        if (USART_GetITStatus(USART1,USART_IT_RXNE))
        {
                USART_ClearITPendingBit(USART1,USART_IT_RXNE);

                ch=USART_ReceiveData(USART1);
                if(Rx_Counter==0)
                {
                        if(ch==0x55)
                        {
                                Rec[0]=0x55;
                                Rx_Counter++;
                        }
                        else
                        {
                                Rx_Counter=0;
                        }
                }
                else if(Rx_Counter==4)
                {
                        Rx_Counter=0;
                        rx_flag=1;
                }
                else
                {
                        Rec[Rx_Counter++]=ch;
                }
               
        }
}[/mw_shl_code]



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

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-8-5 13:50:51 | 显示全部楼层
  各位大哥大姐呀,帮小弟瞅瞅么 脑壳都要抠烂了
回复

使用道具 举报

17

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
412
金钱
412
注册时间
2015-10-22
在线时间
95 小时
发表于 2017-8-5 14:19:40 | 显示全部楼层
看的你发送数据这一句     else if(Rx_Counter==4)      4应该改为3吧
回复

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2015-3-23
在线时间
27 小时
发表于 2017-8-5 14:39:42 | 显示全部楼层
if (USART_GetITStatus(USART1,USART_IT_RXNE))应该改为if (USART_GetITStatus(USART1,USART_IT_RXNE) != REST),中断里面的算法没仔细研究,如果是算法导致的问题,请无视这个问题
回复

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-8-5 16:31:07 | 显示全部楼层
昊430 发表于 2017-8-5 14:19
看的你发送数据这一句     else if(Rx_Counter==4)      4应该改为3吧

应该是4吧,您看Rec[Rx_Counter++]=ch的嘛,第一个进来后Rx_Counter就+1了,后面每来一个都加个1。到最后一个也就是第四个的时候他还需要加一个1的嘛。Rec[3]装满了,就加到4了
回复

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-8-5 16:33:06 | 显示全部楼层
longe2 发表于 2017-8-5 14:39
if (USART_GetITStatus(USART1,USART_IT_RXNE))应该改为if (USART_GetITStatus(USART1,USART_IT_RXNE) != R ...

应该不是吧,这个是等待发送完成呢,我听您的把这个注释了,效果是一样的。
回复

使用道具 举报

17

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
412
金钱
412
注册时间
2015-10-22
在线时间
95 小时
发表于 2017-8-5 16:54:14 | 显示全部楼层
oywjex 发表于 2017-8-5 16:31
应该是4吧,您看Rec[Rx_Counter++]=ch的嘛,第一个进来后Rx_Counter就+1了,后面每来一个都加个1。到最后 ...

加到4了,但是你一共就发了4个字节的数据,需要再发送一个字节才能再进入中断判断实现你的标志位置位,我默认你的库函数调用都是正确的,因为我很少用库函数
回复

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-8-5 17:27:46 | 显示全部楼层
昊430 发表于 2017-8-5 16:54
加到4了,但是你一共就发了4个字节的数据,需要再发送一个字节才能再进入中断判断实现你的标志位置位,我 ...

您说的有道理,但是我改了后,还是没有任何反应呢,依然输出不了。库函数肯定是对的,因为如果我就改为收1个字节,那么就正常的。
回复

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-8-5 17:28:35 | 显示全部楼层
oywjex 发表于 2017-8-5 17:27
您说的有道理,但是我改了后,还是没有任何反应呢,依然输出不了。库函数肯定是对的,因为如果我就改为收 ...

我改成这样了
[mw_shl_code=c,true]                else if(Rx_Counter==3)
                {
                        Rx_Counter=0;
                        rx_flag=1;
                        Rec[3]=ch;
                }
                else
                {
                        Rec[Rx_Counter++]=ch;
                }[/mw_shl_code]
回复

使用道具 举报

17

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
412
金钱
412
注册时间
2015-10-22
在线时间
95 小时
发表于 2017-8-5 17:32:52 | 显示全部楼层
oywjex 发表于 2017-8-5 17:28
我改成这样了
[mw_shl_code=c,true]                else if(Rx_Counter==3)
                {

你最好使用仿真器仿真一下,设置断点,看能不能执行rx_flag=1;这一句
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165462
金钱
165462
注册时间
2010-12-1
在线时间
2114 小时
发表于 2017-8-7 00:56:32 | 显示全部楼层
仿真找问题
回复

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-8-7 09:24:41 | 显示全部楼层
昊430 发表于 2017-8-5 17:32
你最好使用仿真器仿真一下,设置断点,看能不能执行rx_flag=1;这一句

我设置了断点,然后用串口助手发了4个字节 然后就只进过一次中断 然后就一直在while里面卡主了,没有理解到呢
回复

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-8-7 09:25:23 | 显示全部楼层

我设置了断点,然后用串口助手发了4个字节 然后单步执行,但是就只进过一次中断 然后就一直在while里面卡住了,
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-20 09:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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