OpenEdv-开源电子网

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

STM32串口如何得知正在接受数据?

[复制链接]

8

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2018-12-21
在线时间
126 小时
发表于 2020-12-8 18:47:57 | 显示全部楼层 |阅读模式
100金钱
STM32的串口有发送完成标志位,在一连串数据经过DMA发送时候可以通过TC得知所有数据都被送出去了。但是接收数据时只有缓冲区非空这个标志位指示DR内的数据有效。但是无法得知串口除了当前接受完的数据是否仍在接受一个新的数据。

那么有什么办法可以判断串口是否仍在接受新的数据呢?

最佳答案

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

一个环形BUF,搞定.管它有没有在接收.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

141

帖子

0

精华

高级会员

Rank: 4

积分
679
金钱
679
注册时间
2020-11-21
在线时间
67 小时
发表于 2020-12-9 11:36:47 | 显示全部楼层
通过波特率计算出接收一个字节需要的时间time,然后按照这个时间定时去比较接收到数据数量是否有变化。如果时间大于time时,接收到的数据数据没变化就说明发送数据结束,如果数据数量比上一次的数量大,就说明正在接收数据。如果想任意时刻都知道是否有数据传输是不可能实现的,假如前一个字节结束的一瞬间,你就要知道是否还有数据传输,这种就无法判断。只有超过正常传输时间之后,没有新的信号进来,才能认为此时传输已经结束。
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2020-12-9 16:56:19 | 显示全部楼层
1、首先这个无法知道;串口是异步通信(同步通信也许还可以判断时钟信号),只能知道当前时刻没有数据进来,下一时刻有没数据进来,没人知道(额,这个是哲学问题吧,就像你不知道还会不会有人看到这帖子、回复这帖子一样);
2、其次没必要知道,知道这个也没用;CPU能做的都是,不管你什么时候来数据,我都能接收到并处理;所以串口要用中断、或者DMA接收,用查询接收就可能丢失数据;
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2020-12-8 18:47:58 | 显示全部楼层
一个环形BUF,搞定.管它有没有在接收.
回复

使用道具 举报

11

主题

2154

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4951
金钱
4951
注册时间
2015-1-10
在线时间
620 小时
发表于 2020-12-9 08:27:30 | 显示全部楼层
空闲中断
回复

使用道具 举报

8

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2018-12-21
在线时间
126 小时
 楼主| 发表于 2020-12-9 11:24:11 | 显示全部楼层

不行,空闲中断只能指示一段数据接受完成后总线恢复空闲的那一瞬间。不能判断在任意时刻是否有数据正在传输。
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2020-12-9 13:04:25 | 显示全部楼层
H7 有Busy标志位
回复

使用道具 举报

11

主题

2154

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4951
金钱
4951
注册时间
2015-1-10
在线时间
620 小时
发表于 2020-12-9 14:21:04 | 显示全部楼层
0x00000000 发表于 2020-12-9 11:24
不行,空闲中断只能指示一段数据接受完成后总线恢复空闲的那一瞬间。不能判断在任意时刻是否有数据正在传 ...

不清楚你要判断串口是否正在接收下一个数据是用来干嘛,在没接收到完整字节前DR里面是没有数据的,就算正在接收下一个数据对你的程序有什么影响呢
回复

使用道具 举报

8

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2018-12-21
在线时间
126 小时
 楼主| 发表于 2020-12-9 18:27:00 | 显示全部楼层
操作系统 发表于 2020-12-9 14:23
一个环形BUF,搞定.管它有没有在接收.

这个好像可行。
不过环形缓冲机制对数据获取带来一定困难,因为到达底部后,还需要再判断剩余数据,再跳回到头部处理。好处就是使用DMA接受一次后无需再重新配置再接受下一次。
我这里有一个外设,可能有时候频繁发送数据,有时候只发送一串。为了准确判断数据传输停止的时隙重新刷新DMA的配置,所以需要判断当前是否开始传输,防止刷新配置时候丢失数据。
回复

使用道具 举报

8

主题

154

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
439
金钱
439
注册时间
2018-12-21
在线时间
126 小时
 楼主| 发表于 2020-12-9 18:30:42 | 显示全部楼层
Acuity 发表于 2020-12-9 16:56
1、首先这个无法知道;串口是异步通信(同步通信也许还可以判断时钟信号),只能知道当前时刻没有数据进来 ...

因为我用了DMA接收,所以需要判定当前是否又出现了数据流,防止刷新DMA配置的时候丢失数据,因为数据流来的时候是随机的,无法控制的。而这里我DMA设置成了地址顺序递增的方式,不是环形缓冲方式。所以最好是每接收一段数据就刷新一次DMA,让指针回头,防止溢出。
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2020-12-10 09:01:19 | 显示全部楼层
0x00000000 发表于 2020-12-9 18:30
因为我用了DMA接收,所以需要判定当前是否又出现了数据流,防止刷新DMA配置的时候丢失数据,因为数据流来 ...

DMA接收不需知道这个。DMA接收设为“连续模式”,通过串口空闲中断、DMA 接收buf半满中断、DMA 接收buf溢满中断(如果是ST高系列,可以用双buf),三个中断处理数据,即可保证数据不丢。参考F0/F1实现:
实现:https://acuity.blog.csdn.net/article/details/108367512
源码:https://github.com/Prry/stm32-uart-dma
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2020-12-10 09:12:15 | 显示全部楼层
0x00000000 发表于 2020-12-9 18:27
这个好像可行。
不过环形缓冲机制对数据获取带来一定困难,因为到达底部后,还需要再判断剩余数据,再跳 ...

DMA接收模式,必须设为“连续模式”;如果每次都重新配置DMA,此时刚好有数据进来,数据就没法被接收到了。
回复

使用道具 举报

18

主题

151

帖子

0

精华

高级会员

Rank: 4

积分
508
金钱
508
注册时间
2020-4-22
在线时间
241 小时
发表于 2020-12-10 15:58:51 | 显示全部楼层
帮顶一下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 20:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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