OpenEdv-开源电子网

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

ARM中断接收字节间时间间隔问题

[复制链接]

2

主题

10

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-3-9
在线时间
3 小时
发表于 2016-6-20 16:13:22 | 显示全部楼层 |阅读模式
使用USART_ReceiveData(USART1);
我想使用               
while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == 1)//软件读DR中的数据后自动清0  USART_FLAG_RXNE
                  {                        
                         uDelay(10);
                         if(ulCounter++ > RS485_TIMEOUT)
                         {
                                 bTimeout = 1;
                                 break;
                         }
                 }
这个语句来判断字节接收所需时间是否超时,但发现执行过程中根本没有进入这个等待判断语句。想请教下是什么原因,谢谢啦
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2016-6-20 16:26:11 | 显示全部楼层
你前面那个问题中我已经回答你了
回复 支持 反对

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11546
金钱
11546
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-6-20 16:35:04 | 显示全部楼层

不知道这段程序放在哪里,
也不知道几个变量的来龙去脉,
没法答。


回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-3-9
在线时间
3 小时
 楼主| 发表于 2016-6-20 16:40:43 | 显示全部楼层
xuande 发表于 2016-6-20 16:35
不知道这段程序放在哪里,
也不知道几个变量的来龙去脉,
没法答。

ulCounter只是个次数记录变量。
RS485—TIMEOUT是在外面定义的规定时间。
ulCounter*10us如果大于RS485—TIMEOUT就是超时了,字节接收时间过长,会在外面的程序里报错
整段程序意思就是这样
现在的问题是执行完USART_ReceiveData(USART1);没有进入while();
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-3-9
在线时间
3 小时
 楼主| 发表于 2016-6-20 16:41:50 | 显示全部楼层
步星辰 发表于 2016-6-20 16:40
ulCounter只是个次数记录变量。
RS485—TIMEOUT是在外面定义的规定时间。
ulCounter*10us如果大于RS485 ...

代ma放在了串口接收中断里面
回复 支持 反对

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-6-20 16:48:22 | 显示全部楼层
//软件读DR中的数据后自动清0  USART_FLAG_RXNE
这里你自己不是写了吗?软件读DR中数据后也就是执行USART_ReceiveData(USART1);后,标志位清零了,还怎么进while()
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-3-9
在线时间
3 小时
 楼主| 发表于 2016-6-20 16:50:45 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-6-20 16:48
//软件读DR中的数据后自动清0  USART_FLAG_RXNE
这里你自己不是写了吗?软件读DR中数据后也就是执行USART_ ...

等待读取字节结束有没有其他方法啊,发送的时候可以用这个while,接收的时候怎么用?
回复 支持 反对

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-6-20 17:27:13 | 显示全部楼层
步星辰 发表于 2016-6-20 16:50
等待读取字节结束有没有其他方法啊,发送的时候可以用这个while,接收的时候怎么用?

1、数据接收时有个移位寄存器,接收的数据是一位一位保存在这里的
2、当RXNE标志位置位时,数据已经从接收移位寄存器储存到数据寄存器中了
3、所以理论上,只要及时把数据寄存器中的数据读出来(也就是软件清零RXNE位),数据是不会丢失的
4、当RXNE为1时,接收移位寄存器中的数据是不能被储存到数据寄存器中的,若不及时清零RXNE位,而第二个数据接收到了,不能存到数据寄存器,就会导致数据丢失的情况
以上为个人理解,若有错误,请指正
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2016-3-9
在线时间
3 小时
 楼主| 发表于 2016-6-20 18:31:19 | 显示全部楼层
不吃鱼的老鼠 发表于 2016-6-20 17:27
1、数据接收时有个移位寄存器,接收的数据是一位一位保存在这里的
2、当RXNE标志位置位时,数据已经从接 ...

就是这样的。
只是为什么这里不能等待数据接收完毕呢?
在接收数据USART_ReceiveData(USART1);执行时,按理说应该可以等待接收。
就像发送时可以等待发送完毕一样。实践证明我的等待没起作用,没进去
回复 支持 反对

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-6-21 09:00:09 | 显示全部楼层
步星辰 发表于 2016-6-20 18:31
就是这样的。
只是为什么这里不能等待数据接收完毕呢?
在接收数据USART_ReceiveData(USART1);执行时, ...

RXNE标志置位的时候,数据已经接受完成了,没有等待接受这一说,只能说数据等待被读取,而你执行USART_ReceiveData(USART1)就是将数据从数据寄存器读取出来,清零RXNE,你好好看下手册
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 13:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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