搜索
bottom↓
回复: 21

为什么while(!(UCSRA & (1<<UDRE)));这样就可以等待发送缓冲器清

[复制链接]

出0入0汤圆

发表于 2008-4-8 12:34:04 | 显示全部楼层 |阅读模式
为什么while(!(UCSRA & (1<<UDRE)));这样就可以等待发送缓冲器清空

出0入0汤圆

发表于 2008-4-8 12:39:39 | 显示全部楼层
你知道1<<A的意思吗?B&A呢?最后!C

出0入0汤圆

发表于 2008-4-8 12:53:28 | 显示全部楼层
bit=2
Byte;

1<<bit==>0b0000 0100;
byte & (1<bit)=>如果Byte第bit位为0,则结果为0;如果Byte第bit位为1,则不为零。
while等C中逻辑判断,非0为真,0为假。
while(!(Byte & (1<<bit)));byte第bit位为0这,算式结果为0,求反为真,while循环;反之算式结果为假,退出循环。
-------------
请回去看书。谢谢

出0入0汤圆

发表于 2008-4-8 23:11:18 | 显示全部楼层
lz手边连本C的书都没有?

出0入0汤圆

发表于 2008-7-4 18:45:08 | 显示全部楼层
马老师你的书上说,只有再UCSRA寄存器中的UDRE位置1时(数据寄存器空),UDR才能被写入;否则写入的数据将被USART忽略。
可是按照  
while(!(Byte & (1<<bit)));byte第bit位为0这,算式结果为0,求反为真,while循环;反之算式结果为假,退出循环。

好像是当UCSRA中的UDRE为0时
才执行UDR=data;
我是菜鸟,错了不要见笑。

出0入0汤圆

发表于 2008-7-4 20:32:04 | 显示全部楼层
在这个程序里面,UDRE怎么可能为0?

出0入0汤圆

发表于 2008-7-4 20:33:41 | 显示全部楼层
此一时,彼一时。此时非彼时。

出0入0汤圆

发表于 2008-7-4 21:12:34 | 显示全部楼层
楼上的 麻烦你说明白一点
别故弄玄虚
谢谢

出0入0汤圆

发表于 2008-7-4 22:27:50 | 显示全部楼层
有仔细想了一下,好像是明白了。
当UDR中的字符没有被传送到发送移位寄存器时,即USART不空时。
UDRE一直是0
所以
while(!(UCSRA & (1<<UDRE)))

URD=data;
会一直循环,但是由于UDRE不为1,data写不到URD中,被USART忽略。

就这样一直循环着,突然原来的UDR中的数据被转移到发送移位寄存器中了,于是
UDRE被置1,这时虽然下一次循环不再执行了,但是
上一次的循环已经把data送给了URD。

不知道这样理解是否正确?

但要是UDRE被置1发生在
data被USART忽略和下一次
while(!(UCSRA & (1<<UDRE)));
之间怎么办?
有这种可能吗?
我是新手,错了请见谅。

出0入0汤圆

发表于 2008-7-4 22:29:52 | 显示全部楼层
#define UDRE 5
所以,在这个程序里面,UDRE就是5.

出0入0汤圆

发表于 2008-7-4 22:38:45 | 显示全部楼层
UDR=data没有用{ },所以while(!(UCSRA & (1<<UDRE)));除了判断,什么事情也不做,退出循环才会执行UDR=data的。这样就不会发生“UDRE被置1发生在
data被USART忽略和下一次
while(!(UCSRA & (1<<UDRE)));
之间”

出0入0汤圆

发表于 2008-7-4 22:58:53 | 显示全部楼层
李宗盛有首歌叫《最近比较烦》,里面有句歌词,大意是:梦见和(敏感词0438)共进晚餐,但是遍寻不到蓝色的小药丸。因为只有找到了那个蓝色的小药丸,才能.......到梦醒也没有找到,结果UDR=data也没有发生。所以就比较烦。

出0入0汤圆

发表于 2008-7-5 01:08:30 | 显示全部楼层
为什么while(!(UCSRA & (1<<UDRE)));这样就可以等待发送缓冲器清空

(UCSRA & (1<<UDRE))实际上就是读取USCRA寄存器中UDRE位的值。

UDRE位置1时,数据寄存器空,退出WHILE循环
UDRE位为0时,数据寄存器不空,循环等待。

关键是理解(UCSRA & (1<<UDRE)),这是C,C的基础不扎实玩不好AVR的。

出0入0汤圆

发表于 2008-7-5 01:16:41 | 显示全部楼层
不是理解(UCSRA & (1<<UDRE))的问题,是理解while和if的问题。他把while和if混淆了。

出0入0汤圆

发表于 2008-7-5 14:32:19 | 显示全部楼层
那还是C的基础问题。

出0入0汤圆

发表于 2008-7-5 19:03:27 | 显示全部楼层
多谢指教
没看清while后面直接跟了个‘;’
C语言好几年没看了,看来还要抽时间复习一下

出0入0汤圆

发表于 2009-10-30 16:35:11 | 显示全部楼层
我也不明白,快,高手指点啊!

出0入0汤圆

发表于 2009-10-30 16:52:17 | 显示全部楼层
我明白了!!!!!

出0入0汤圆

发表于 2009-11-1 13:55:51 | 显示全部楼层
这几天又把马老师的书看了一遍,每看一遍都有新的收获。

出0入0汤圆

发表于 2010-7-11 11:31:18 | 显示全部楼层
好贴,我也明白了,对俺这样的菜鸟很有帮助

出0入0汤圆

发表于 2010-7-29 11:41:11 | 显示全部楼层
-----------------------------------------------------------------------

回复【19楼】rayingpx  
这几天又把马老师的书看了一遍,每看一遍都有新的收获。
-----------------------------------------------------------------------

  几天就能看一遍  高手  佩服
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 12:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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