搜索
bottom↓
回复: 3

新手请教问题:AVR,mega16a串口无法接收数据

[复制链接]

出0入0汤圆

发表于 2013-5-15 15:26:50 | 显示全部楼层 |阅读模式
本帖最后由 poren 于 2013-5-15 16:56 编辑

正在学习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. void test_transmit()
  32. {
  33.         unsigned char i;
  34.         unsigned char temp = 'a';

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

  53. /*主函数*/
  54. void main(void)
  55. {
  56.         volatile unsigned char backdata;
  57.         cli();
  58.         usart_init();
  59.         test_transmit();
  60.        
  61.         while (1)
  62.         {
  63.                 //接收函数无论怎么样,均无法调通。2013.05.14
  64.                 backdata = usart_receive(); /*等待接收数据*/
  65.                 usart_transmit(backdata);   /*发送收到的数据*/
  66.         }
  67. }
复制代码
如上代码。发送的过程非常正常,尝试循环大量发送,通过PC的串口软件接收观察都很正常。
但是,通过PC的串口软件发送无论如何怎么发送都无法收到。
然后通过仿真器设置断点观察,当在函数的 while ( !(UCSRA & (1<<RXC))); 这条语句无法跳出,永久的死循环在这里了。
但是反复谷歌、百度,学习,观察,这条语句是一条简单且基本的语句,本身也是官方文档及多数教程中采用的,所以就想不明白了,向各位请教。
谢谢。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-5-15 19:21:59 | 显示全部楼层
自己顶一下。
串口tx和rx短接后串口工具收发正常。

出0入0汤圆

 楼主| 发表于 2013-5-16 00:20:13 | 显示全部楼层
奇怪。这里人气挺足的,为什么没有人帮帮忙呢?

出0入0汤圆

发表于 2013-6-5 15:55:03 | 显示全部楼层
帮你顶一下
郁闷,我的attiny2313a才串口也调试不出来,搞不懂什么原因
http://www.amobbs.com/thread-5537186-1-1.html
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 01:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表