打印
[AVR单片机]

请教可能很幼稚的问题: AVR,mega16a串口无法接收

[复制链接]
2284|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
poren|  楼主 | 2013-5-16 09:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近正在学习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脚上可观察到接收的方波。

相关帖子

沙发
huangxz| | 2013-5-16 11:05 | 只看该作者
用中断试试吧

使用特权

评论回复
板凳
poren|  楼主 | 2013-5-16 11:09 | 只看该作者
huangxz 发表于 2013-5-16 11:05
用中断试试吧

用中断试了,接收中断也进不去。

使用特权

评论回复
地板
huangxz| | 2013-5-16 11:20 | 只看该作者
poren 发表于 2013-5-16 11:09
用中断试了,接收中断也进不去。

什么芯片?

使用特权

评论回复
5
poren|  楼主 | 2013-5-16 11:53 | 只看该作者
huangxz 发表于 2013-5-16 11:20
什么芯片?

Atmega16A,外部晶振11.0592,熔丝位已设置

使用特权

评论回复
6
huangxz| | 2013-5-16 13:01 | 只看该作者
#include <avr/io.h>
#include <avr/interrupt.h>

void bsp_init(void)
{
        cli();
        UCSRC = (1<<URSEL)|0x06;
        UBRRL = 71%256;
        UBRRH = 0x00;
        UCSRB = (1<<RXEN)|(1<<TXEN);
}

int main(void)
{
        uint8_t a;
        bsp_init();
        while(1)
        {
                while(!(UCSRA & (1 << RXC)));
                a = UDR;
                while(!(UCSRA & (1 << UDRE)));
                UDR = a;
        }
}
这样子就可以,不知道楼主那个为啥不行啊

使用特权

评论回复
7
poren|  楼主 | 2013-5-16 13:19 | 只看该作者
huangxz 发表于 2013-5-16 13:01
这样子就可以,不知道楼主那个为啥不行啊

您如果已实验成功的话,那真是让我奇怪了。
我把您的代码原封不动Copy下来,仍然是接收不到。

看来只有一个可能的问题了。单片机出问题了,手上现只有这一块,晚上回去再找一块换上试试。

使用特权

评论回复
8
huangxz| | 2013-5-16 13:36 | 只看该作者
poren 发表于 2013-5-16 13:19
您如果已实验成功的话,那真是让我奇怪了。
我把您的代码原封不动Copy下来,仍然是接收不到。

我是用hapsim试的,要不楼主也可以在proteus里面试下,我没那个软件

使用特权

评论回复
9
tanmilaoshu| | 2013-5-16 14:08 | 只看该作者
串口线是自己做的吗?检查一下是不是接错了?

使用特权

评论回复
10
poren|  楼主 | 2013-5-16 17:04 | 只看该作者
tanmilaoshu 发表于 2013-5-16 14:08
串口线是自己做的吗?检查一下是不是接错了?

串口线不是自己做的。用了很久了,搞其他的开发时经常用的。没有问题很正常。并且也短接测试了,很正常。
这次用的m16的最小系统板,和一块232的串口板连接,一般来讲硬件不会有问题。
都是我常用的东西,难不成就是当下坏了?

使用特权

评论回复
11
qin552011373| | 2013-5-16 23:39 | 只看该作者
是不是一直在接收或者发送

使用特权

评论回复
12
giant_bird| | 2013-5-17 13:53 | 只看该作者
你是用ICC_AVR来编译的吗? 我用ICC_AVR有这个问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:一旦开始便永远能将事业继续下去的人是幸福的;空想不做总归是水中月,目标既然定下,计划的分解是关键,每一小步的计划如果不切实际,那也是镜中花。

9

主题

226

帖子

2

粉丝