OpenEdv-开源电子网

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

usart2 send 顺序写反了吧

[复制链接]

58

主题

139

帖子

0

精华

高级会员

Rank: 4

积分
662
金钱
662
注册时间
2014-10-30
在线时间
81 小时
发表于 2016-6-19 09:43:23 | 显示全部楼层 |阅读模式
1金钱
usart2  send  顺序写反了吧   (t=0;t<len;t++)                //循环发送数据

        {                  
                while(USART_GetFlagforStatus(USART2, USART_FLAG_TC) == RESET);          
                USART_SendData(USART2,buf[t]);
        }               
应该是写send  然后再判断 吧   
convert12.png

最佳答案

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

从逻辑上来看先判断发送完成标志再发送新的数据才是合理的 从程序上来看如果前一次已经发送完了,那么新的数据接着送到发送寄存器,哪怕还没发送完毕也可以干其他事情,没必要在原地死等,CPU利用率会更高
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

711

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
12544
金钱
12544
注册时间
2015-11-5
在线时间
2147 小时
发表于 2016-6-19 09:43:24 | 显示全部楼层
本帖最后由 FreeRTOS 于 2016-6-20 12:14 编辑
妙手书生 发表于 2016-6-19 15:07
这样才对吧,主要是第一次还没发就判断是否发送成功,不对吧, 应该是第一次发送然后在检查,在发送再 … ...

从逻辑上来看先判断发送完成标志再发送新的数据才是合理的

从程序上来看如果前一次已经发送完了,那么新的数据接着送到发送寄存器,哪怕还没发送完毕也可以干其他事情,没必要在原地死等,CPU利用率会更高
拿来长岛冰茶换我半晚安睡
回复

使用道具 举报

13

主题

448

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1755
金钱
1755
注册时间
2015-2-7
在线时间
369 小时
发表于 2016-6-19 10:08:49 | 显示全部楼层
没反,当然是先读取发送完成的状态才能发送数据咯。
回复

使用道具 举报

3

主题

794

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
1502
金钱
1502
注册时间
2015-3-3
在线时间
460 小时
发表于 2016-6-19 10:11:43 | 显示全部楼层
先判断前一次是否发送完成后,再发送下一次的数据
否则前一次的数据就有可能部分丢失
回复

使用道具 举报

58

主题

139

帖子

0

精华

高级会员

Rank: 4

积分
662
金钱
662
注册时间
2014-10-30
在线时间
81 小时
 楼主| 发表于 2016-6-19 15:06:28 | 显示全部楼层
电子之旅 发表于 2016-6-19 10:08
没反,当然是先读取发送完成的状态才能发送数据咯。

这样才对吧,主要是第一次还没发就判断是否发送成功,不对吧, 应该是第一次发送然后在检查,在发送再 ……
send.png
回复

使用道具 举报

58

主题

139

帖子

0

精华

高级会员

Rank: 4

积分
662
金钱
662
注册时间
2014-10-30
在线时间
81 小时
 楼主| 发表于 2016-6-19 15:07:56 | 显示全部楼层
hpeng1874 发表于 2016-6-19 10:11
先判断前一次是否发送完成后,再发送下一次的数据
否则前一次的数据就有可能部分丢失

这样才对吧,主要是第一次还没发就判断是否发送成功,不对吧, 应该是第一次发送然后在检查,在发送再 ……
send.png
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2016-6-19 17:46:04 | 显示全部楼层
你keil的颜色怎么设置的,贴上来看看呗。
我有故事,你有酒吗
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-6-20 12:21:30 | 显示全部楼层
看你自己的代码呗,如果全部的发送都是调用这个函数的话,哪个在前哪个在后无所谓,如果不是的还,还是先判断为好
回复

使用道具 举报

58

主题

139

帖子

0

精华

高级会员

Rank: 4

积分
662
金钱
662
注册时间
2014-10-30
在线时间
81 小时
 楼主| 发表于 2016-6-20 12:37:49 | 显示全部楼层
FreeRTOS 发表于 2016-6-20 12:13
从逻辑上来看先判断发送完成标志再发送新的数据才是合理的

从程序上来看如果前一次已经发送完了,那么 ...

那如果没发送过,第一次发送前就先判断发送是否结束,这样的话,while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET); 就一直处于死循环了吧,因为你之前就没发送过啊

回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-6-20 12:45:24 | 显示全部楼层
你去调试看看串口的寄存器的值,这一位在你初始化串口后,他就一直是置1的,直到你往发送寄存器写数据
回复

使用道具 举报

58

主题

139

帖子

0

精华

高级会员

Rank: 4

积分
662
金钱
662
注册时间
2014-10-30
在线时间
81 小时
 楼主| 发表于 2016-6-20 12:51:15 | 显示全部楼层
憨厚诚实大叔 发表于 2016-6-20 12:45
你去调试看看串口的寄存器的值,这一位在你初始化串口后,他就一直是置1的,直到你往发送寄存器写数据

好吧 还是谢谢你了
回复

使用道具 举报

8

主题

571

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2919
金钱
2919
注册时间
2016-5-13
在线时间
185 小时
发表于 2016-6-20 20:11:54 | 显示全部楼层
没反。
应该是先判断发送完成标志再发送新的数据才是合理的。
你或许会问为什么呢。因为之前可能调用别的函数进行发送数据哦,比如:printf。
这样做是为了:无论之前调用的是什么函数发送的数据都不会相互影响。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

58

主题

139

帖子

0

精华

高级会员

Rank: 4

积分
662
金钱
662
注册时间
2014-10-30
在线时间
81 小时
 楼主| 发表于 2016-6-21 11:38:57 | 显示全部楼层
电脑小白 发表于 2016-6-20 20:11
没反。
应该是先判断发送完成标志再发送新的数据才是合理的。
你或许会问为什么呢。因为之前可能调用别的 ...

hao  thanks
回复

使用道具 举报

8

主题

571

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2919
金钱
2919
注册时间
2016-5-13
在线时间
185 小时
发表于 2016-6-22 11:55:02 | 显示全部楼层

结贴吧。
虽然不明白你们在说什么,但感觉很厉害的样子。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 10:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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