poren 发表于 2013-5-15 15:26:50

新手请教问题: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))); 这条语句无法跳出,永久的死循环在这里了。
但是反复谷歌、百度,学习,观察,这条语句是一条简单且基本的语句,本身也是官方文档及多数教程中采用的,所以就想不明白了,向各位请教。
谢谢。

poren 发表于 2013-5-15 19:21:59

自己顶一下。
串口tx和rx短接后串口工具收发正常。

poren 发表于 2013-5-16 00:20:13

奇怪。这里人气挺足的,为什么没有人帮帮忙呢?

newywx 发表于 2013-6-5 15:55:03

帮你顶一下
郁闷,我的attiny2313a才串口也调试不出来,搞不懂什么原因
http://www.amobbs.com/thread-5537186-1-1.html
页: [1]
查看完整版本: 新手请教问题:AVR,mega16a串口无法接收数据