请教下 关于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 才能最终完成判断接收完成 但是为什么我随意发任何数据 都能返回数据 如下图

麻烦懂得解释下

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
lzq12
1楼-- · 2019-07-20 17:04
有些串口调试助手类的软件是会自动下发 的,如果你想确定STM32收到的是什么数据,那可以把收到数据转换后打印或者显示出来,为了避免打印不出 ,你可以给每个数据都加一个固定的数,比如+10
混沌教授
2楼-- · 2019-07-20 19:05
 精彩回答 2  元偷偷看……
混沌教授
3楼-- · 2019-07-20 19:28
 精彩回答 2  元偷偷看……
混沌教授
4楼-- · 2019-07-21 01:26
lzq12 发表于 2017-6-26 15:43
有些串口调试助手类的软件是会自动下发 的,如果你想确定STM32收到的是什么数据,那可以把收到数据转换 ...

我想说的是 我按照你说的 在for发送时 每个数据都加了1之后 正常了 然后我删了 就没有出现过之前的状况了 就是一定要0d 0a才能正常收发了
混沌教授
5楼-- · 2019-07-21 07:08
 精彩回答 2  元偷偷看……
lzq12
6楼-- · 2019-07-21 12:11
混沌教授 发表于 2017-6-26 15:54
虽然不能理解是什么问题 但还是谢谢

不客气的,看了你的问题,我也觉得好难理解~~~但是作为程序猿,可以说经常遇见各种莫名其妙诡异得无法解释的问题,也许某天这个问题的原因就自己出来了,不过也记得和我们说一下

一周热门 更多>