最近正在学习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;
}
/*测试:循环发送26个英文字母*/
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))); 这条语句无法跳出,永久的死循环在这里了。
但是反复谷歌、百度,学习,观察,这条语句是一条简单且基本的语句,本身也是官方文档及多数教程中采用的,所以就想不明白了,向各位请教。
谢谢。
另外:
1. 串口tx和rx短接后串口工具收发正常。
2. 用示波器接在单片机的RX脚上可观察到接收的方波。
|