OpenEdv-开源电子网

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

有关USART发送方与接受方的困惑

[复制链接]

9

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
372
金钱
372
注册时间
2016-8-15
在线时间
55 小时
发表于 2016-11-7 17:57:40 | 显示全部楼层 |阅读模式
8金钱
我想问一下高手,在写那个USART通信程序的时候,STM32作为接收方接收程序嘛;
stm32通过串口与电脑相连,电脑每次不是发送一个8位的数据嘛,STM32接收到之后就寄放在DR寄存器中,并产生中断,那我们在中断程序实现从DR中获取数据;
但是到这里我不太懂了,我看程序里好似没有 向电脑发送应答信息告诉电脑数据已经处理完毕的相关语句,那电脑也就是发送方怎么知道STM32把数据从DR中取走了?
电脑肯定要收到应答后再发送下一个数据吧,不然如果我们这边DR里的数据一直放着不取,那DR不就一直被电脑发过来的数据更新了?

反过来,STM32作为发送方,向电脑发送的时候,我看程序也是没有判断应答什么的,到是有通过TC标志判断是否发送完成,发送完成也不代表那边就处理好数据了啊?
可能是我强迫症把 这个问题挺纠结的

最佳答案

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

发送方怎么知道STM32把数据从DR中取走了? 答:它确实不知道。如果一定要知道,必须由接收方告诉它,即给它发数据。 那DR不就一直被电脑发过来的数据更新了? 答:是这样,所以接收方有个标志位,大概叫“over run”,提醒你,上个数据没有取走,被后面数据覆盖了,找不回来了。
祝中国健儿奥运好成绩
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-11-7 17:57:41 | 显示全部楼层

发送方怎么知道STM32把数据从DR中取走了?   
答:它确实不知道。如果一定要知道,必须由接收方告诉它,即给它发数据。

那DR不就一直被电脑发过来的数据更新了?
答:是这样,所以接收方有个标志位,大概叫“over run”,提醒你,上个数据没有取走,被后面数据覆盖了,找不回来了。


回复

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-10-16
在线时间
7 小时
发表于 2016-11-7 19:48:09 | 显示全部楼层
应该是判断USART_RX_STA,我也不懂,凑个热闹
QQ.png
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-11-7 21:06:39 | 显示全部楼层

反过来,STM32作为发送方。。。。
答:情况是一样的。


回复

使用道具 举报

5

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2015-10-2
在线时间
5 小时
发表于 2016-11-7 21:36:18 | 显示全部楼层
这个不用应答,都以固定波特率互相通信,发送端发完就不管。
回复

使用道具 举报

28

主题

176

帖子

0

精华

高级会员

Rank: 4

积分
738
金钱
738
注册时间
2014-7-1
在线时间
180 小时
发表于 2016-11-8 08:21:40 | 显示全部楼层
对,串口通信不是一问一答的模式,只要发送成功或接收成功就行,对方怎么处理是对方的事
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2016-11-8 08:26:51 | 显示全部楼层
串口也叫异步通讯接口,所以是跑默认的协议,发的只管发,接的只管接!
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

10

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1479
金钱
1479
注册时间
2016-1-25
在线时间
260 小时
发表于 2016-11-8 08:38:58 | 显示全部楼层
其实很多做数据通信的话 都会有制定自己的通信协议,什么开头什么结束,这样没有用的数据就不会被存起来而是直接丢弃。你好好理解下原子哥的串口通信例程。里面都已经讲的很详细。然后动手改一改  这样你就能深刻理解了
回复

使用道具 举报

9

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
372
金钱
372
注册时间
2016-8-15
在线时间
55 小时
 楼主| 发表于 2016-11-8 17:44:18 | 显示全部楼层
xuande 发表于 2016-11-7 17:57
发送方怎么知道STM32把数据从DR中取走了?   
答:它确实不知道。如果一定要知道,必须由接收方告诉它, ...

嗯嗯   但是关键的一个地方我还是不太明白,数据是一帧一帧地发嘛, 那帧与帧之间有时间间隔嘛,就是说他发完一帧后等待多久之后就发送下一帧,  我们写程序接收数据是在中断里面嘛

假设一帧的数据来了dr被充满,产生中断,中断程序就接收,那这时如果中断程序较长或有个久一点的延时,而发送方那边是以自己的速度发送嘛,他的速度比较快,我们这一帧的数据刚刚接收完,还没退出中断函数,发送方那边啪啪啪又几个帧过来,不是就丢失了嘛。

这么说的话我们有丢失帧的风险,所以中断程序要写短些?不过要多短呢?在什么时间内呢?这个时间要看发送方那边嘛。。
你看我想得对不对,我会不会想太细致了
祝中国健儿奥运好成绩
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-11-8 19:51:37 | 显示全部楼层
mjwang 发表于 2016-11-8 17:44
嗯嗯   但是关键的一个地方我还是不太明白,数据是一帧一帧地发嘛, 那帧与帧之间有时间间隔嘛,就是说他 ...


除了“帧”字有些地方说得不合适,你想得都对。

1、等多久问题,实际就是帧之间空白的时间长度。
印象里,空白期只要超过传输一个字节所需要的时间,机器就认为是“空闲IDLE”,就会产生空闲中断。

2、这样确实会丢失数据,所以必须尽快取走数据。

3、不论什么中断,中断程序都必须尽可能短。
多短算短呢?以不影响下次中断为准则(这有点像废话)。

回复

使用道具 举报

9

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
372
金钱
372
注册时间
2016-8-15
在线时间
55 小时
 楼主| 发表于 2016-11-8 21:06:23 | 显示全部楼层
xuande 发表于 2016-11-8 19:51
除了“帧”字有些地方说得不合适,你想得都对。

1、等多久问题,实际就是帧之间空白的时间长度。

嗯嗯 帧是网络里的说法我本来想换个词的  词穷
就是一组8位的数据嘛 哈哈
祝中国健儿奥运好成绩
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 02:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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