这个例子不懂的地方有两个 1.关于return -1代表什么意思啊,是不返回的意思么 2.resh=(resh>>1)&0x01; Return ((resh<<8)|resl);是什么意思啊 既然resh=UCSRB,那么resh>>1就是把UCSRB的位1 RXB位右移1位,这样RXB位的数值就移动到了第0位上,在于0x01相&代表什么呢?这样一来,resh的值只有两种情况00000001或者00000000.不明白这样有什么用
1.程序注释已说明白,如果接收错误的话,返回-1; 2. resh=(resh>>1)&0x01; /* //获取有效数据的第9位,注意前面接收的时候是resh=UCSRB; //而实际有效位RXB8在UCSRB寄存器的第2位(从1算起) //所以取有效数据需要把第一位移走(右移1位),然后把其他无用数据清除 //即移完后再&0x01; */ Return ((resh<<8)|resl);//将接收到的9位数据合并成一个整形数据返回
3.题外话:飞船没必要揪住什么稻草不放,结果这只是数据手册上提供的例程而已,并非出自马潮之手(取来用之)。至于程序的致命之处,鄙人确实没发现有什么不对劲的地方,说不定也有可能只是你自以为是呢 (正如
宇宙飞船 发表于 2008-5-10 21:58 AVR 单片机 ←返回版面
3楼: 的确有错,resh应定义成16位unsigned int resh
unsigned int USART_Receive(void) {unsigned char status,resh,resl;//才8位定义。 。。。。 Return ((resh<<8)|resl);//resh 原定义是8位,resh左移后变成0了,真垃圾! }
) 呵呵。技术讨论,最好对事不对人,以和为贵,互通有无。
|