打印
[AVR单片机]

USART1发送双字节数据的问题

[复制链接]
1765|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lwking412|  楼主 | 2008-5-10 20:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
USART1发送双字节数据的问题 

书上例子如下 

void f_USART1TxWord(unsigned int c) 

{while(!(UCSR1A&(1<<UDRE1))); 

UDR1=(unsigned char)c; //问题1:为何要把整型c强制转换为char型再写入UDR呢? 

while(!(UCSR1A&(1<<TXC0))); 

UCSR1A|=1<<TXC1; 

UDR1=(unsigned char)(c>>8);//问题2 这个语句是做什么的,为何c>>8? 

while(!(UCSR1A&(1<<TXC0))); //问题3,while(!(UCSR1A&&(1<<TXC0))); UCSR1A|=1<<TXC1;为何出现两次,什么用意呢 

UCSR1A|=1<<TXC1; 

return; 



麻烦大家了,帮我看看 

相关帖子

沙发
lwking412|  楼主 | 2008-5-10 20:34 | 只看该作者

谢谢大家了

希望大家能教教我

使用特权

评论回复
板凳
宇宙飞船| | 2008-5-10 21:06 | 只看该作者

楼主真有造化,

void f_USART1TxWord(unsigned int c)

{while(!(UCSR1A&(1<<UDRE1)));//空闲可以发送吗?

UDR1=(unsigned char)c; //数据类型不同,防止编译器产生警告,最坏有可能不准编译通过。

while(!(UCSR1A&&(1<<TXC0)));//发送完成了吗?

UCSR1A|=1<<TXC1; //清发送完成标志位,准备作下一次发送。

UDR1=(unsigned char)(c>>8);//发送高8位。

while(!(UCSR1A&&(1<<TXC0))); //发送完成了吗?
UCSR1A|=1<<TXC1;//清发送完成标志位。
return;

使用特权

评论回复
地板
dai_weis| | 2008-5-10 21:12 | 只看该作者

我不知道你的程序来源于何处

USR支持单字节发送,所以双字节需要变成两个单字节数据后进行发送,至于变得方法则是通过移位和类型强制转换完成

使用特权

评论回复
5
宇宙飞船| | 2008-5-10 22:15 | 只看该作者

程式也有错的!看漏眼了,

while(!(UCSR1A&&(1<<TXC0)));//这是错的!逻辑与。
while(!(UCSR1A&(1<<TXC0))); //这才正确!位与。提取TXC位。

使用特权

评论回复
6
lwking412|  楼主 | 2008-5-10 23:45 | 只看该作者

不好意思,是我打错了

while(!(UCSR1A&&(1<<TXC0)) 
是我打错了,正确的是while(!(UCSR1A&(1<<TXC0))); 
我主要不明白,怎么会有int强制转char,该怎么转,能否举个例子给我,我只在书上看过char强制转为int

使用特权

评论回复
7
dai_weis| | 2008-5-11 00:03 | 只看该作者

两个字节的数据类型变成两个分别存储的单字节数据

也就是把数据拆分存储所以会有int强制转char
方法在4楼说过了,移位或者通过按位与求得数据,然后用强制转换得到
简单例子:(错了别打我PP就行)
unsigned int SoureData;
unsigned char TgDataH, TgDataL;
TgDataH = (unsigned char)((SoureData >> 8) & 0xFF);
TgDataL = (unsigned char)((SoureData & 0xFF);

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

32

帖子

0

粉丝