新手请教问题:AVR,mega16a串口无法接收数据
本帖最后由 poren 于 2013-5-15 16:56 编辑正在学习AVR,这两天调试串口的基本用法。但是一个最简单的串口都无法搞定,很郁闷。向各位高手请教。
代码如下:#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define F_CPU 11.0592
/*串口初始化,波特率9600,外部晶振11.0592*/
void usart_init(void)
{
UCSRB = 0x00;
UCSRA = 0x00;
UCSRC = (1<<URSEL)|0x06;
UBRRL = 71%256;
UBRRH = 0x00;
UCSRB = (1<<RXEN)|(1<<TXEN);
}
/*数据发送,查询方式*/
void usart_transmit(unsigned char data)
{
while (!(UCSRA & (1<<UDRE))); /* 等待发送缓冲器为空*/
UDR = data; /* 发送数据*/
}
/*数据接收,查询方式*/
unsigned char usart_receive( void )
{
volatile unsigned char data;
/* 等待接收数据*/
while ( !(UCSRA & (1<<RXC)));
/* 从缓冲器中获取并返回数据*/
data=UDR;
return data;
}
void test_transmit()
{
unsigned char i;
unsigned char temp = 'a';
temp = 'a';
for (i = 0; i < 26;i++)//循环发放26个英文字母
{
usart_transmit(temp);
temp++;
_delay_ms(8);
}
usart_transmit('-');
_delay_ms(8);
usart_transmit('-');
_delay_ms(8);
usart_transmit('-');
_delay_ms(8);
usart_transmit('-');
_delay_ms(8);
usart_transmit('-');
_delay_ms(8);
}
/*主函数*/
void main(void)
{
volatile unsigned char backdata;
cli();
usart_init();
test_transmit();
while (1)
{
//接收函数无论怎么样,均无法调通。2013.05.14
backdata = usart_receive(); /*等待接收数据*/
usart_transmit(backdata); /*发送收到的数据*/
}
}如上代码。发送的过程非常正常,尝试循环大量发送,通过PC的串口软件接收观察都很正常。
但是,通过PC的串口软件发送无论如何怎么发送都无法收到。
然后通过仿真器设置断点观察,当在函数的 while ( !(UCSRA & (1<<RXC))); 这条语句无法跳出,永久的死循环在这里了。
但是反复谷歌、百度,学习,观察,这条语句是一条简单且基本的语句,本身也是官方文档及多数教程中采用的,所以就想不明白了,向各位请教。
谢谢。 自己顶一下。
串口tx和rx短接后串口工具收发正常。 奇怪。这里人气挺足的,为什么没有人帮帮忙呢? 帮你顶一下
郁闷,我的attiny2313a才串口也调试不出来,搞不懂什么原因
http://www.amobbs.com/thread-5537186-1-1.html
页:
[1]