开发者

UART0 to UART2 gateway (sort of) for AtMega2560

I connected a device to the UART0 of the AtMega2560. I want to transfer the UART0 data to the UART2 to view it on the Terminal(PC).

When I connect the device directly to the PC using an UART to serial device (FTDI) It sends the data nicely.

When I put the UART2 in the middle for said purpose, then It only sends the first line, specifically:

Ver V2DAPV142 On-Line: And then forgets. Sometimes it doesn't send the first line too.

Code:

#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 << USBS开发者_JAVA技巧0 ) | ( 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;                      
      } 
   } 
}

What could be the issue. I checked it with same and different baud rates too for UART0 and UART2.


The issue was circuitry power level. The power supply was not sufficient for the Pen-Drive ctrlr and the regulator was not able to source for its communication power level. Hence it was not working sometimes. Further we have tested it and drew a conclusion that after giving sufficient power to the Pen-Drive ctrlr using another power regulator, the above said communication takes nicely place. I hope this can help ppl to draw attention towards the possible circuitry issues.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜