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

[复制链接]
 楼主| poren 发表于 2013-5-16 09:32 | 显示全部楼层 |阅读模式
最近正在学习AVR,这两天调试串口的基本用法。但是一个最简单的串口都无法搞定,很郁闷。向各位高手请教。
代码如下:
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <avr/interrupt.h>

  4. #define F_CPU 11.0592

  5. /*串口初始化,波特率9600,外部晶振11.0592*/
  6. void usart_init(void)
  7. {
  8.         UCSRB = 0x00;
  9.         UCSRA = 0x00;
  10.         UCSRC = (1<<URSEL)|0x06;
  11.         UBRRL = 71%256;
  12.         UBRRH = 0x00;
  13.         UCSRB = (1<<RXEN)|(1<<TXEN);
  14. }

  15. /*数据发送,查询方式*/
  16. void usart_transmit(unsigned char data)
  17. {
  18.         while (!(UCSRA & (1<<UDRE))); /* 等待发送缓冲器为空*/
  19.         UDR = data;                   /* 发送数据*/
  20. }

  21. /*数据接收,查询方式*/
  22. unsigned char usart_receive( void )
  23. {
  24.         volatile unsigned char data;
  25.         /* 等待接收数据*/
  26.         while ( !(UCSRA & (1<<RXC)));
  27.         /* 从缓冲器中获取并返回数据*/
  28.         data=UDR;
  29.         return data;
  30. }

  31. /*测试:循环发送26个英文字母*/
  32. void test_transmit()
  33. {
  34.         unsigned char i;
  35.         unsigned char temp = 'a';

  36.         temp = 'a';
  37.         for (i = 0; i < 26;i++)//循环发送26个英文字母
  38.         {
  39.                 usart_transmit(temp);
  40.                 temp++;
  41.                 _delay_ms(8);
  42.         }
  43.         usart_transmit('-');
  44.         _delay_ms(8);
  45.         usart_transmit('-');
  46.         _delay_ms(8);
  47.         usart_transmit('-');
  48.         _delay_ms(8);
  49.         usart_transmit('-');
  50.         _delay_ms(8);
  51.         usart_transmit('-');
  52.         _delay_ms(8);
  53. }

  54. /*主函数*/
  55. void main(void)
  56. {
  57.         volatile unsigned char backdata;
  58.         cli();
  59.         usart_init();
  60.         test_transmit();
  61.         
  62.         while (1)
  63.         {
  64.                 //接收函数无论怎么样,均无法调通。2013.05.14
  65.                 backdata = usart_receive(); /*等待接收数据*/
  66.                 usart_transmit(backdata);   /*发送收到的数据*/
  67.         }
  68. }
如上代码。发送的过程非常正常,尝试循环大量发送,通过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
用中断试了,接收中断也进不去。

什么芯片?
 楼主| poren 发表于 2013-5-16 11:53 | 显示全部楼层
huangxz 发表于 2013-5-16 11:20
什么芯片?

Atmega16A,外部晶振11.0592,熔丝位已设置
huangxz 发表于 2013-5-16 13:01 | 显示全部楼层
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>

  3. void bsp_init(void)
  4. {
  5.         cli();
  6.         UCSRC = (1<<URSEL)|0x06;
  7.         UBRRL = 71%256;
  8.         UBRRH = 0x00;
  9.         UCSRB = (1<<RXEN)|(1<<TXEN);
  10. }

  11. int main(void)
  12. {
  13.         uint8_t a;
  14.         bsp_init();
  15.         while(1)
  16.         {
  17.                 while(!(UCSRA & (1 << RXC)));
  18.                 a = UDR;
  19.                 while(!(UCSRA & (1 << UDRE)));
  20.                 UDR = a;
  21.         }
  22. }
这样子就可以,不知道楼主那个为啥不行啊
 楼主| poren 发表于 2013-5-16 13:19 | 显示全部楼层
huangxz 发表于 2013-5-16 13:01
这样子就可以,不知道楼主那个为啥不行啊

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

看来只有一个可能的问题了。单片机出问题了,手上现只有这一块,晚上回去再找一块换上试试。
huangxz 发表于 2013-5-16 13:36 | 显示全部楼层
poren 发表于 2013-5-16 13:19
您如果已实验成功的话,那真是让我奇怪了。
我把您的代码原封不动Copy下来,仍然是接收不到。

我是用hapsim试的,要不楼主也可以在proteus里面试下,我没那个软件
tanmilaoshu 发表于 2013-5-16 14:08 | 显示全部楼层
串口线是自己做的吗?检查一下是不是接错了?
 楼主| poren 发表于 2013-5-16 17:04 | 显示全部楼层
tanmilaoshu 发表于 2013-5-16 14:08
串口线是自己做的吗?检查一下是不是接错了?

串口线不是自己做的。用了很久了,搞其他的开发时经常用的。没有问题很正常。并且也短接测试了,很正常。
这次用的m16的最小系统板,和一块232的串口板连接,一般来讲硬件不会有问题。
都是我常用的东西,难不成就是当下坏了?
qin552011373 发表于 2013-5-16 23:39 | 显示全部楼层
是不是一直在接收或者发送
giant_bird 发表于 2013-5-17 13:53 | 显示全部楼层
你是用ICC_AVR来编译的吗? 我用ICC_AVR有这个问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

9

主题

226

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:一旦开始便永远能将事业继续下去的人是幸福的;空想不做总归是水中月,目标既然定下,计划的分解是关键,每一小步的计划如果不切实际,那也是镜中花。

9

主题

226

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部