求助 Atmega16 最简单的串口程序。接收不到数据

[复制链接]
6515|12
 楼主| fei8960 发表于 2012-5-7 21:05 | 显示全部楼层 |阅读模式
单独调试发送部分是正常的。
接收时,用串口调试助手,发现一直是0x00,在AVR stdio 里,RXC始终是1,UDR是0x00。不知道是什么原因,是程序哪里有错么?


#include<iom16v.h>
#include<macros.h>
void uart_init(void)
{
CLI();
  UCSRB=0X00; // 禁止串口
  
  UCSRA=0X02;  // 倍速
  
  UCSRC=0X06;  //   8位数据
  UBRRH=0X00;
  UBRRL=12;   //    9600
  UCSRB=0X18;  //   允许发送和接收
  SEI();
  }
  //  数据发送
  void uart_transmit(unsigned char i)
  {
    while(!(UCSRA&(1<<UDRE))); // 等待发送缓冲器为空
UDR=i; // 发送数据
}
// 数据接收
unsigned char uart_receive(void)
{
    while(!(UCSRA&(1<<RXC))) // 等待接收数据
  return UDR; // 获取数据
}
//主函数
void main(void)
{
    unsigned char temp;

  uart_init();
  while(1)
  {
     temp=uart_receive();
   
   uart_transmit(temp);
}
}
NE5532 发表于 2012-5-7 21:09 | 显示全部楼层
发送调通了没?先调发,再调收,自己动脑经想下为什么。
 楼主| fei8960 发表于 2012-5-7 21:16 | 显示全部楼层
2# NE5532
发送调通了,呃,我的确不知道为什么,想了一晚上了。我实在太菜了,刚刚接触。这个是书上的例程,可我还是调不出来
NE5532 发表于 2012-5-7 21:22 | 显示全部楼层
2# NE5532  
发送调通了,呃,我的确不知道为什么,想了一晚上了。我实在太菜了,刚刚接触。这个是书上的例程,可我还是调不出来
fei8960 发表于 2012-5-7 21:16


那你先描述一下发送用什么什么方法来判断是调通了的呢?
NE5532 发表于 2012-5-7 21:25 | 显示全部楼层
另外你到底是想用中断还是想用查询?
 楼主| fei8960 发表于 2012-5-7 21:29 | 显示全部楼层
5# NE5532
发送就是把temp换成'A',可以在串口调试助手里,可以显示发送的A。这应该可以了吧。
想用查询的方式,中断更不懂了。。
NE5532 发表于 2012-5-7 21:32 | 显示全部楼层
1.发送要从00发到FF,涵盖所有情况,才知道波特率是否正确。
2.你不用中断却又开着中断,还没有定义中断服务程序,中断可能早跳飞了。就算你定义了中断服务程序,中断里面清了接收标志,外面还是什么都收不到。
 楼主| fei8960 发表于 2012-5-7 21:43 | 显示全部楼层
7# NE5532
是要把SEI()去掉么,去掉还是收不到数据啊,要把中断关掉的话,还要改哪里么。感谢
NE5532 发表于 2012-5-7 21:44 | 显示全部楼层
你还是系统化学习数据手册串口章节吧,多看两次再来写。
 楼主| fei8960 发表于 2012-5-7 21:50 | 显示全部楼层
9# NE5532
好的,谢谢,我再看看书
joyme 发表于 2012-5-8 09:33 | 显示全部楼层

  while(!(UCSRA&(1<<RXC))) // 等待接收数据
  return UDR; // 获取数据


如果不是笔误的话,while语句后面少个";"
 楼主| fei8960 发表于 2012-5-8 12:34 | 显示全部楼层
11# joyme
谢谢,最后我也发现了。细节好重要哦,还纠结了我好久
xlx999 发表于 2012-5-8 21:05 | 显示全部楼层
我也学习学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

41

帖子

1

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