奇怪的串口位置问题

2019-10-15 17:29发布

我写了一个关于串口接收上位机数据并加上一些单词在发送回去的函数,有一个疑惑
void USART2_IRQHandler(void)
{
       
        while(1)
        {
                while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)!=SET);
                *(table2+i)=USART_ReceiveData(USART2);
                i++;
                if(i!=0&&*(table2+i-1)==' ')
                {
                        *(table2+i-1)='';
                        break;
                }
                        USART_ClearITPendingBit(USART2,USART_IT_RXNE);
       
        }
        strcat(table2,"thank");
        while(*table2!='')
        {
                        USART_ClearFlag(USART2,USART_FLAG_TC);
                        USART_SendData(USART2,(uint16_t)*table2);
                        table2++;
                        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=1);
        }
        i=0;
         table2=table2_my;
}



USART_ClearITPendingBit(USART2,USART_IT_RXNE);这个函数的位置,最开始我是放到中断函数进来第一行(不在while里面),这时候我上位机发送abcd,返回来的数字却是bcd....,然后我把它移动到现在的位置,数据才正常,请问这是为什么啊,请大家指点一下
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
xuande
1楼-- · 2019-10-15 22:25

就是。。。。每次都要clear一下才对。


347185100
2楼-- · 2019-10-16 02:37
xuande 发表于 2017-1-13 14:27
就是。。。。每次都要clear一下才对。

可是我放在第一行,不也是每次进中断都clear了吗?好奇
亮仔同学
3楼-- · 2019-10-16 02:39
调用USART_ClearITPendingBit(USART2,USART_IT_RXNE)这个函数的时候,已经把USART_FLAG_RXNE这个标志位也清了;所以程序会卡在while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)!=SET);直到b来到才能往下跑;
个人理解是这样,可以去看一下库函数是不是
lvkanger
4楼-- · 2019-10-16 03:23
 精彩回答 2  元偷偷看……
亮仔同学
5楼-- · 2019-10-16 06:30
然后在中断里面就不用用这个状态来死等了,进了中断只要判断是否是接收中断就可以了;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{       
      USART_ReceiveData(USART2);
      USART_ClearITPendingBit(USART2, USART_IT_RXNE);
}
347185100
6楼-- · 2019-10-16 10:58
补充一下,放在最前面的话假如你多次输入abcd,但只有第一个会缺少a,后面的都不会缺,换到后面的话就全部都不少a,都完整

一周热门 更多>