OpenEdv-开源电子网

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

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

[复制链接]

2

主题

12

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-6-23
在线时间
4 小时
发表于 2017-6-26 15:08:32 | 显示全部楼层 |阅读模式
5金钱
之前一直都是搞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("\r\n\r\n");
                USART_RX_STA=0;
        }
}

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


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

麻烦懂得解释下

微信截图_20170626150720.png

最佳答案

查看完整内容[请看2#楼]

有些串口调试助手类的软件是会自动下发\r\n的,如果你想确定STM32收到的是什么数据,那可以把收到数据转换后打印或者显示出来,为了避免打印不出\r\n,你可以给每个数据都加一个固定的数,比如+10
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
发表于 2017-6-26 15:08:33 | 显示全部楼层
有些串口调试助手类的软件是会自动下发\r\n的,如果你想确定STM32收到的是什么数据,那可以把收到数据转换后打印或者显示出来,为了避免打印不出\r\n,你可以给每个数据都加一个固定的数,比如+10
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-6-23
在线时间
4 小时
 楼主| 发表于 2017-6-26 15:46:46 | 显示全部楼层
lzq12 发表于 2017-6-26 15:43
有些串口调试助手类的软件是会自动下发\r\n的,如果你想确定STM32收到的是什么数据,那可以把收到数据转换 ...

我用的是stc的下载软件的串口助手 这窝在51用的很多 是不会加换行符的 你说的方式我试下
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-6-23
在线时间
4 小时
 楼主| 发表于 2017-6-26 15:52:32 | 显示全部楼层
lzq12 发表于 2017-6-26 15:43
有些串口调试助手类的软件是会自动下发\r\n的,如果你想确定STM32收到的是什么数据,那可以把收到数据转换 ...

我想说的是 我按照你说的 在for发送时 每个数据都加了1之后 正常了 然后我删了 就没有出现过之前的状况了 就是一定要0d 0a才能正常收发了
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-6-23
在线时间
4 小时
 楼主| 发表于 2017-6-26 15:52:43 | 显示全部楼层
lzq12 发表于 2017-6-26 15:43
有些串口调试助手类的软件是会自动下发\r\n的,如果你想确定STM32收到的是什么数据,那可以把收到数据转换 ...

我想说的是 我按照你说的 在for发送时 每个数据都加了1之后 正常了 然后我删了 就没有出现过之前的状况了 就是一定要0d 0a才能正常收发了
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-6-23
在线时间
4 小时
 楼主| 发表于 2017-6-26 15:54:16 | 显示全部楼层
混沌教授 发表于 2017-6-26 15:46
我用的是stc的下载软件的串口助手 这窝在51用的很多 是不会加换行符的 你说的方式我试下

虽然不能理解是什么问题 但还是谢谢
回复

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
发表于 2017-6-26 16:12:27 | 显示全部楼层
混沌教授 发表于 2017-6-26 15:54
虽然不能理解是什么问题 但还是谢谢

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

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-6-23
在线时间
4 小时
 楼主| 发表于 2017-6-26 16:17:52 | 显示全部楼层
lzq12 发表于 2017-6-26 16:12
不客气的,看了你的问题,我也觉得好难理解~~~但是作为程序猿,可以说经常遇见各种莫名其妙诡异得无 ...

这个我也想不通 我是看了原子哥的视频 然后就去尝试了一下 然后发现不论怎样都能收发 这是我很疑惑的 因为我在51写串口的时候 其实处理方面跟这个中断都是比较类似的 都是判断\r\n 的 所以就上来问一下了
回复

使用道具 举报

16

主题

216

帖子

1

精华

高级会员

Rank: 4

积分
970
金钱
970
注册时间
2016-11-24
在线时间
156 小时
发表于 2017-6-26 16:26:11 | 显示全部楼层
混沌教授 发表于 2017-6-26 16:17
这个我也想不通 我是看了原子哥的视频 然后就去尝试了一下 然后发现不论怎样都能收发 这是我很疑惑的 因 ...

这也许是个BUG,等着你纠正
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-6-23
在线时间
4 小时
 楼主| 发表于 2017-6-26 16:32:41 | 显示全部楼层
lzq12 发表于 2017-6-26 16:26
这也许是个BUG,等着你纠正

这怕是不行了 我刚接触stm32
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 14:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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