打印
[AVR单片机]

mega 128的双串口问题

[复制链接]
2848|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
麻辣鸭脖子|  楼主 | 2010-7-8 21:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 麻辣鸭脖子 于 2010-7-10 16:29 编辑

程序如下:
#include <iom128v.h>
#include <macros.h>
#include <avr/io.h>

#define uchar unsigned char
#define uint unsigned int

uchar str[16];
unsigned int indexx;
//URAT的0口
void uart0_init(void)
{
UCSR0B = 0x00; //设置波特率时关闭发送和接收
UCSR0A = 0x00;
UCSR0C = 0x06;//8位数据+1位STOP位
UBRR0L = 0x33;
UBRR0H = 0x00;//设置波特率
UCSR0B = 0xD8;//允许发送和接收
}
//URAT的1口
void uart1_init(void)
{
UCSR1B = 0x00; //设置波特率时关闭发送和接收
UCSR1A = 0x00;
UCSR1C = 0x06;//8位数据+1位STOP位
UBRR1L = 0x33;
UBRR1H = 0x00;//设置波特率
UCSR1B = 0xD8;//允许发送和接收
}

//URAT的0口输出
void putchar0(unsigned char c)
  {   
  while (!(UCSR0A&(1<<UDRE0)));//判断上次发送是否完成
  UDR0=c;               //发送数据   
  }   
//URAT的1口输出
void putchar1(unsigned char c)
  {   
  while (!(UCSR1A&(1<<UDRE1)));//判断上次发送是否完成
  UDR1=c;               //发送数据   
  }   
//URAT的0口输入
unsigned char getchar0(void)
    {
          uchar c;
  while(!(UCSR0A& (1<<RXC0)));//判断是否接收到数据
        c=UDR0;
  return c;           //接收数据
  }
//URAT的1口输入
unsigned char getchar1(void)
    {
  uchar c;
  while(!(UCSR1A& (1<<RXC1)));//判断是否接收到数据
  return UDR1;           //接收数据
  return c;
  }

int main(void)
{
  int i;
  uchar c;
  indexx=0;
          uart0_init();
          uart1_init();

  while(1)
  {   
    if(UCSR0A&(1<<RXC0))//
    {
        c=UDR0;
        str[indexx]=c;
        indexx++;
    }
    if(indexx==15)//每次输入15个字符
    {
        for(i=0;i<15;i++)
        {
            putchar0(str);
          putchar1(str);
        }     
        indexx=0;
    }
  }
}
出现的问题是,串口0接收到的数据通过串口0(putchar0)返回时是正确的结果,由串口1(putchar1)的结果却不对.
设置断点调试时,str数组只能接受到前三个和最后一个字符,和前面一个兄弟的问题一样,始终突破不了4个.
不用断点直接运行时,str中的结果却是对的
ps:给串口0发送的数据 大概是 81 01 06 03 10 10 00 00 00 00 00 00 00 00 ff
请指点,多谢

相关帖子

沙发
麻辣鸭脖子|  楼主 | 2010-7-10 16:29 | 只看该作者
怎么没人回答呢?

使用特权

评论回复
板凳
ljhtj| | 2010-7-10 16:39 | 只看该作者
//URAT的1口输入
unsigned char getchar1(void)
    {
  uchar c;
  while(!(UCSR1A& (1<<RXC1)));//判断是否接收到数据
  return UDR1;           //接收数据
  return c;
  }

返回 UDR1行吗?c?

使用特权

评论回复
地板
ljhtj| | 2010-7-10 16:46 | 只看该作者
把uart0屏蔽如果uart0正常在中间加延时

使用特权

评论回复
5
婕迷云潇潇| | 2010-7-11 08:16 | 只看该作者
这个版本未真正激活,是使用测试版的文件**的,不能用。真正可用的,是大师版里那个:

使用特权

评论回复
6
wangwo| | 2010-7-11 14:33 | 只看该作者
设置断点调试时,str数组只能接受到前三个和最后一个字符,和前面一个兄弟的问题一样,始终突破不了4个.
这句话没理解了

使用特权

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

本版积分规则

0

主题

454

帖子

1

粉丝