OpenEdv-开源电子网

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

求助

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-6-21
在线时间
2 小时
发表于 2017-6-21 10:51:47 | 显示全部楼层 |阅读模式
1金钱
正点原子,RS485通信那一章,while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);        USART_SendData(USART1,buf[t]);这两句是不是应该交换一下顺序,不然就变成了先等待发送成功,再开始发送数据?哪位大侠可以解释下,谢谢了
1.jpg

最佳答案

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

你坐车总要看下车是不是满员,满员了你还上就出事故了。你说这样不应该用,那请你说下为什么不应该用这句。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2017-6-21 10:51:48 | 显示全部楼层
你坐车总要看下车是不是满员,满员了你还上就出事故了。你说这样不应该用,那请你说下为什么不应该用这句。
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3773
金钱
3773
注册时间
2015-4-26
在线时间
765 小时
发表于 2017-6-21 11:09:14 | 显示全部楼层
这是本次与上次对比, 你说的是本次 与本次对比。每次发送都调用这个函数不会有问题,如果上一次你没调用这个函数 直接操作的寄存器发送,紧接着调用这个函数。 原子的不会有问题,你改的会出现问题
我有故事,你有酒吗
回复

使用道具 举报

21

主题

146

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
467
金钱
467
注册时间
2013-7-12
在线时间
86 小时
发表于 2017-6-21 11:49:40 | 显示全部楼层
先要确保发送缓冲区是否有数据,图片中的程序交替发送和等待过程本没有问题,for循环结束后,不是又加了一个等待了吗。还有一个现象就是你把for循环后结束的这个等待删除,232没什么问题,485会由于没有发送完就改为接受模式,因而通过485硬件电路后收不到最后一个数据。
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-6-21
在线时间
2 小时
 楼主| 发表于 2017-6-21 13:45:36 | 显示全部楼层
本帖最后由 wgz 于 2017-6-21 14:11 编辑


谢谢,还是有点疑问,那如果是第一次进入循环,也就是t=0的时候呢,进入循环就要等发送完成了吗?
回复

使用道具 举报

21

主题

146

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
467
金钱
467
注册时间
2013-7-12
在线时间
86 小时
发表于 2017-6-21 14:11:57 | 显示全部楼层
wgz 发表于 2017-6-21 13:45
谢谢,还是有点疑问,那如果是第一次进入循环,也就是i=0的时候呢,进入循环就要等发送完成了吗?

只是看发送缓冲器是不是空了的吧。
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-6-21
在线时间
2 小时
 楼主| 发表于 2017-6-21 14:38:15 | 显示全部楼层
SR_LI 发表于 2017-6-21 14:11
只是看发送缓冲器是不是空了的吧。

谢谢,这样一说就懂了,可这样不应该用while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);吗 ?
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-6-21
在线时间
2 小时
 楼主| 发表于 2017-6-21 14:41:12 | 显示全部楼层
wgz 发表于 2017-6-21 14:38
谢谢,这样一说就懂了,可这样不应该用while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);吗 ...

USART_FLAG_CTS CTS 标志位
USART_FLAG_LBD LIN 中断检测标志位
USART_FLAG_TXE 发送数据寄存器空标志位
USART_FLAG_TC 发送完成标志位
USART_FLAG_RXNE 接收数据寄存器非空标志位
USART_FLAG_IDLE 空闲总线标志位
USART_FLAG_ORE 溢出错误标志位
USART_FLAG_NE 噪声错误标志位
USART_FLAG_FE 帧错误标志位
USART_FLAG_PE 奇偶错误标志位
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-6-21
在线时间
2 小时
 楼主| 发表于 2017-6-21 14:48:50 | 显示全部楼层
hgr211 发表于 2017-6-21 14:45
你坐车总要看下车是不是满员,满员了你还上就出事故了。你说这样不应该用,那请你说下为什么不应该用这句。

懂了  ,太感谢了
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-6-21
在线时间
2 小时
 楼主| 发表于 2017-6-21 15:00:20 | 显示全部楼层
wgz 发表于 2017-6-21 14:48
懂了  ,太感谢了

我看了下STM32的参考手册,USART状态寄存器的TC位默认情况下是置1的,也就是如果第一次发送数据,就相当于上一次已经完成了发送  谢谢你的耐心回复
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-17 21:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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