NewNew 发表于 2009-11-1 22:54:45

请马老师帮我看一下我的UART接收是那的问题

我用两个单片机实现通讯,在发送端可以进入发送完成中断,可以确定没有问题,在接受端怎么接收不到,而且无法进入接收完成中断,搞半天不知是哪里的问题,请帮我分析一下,谢谢!
以下是采用缓冲思路的代码
// USART Receiver interrupt service routine
interrupt void usart_rx_isr(void)
{
   unsigned char status,data;
   status=UCSR0A;
   data=UDR0;         
   //如果没有错误那么以下的检测位将为0,如果出错将为1
   if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
      rx_buffer=data;
      if (++rx_wr_index == RX_BUFFER_SIZE)
         rx_wr_index=0;
      if (++rx_counter == RX_BUFFER_SIZE)
      {
         rx_counter=0;
         rx_buffer_overflow=1;
      }
   }
}

//读取接受缓冲区的数据
unsigned char getchar(void)
{
   char data;
   if(rx_counter>0)
   {   
      data=rx_buffer;
      if (++rx_rd_index == RX_BUFFER_SIZE)
         rx_rd_index=0;
      #asm("cli")                                                                        
      --rx_counter;
      #asm("sei")
      return data;
   }
   return 0;
}

NewNew 发表于 2009-11-1 23:11:06

我在线等,知道的朋友可以讲一下吗!

huilai 发表于 2009-11-2 08:52:17

接收端串口初始化贴出来看看

qiuxiangkai 发表于 2009-11-2 16:37:50

这个是书上的缓冲队列例程吧。先确定下两机的自发自收有没问题。我也做了两机收发,没成功。看下硬件电路有没问题。

NewNew 发表于 2009-11-2 18:34:38

我的自发自收没有问题,以下是初始化
// 初始化串行异步通讯
void usart_init(unsigned char band)
{      
   UCSR0B=0X00;//disable while setting baud rate
   UCSR0A=0X00;
   //设置波特率
   UBRR0L=band;
   UBRR0H=0x00;
   //设置帧格式:8个数据位,2个停止位
   UCSR0C=(1<<USBS0)|(3<<UCSZ00);
   //接收器和发送器使能,接收完成中断使能
   UCSR0B=(1<<TXEN0)|(1<<RXEN0)|(1<<RXCIE0);   
}

NewNew 发表于 2009-11-2 18:35:23

马老师能抽点时间帮我看看吗

sleedrr 发表于 2010-2-23 13:04:18

SREG=0X80   总中断没有打开吧

taocongrong 发表于 2011-12-17 09:58:09

页: [1]
查看完整版本: 请马老师帮我看一下我的UART接收是那的问题