|
我在一份ATmega48/ATmega88/ATmega168的资料中看到:
以5 到8 个数据位的方式接收帧
unsigned char USART_Receive( void )
{
/* 等待接收数据*/
while ( !(UCSRnA & (1<<RXCn)) )
;
/* 从缓冲器中获取并返回数据*/
return UDRn;
}
以9 个数据位的方式接收帧
unsigned int USART_Receive( void )
{
unsigned char status, resh, resl;
/* 等待接收数据*/
while ( !(UCSRnA & (1<<RXCn)) )
;
/* 从缓冲器中获得状态、第9 位及数据*/
status = UCSRnA;
resh = UCSRnB;
resl = UDRn;
/* 如果出错,返回-1*/
if ( status & (1<<FEn)|(1<<DORn)|(1<<UPEn) )
return -1;
/* 过滤第9 位数据,然后返回*/
resh = (resh >> 1) & 0x01;
return ((resh << 8) | resl);
对比发现:
1、为什么接收5至8位的数据时不用读状态寄存器,(即没有status = UCSRnA;),这样怎么知道有没有错误?(即FE、DOR、UPE)
2、resl = UDRn;和return ((resh << 8) | resl); (UDR中只放要传输的数据吗,那原来一整帧数据中的起始位、停止位、校验位哪里去了?) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|