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

2019-08-14 17:29发布

我用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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
Theone
1楼-- · 2019-08-14 19:03
你把Rx_Counter跟ReceiveState声明为volatile变量再试试看
Anthony_brave
2楼-- · 2019-08-15 00:44
 精彩回答 2  元偷偷看……
oywjex
3楼-- · 2019-08-15 03:24
Theone 发表于 2017-8-8 11:25
你把Rx_Counter跟ReceiveState声明为volatile变量再试试看

您好,我volatile了过后还是一样的效果
oywjex
4楼-- · 2019-08-15 07:49
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了
Theone
5楼-- · 2019-08-15 11:34
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
Theone
6楼-- · 2019-08-15 16:43
oywjex 发表于 2017-8-8 13:47
您好,我有点没懂,第一次进中断函数的时候Rx_Counter应该就是0呀,执行了一次Rec[Rx_Counter++]=USART_R ...

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

一周热门 更多>