OpenEdv-开源电子网

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

串口实验为什么USART_RX_STA=0接收数据错误,就可以重新开始接收

[复制链接]

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2016-4-17
在线时间
19 小时
发表于 2016-11-21 15:25:32 | 显示全部楼层 |阅读模式
5金钱
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
        {
                Res =USART_ReceiveData(USART1);//(USART1->DR);        //读取接收到的数据
                if((USART_RX_STA&0x8000)==0)//接收未完成
                {
                        if(USART_RX_STA&0x4000)//接收到了0x0d
                        {
                                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;//接收数据错误,重新开始接收          
                                }}}          
这个程序说:USART_RX_STA=0;//接收错误,重新开始        。
问题:我整个工程搜索了一下,和USART_RX_STA有关的程序段都没有与USART相关的操作,那么USART_RX_STA=0是怎么实现重新开始接收?求助

最佳答案

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

USART_RX_STA为0是首次上电时的默认值,此时表示没有接收到任何数据。具体细节,看USART_RX_STA每位的解释。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-11-21 15:25:33 | 显示全部楼层
USART_RX_STA为0是首次上电时的默认值,此时表示没有接收到任何数据。具体细节,看USART_RX_STA每位的解释。
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2016-4-17
在线时间
19 小时
 楼主| 发表于 2016-11-25 21:48:00 | 显示全部楼层
原子哥,“重新开始接收”指的是接收这次没有接收对重新接收这批数据,还是指这批数据不要了,接收下一批数据?
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2016-4-17
在线时间
19 小时
 楼主| 发表于 2016-11-25 21:48:49 | 显示全部楼层
正点原子 发表于 2016-11-21 15:25
USART_RX_STA为0是首次上电时的默认值,此时表示没有接收到任何数据。具体细节,看USART_RX_STA每位的解释 ...

原子哥,“重新开始接收”指的是接收这次没有接收对重新接收这批数据,还是指这批数据不要了,接收下一批数据?
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2016-4-17
在线时间
19 小时
 楼主| 发表于 2016-11-25 22:31:28 | 显示全部楼层
正点原子 发表于 2016-11-21 15:25
USART_RX_STA为0是首次上电时的默认值,此时表示没有接收到任何数据。具体细节,看USART_RX_STA每位的解释 ...

void USART1_IRQHandler(void)                        //串口1中断服务程序
{
    ……   
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
    //接收中断(接收到的数据必须是0x0d 0x0a结尾)
     ……       

}   
问题:原子哥:在串口1中断服务程序为啥不是用 USART_ClearITPendingBit(USART1,USART_IT_RXNE);这个函数清除USART_IT_RXNE标志呢?
回复

使用道具 举报

宫恩来 该用户已被删除
发表于 2016-11-25 22:48:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

42

主题

297

帖子

0

精华

高级会员

Rank: 4

积分
994
金钱
994
注册时间
2016-7-22
在线时间
318 小时
发表于 2016-11-26 08:55:39 | 显示全部楼层
骆行者 发表于 2016-11-25 22:31
void USART1_IRQHandler(void)                        //串口1中断服务程序
{
    ……   

读DR也可以清除标志的,效果是一样的
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2016-4-17
在线时间
19 小时
 楼主| 发表于 2016-11-26 17:27:03 | 显示全部楼层
宫恩来 发表于 2016-11-25 22:48
u16 USART_RX_STA;
USART_RX_STA 为16bit,
0000 0000 0000 0000

串口接收数据时包含0x0d 再以0x0d 0x0a结尾-STM32-F0/F1/F2专区-OpenEdv-开源电子网  http://www.openedv.com/posts/list/53847.htm
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
137
金钱
137
注册时间
2016-4-17
在线时间
19 小时
 楼主| 发表于 2016-11-27 09:22:48 | 显示全部楼层
hi我歌月徘徊 发表于 2016-11-26 08:55
读DR也可以清除标志的,效果是一样的

非常感谢您
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2017-8-6
在线时间
5 小时
发表于 2017-8-11 14:28:19 | 显示全部楼层
正点原子 发表于 2016-11-21 15:25
USART_RX_STA为0是首次上电时的默认值,此时表示没有接收到任何数据。具体细节,看USART_RX_STA每位的解释 ...

if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始,    这里说是重新开始,是重新开始下一次的接收,还是开始继续接收下一个字节?如果是重新开始下一次的接收,那么以接收的数据不要了吗?为什么不要了?不要了不就是没有正确接收到吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 05:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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