AtMega2560的UART0到UART2网关(有点)

时间:2011-09-15 07:10:24

标签: interrupt avr

我将设备连接到AtMega2560的UART0。我想将UART0数据传输到UART2,以便在终端(PC)上查看。

当我使用UART到串行设备(FTDI)将设备直接连接到PC时,它可以很好地发送数据。

当我将UART2放在中间用于所述目的时,它只发送第一行,具体为:

Ver V2DAPV142 On-Line:然后忘记了。有时它也不会发送第一行。

代码:

#define UART0_BUFFER_SIZE 40 
#define RX_WAIT 65000 
volatile unsigned char UART0_rx_ArrUC85[UART0_BUFFER_SIZE]; 
volatile  unsigned char UART0_rx_ArrLength = 0, UART0_rx_ArrIndex = 0; 

void uart0_init( unsigned int baudrate ) 
{ 

    UBRR0H = (unsigned char) (baudrate>>8); 
    UBRR0L = (unsigned char) baudrate; 

    UCSR0B = ( 1 << RXEN0 ) | ( 1 << TXEN0 ) | (1<<RXCIE0); 
    UCSR0C = ( 1 << USBS0 ) | ( 1 << UCSZ01 ) | ( 1 << UCSZ00 );  // 8N1 

} 

void USART2Init(UINT16 ubrr_value) 
{ 
   UBRR2L = ubrr_value; 
   UBRR2H = (ubrr_value>>8); 

   UCSR2C|=(3<<UCSZ20); 

   UCSR2B = (1<<RXEN2) | (1<<TXEN2);  

} 
ISR(USART0_RX_vect) 
{ 
   unsigned char recChar = UDR0; 
   if (UART0_BUFFER_SIZE > UART0_rx_ArrLength) 
   {    
      UART0_rx_ArrUC85[UART0_rx_ArrIndex++] = recChar; 
      UART0_rx_ArrLength = UART0_rx_ArrIndex; 
   } 

} 

void uart2_putchar(UINT8 data) 
{ 
    //Local variables 
    unsigned int i; 
    for( i = 0; !( UCSR2A & ( 1 << UDRE2 ) ); i++ ) // Wait for empty transmit buffer 
    { 
        if( i > RX_WAIT )                           // How long one should wait 
        { 
            return ;                              // Give feedback to function caller 
        } 
    } 
    UDR2 = data;                                    // Start transmitting     
    //return (int)data;                               // Cast and return int value 
} 


void uart2_puts(unsigned char *str) 
{ 
   UINT8 dat; 
   for( ;*str != '\0'; ) 
   { 
      dat= *str++ ; 
      uart2_putchar(dat); 
   } 

} 
int main() 
{ 
   USART2Init(8); 
   uart0_init(103); 
   sei(); 
   while(1) 
   {       
      if(UART0_rx_ArrLength>0) 
      { 
         uart2_puts((unsigned char *) UART0_rx_ArrUC85);       
         UART0_rx_ArrLength = UART0_rx_ArrIndex = 0;                      
      } 
   } 
}

可能是什么问题。 对于UART0和UART2,我也检查了相同和不同的波特率。

1 个答案:

答案 0 :(得分:0)

问题是电路功率水平。电源不足以用于Pen-Drive控制器,并且调节器无法为其通信功率电平供电。因此它有时不起作用。此外,我们对其进行了测试并得出结论,在使用另一个电源调节器为Pen-Drive控制器提供足够的功率之后,上述通信非常适合。我希望这可以帮助人们关注可能的电路问题。