打印
[AVR单片机]

**中VC里面编写这样的 程序就会出错

[复制链接]
5557|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ATmega32L|  楼主 | 2008-5-13 12:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这里首先假设unsigned char是8位
unsigned char resh;

如果int是16位,那么
resh<<8是16位,

如果int是32位,那么
resh<<8是32位.

相关帖子

沙发
HWM| | 2008-5-13 13:12 | 只看该作者

若没有“承接变量”所谓16位和32位没啥意义。

使用特权

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

楼主是欺负俺们不懂C吧?呵呵,


使用特权

评论回复
地板
ATmega32L|  楼主 | 2008-5-13 13:33 | 只看该作者

理解C语言类型提升,才能写出更准确的代码.

理解C语言类型提升,才能写出更准确的代码.
这个程序并没有问题.

unsigned int USART_Receive(void)  
{
     unsigned char status,resh,resl;   
     while (!(UCSRA&(1<<RXC)));  
     status=UCSRA;  
     resh=UCSRB;  
     resl=UDR;  
     if(status&(1<<FE)|(1<<DOR)|(1<<PE)) 
          return -1;  
     resh=(resh>>1)&0x01;  
     return ((resh<<8)|resl);  
}  

使用特权

评论回复
5
t.jm| | 2008-5-13 14:09 | 只看该作者

是没问题,

我想老马也不至于骗人吧,所以我特地写了个测试程序!
但是为安全起见还是强制转换好些.

使用特权

评论回复
6
宇宙飞船| | 2008-5-13 14:44 | 只看该作者

楼主别教坏俺,char 符形一直都是8位的,

别维护老马了,他写的那个例程的确很垃圾!
void  main(void)
{
  unsigned char buf;
  buf=1234 ;//0x4D2 
}

//执行结果 buf = D2 ;

使用特权

评论回复
7
宇宙飞船| | 2008-5-13 14:57 | 只看该作者

老马有可能是教书的,只会纸上谈兵!

老马对硬件的不了解可见一斑!
 resl=UDR;  
 if(status&(1<<FE)|(1<<DOR)|(1<<PE))
 return -1;  

使用特权

评论回复
8
音乐乐乐| | 2008-5-13 15:04 | 只看该作者

**中VC里面编写这样的 程序就会出错

 一个8位左移8位就没了。

使用特权

评论回复
9
t.jm| | 2008-5-13 15:10 | 只看该作者

飞船很顽固,一点反省都没有!

void  main(void)
{
    unsigned int iBuf;
    unsigned char cBufH,cBufL;
    
    cBufH = 0x12;
    cBufL = 0x34;
    iBuf = (cBufH<<8) | cBufL; //iBuf=0x1234;
}

使用特权

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

呵呵!

t.jm 发表于 2008-5-13 15:10 AVR 单片机  ←返回版面  按此察看该网友的资料 按此把**加入收藏夹 按此编辑本帖

9楼: 飞船很顽固,一点反省都没有!

void  main(void)
{
    unsigned int iBuf;         //为啥不定义成char ??????
    unsigned char cBufH,cBufL;
    
    cBufH = 0x12;
    cBufL = 0x34;
    iBuf = (cBufH<<8) | cBufL; //iBuf=0x1234; //这当然正确!
}

使用特权

评论回复
11
t.jm| | 2008-5-13 15:37 | 只看该作者

既然大家都知道,那不就结案了!

unsigned int USART_Receive(void);
因为这个函数的返回值是unsigned int.
所以return ((resh<<8)|resl);  是没错的,

当然我也明白这样是不安全的,不符合代码规范,只是用来告诉初学者个种原由.

使用特权

评论回复
12
| | 2008-5-13 16:14 | 只看该作者

看热闹.....

使用特权

评论回复
13
kanprin| | 2008-5-13 17:54 | 只看该作者

11楼正解

呵呵,为啥飞船能理解10楼的情况正确而不能消化返回int也一样呢?

使用特权

评论回复
14
zhousd| | 2008-5-13 18:08 | 只看该作者

还以为楼主有啥新发现!能读懂linux内核再在这扯吧!

使用特权

评论回复
15
gooog| | 2008-5-13 18:12 | 只看该作者

同意4楼

这个程序没有问题,我在turbo c上验证了。


飞船太绝对了。

使用特权

评论回复
16
zhousd| | 2008-5-13 18:18 | 只看该作者

看来AVR坛子没啥高手!连俺都看出来了。

使用特权

评论回复
17
t.jm| | 2008-5-13 19:25 | 只看该作者

飞船,我发现原来

那不是老妈马的错,那段代码出至DATASHEET的142,少两个括号,老马也是照操,我还以为是LZ的错。你也别沾沾自喜啊,这个错连编译器都有提示!

使用特权

评论回复
18
HWM| | 2008-5-13 19:56 | 只看该作者

争个啥

没看懂这句话吗?——若没有“承接变量”所谓16位和32位没啥意义

单看resh<<8有意义吗?

16或32位处理机的中间结果(寄存器)就是16或32位,这和它的指令系统有关,和C标准无关。

使用特权

评论回复
19
simon21ic| | 2008-5-14 00:43 | 只看该作者

最后的return部分应该没问题

不过我都是加上强制类型转换

但既然函数返回类型为unsigned int,那么为什么要return -1?
当然,可能只是多一些编译器的警告而已。但偶是不会写这种代码的

使用特权

评论回复
20
hotpower| | 2008-5-14 01:41 | 只看该作者

学习了...

使用特权

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

本版积分规则

144

主题

376

帖子

0

粉丝