请教下 关于stm32f407的usart1的串口接收问题

2019-07-20 13:47发布

之前一直都是搞51单片机的 所以对stm32没有太多的理解 最多就是别人写好的模板 然后写处理函数 所以我在理解stm32编程的时候还是趋向于用51的方式去理解

首先 硬件时f4探索者串口1的函数时原子的程序 如下(未进行修改)
void USART1_IRQHandler(void)                        //串口1中断服务程序
{
    u8 Res;
#if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
    OSIntEnter();
#endif
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
    {
        Res =USART_ReceiveData(USART1);//(USART1->DR);        //读取接收到的数据
        if((USART_RX_STA&0x8000)==0)//接收未完成    //当收到0x0d时 USART_RX_STA&0x8000 表示还没有接受完
        {
            if(USART_RX_STA&0x4000)//接收到了0x0d   //表示上一个收到0x0d的 USART_RX_STA&0x4000 此时判断当前的数据是不是0x0a
            {
                if(Res!=0x0a)
                    USART_RX_STA=0;//接收错误,重新开始
                else
                    USART_RX_STA|=0x8000;        //接收完成了
            }
            else //还没收到0X0D
            {
                if(Res==0x0d)
                    USART_RX_STA|=0x4000;
                else
                {
                    USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                    USART_RX_STA++;
                    if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
                }
            }
        }
    }
#if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
    OSIntExit();
#endif
}


然后我自己的处理函数是这样的
void u1_scan()
{
    if(USART_RX_STA&0x8000)
        {
                len=USART_RX_STA&0x3fff;
            for(i=0;i<len;i++)
                {
                    USART_SendData(USART1,USART_RX_BUF[i]);
                    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                }
                printf(" ");
                USART_RX_STA=0;
        }
}

然后在while(1)循环 目前收发都是没有大问题的


那么问题来了 在void USART1_IRQHandler(void)                 //串口 1 中断服务程序
中 很显然是要求结尾是0x0d 0x0a 才能最终完成判断接收完成 但是为什么我随意发任何数据 都能返回数据 如下图

麻烦懂得解释下

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。