How to get data from one micro controller to another using UART
I dont understand your confusion. You want to communicate between the two controllers with UART, then ofcourse both of them need UART capabilities and code for this. Your computer has drivers and software for dealing with this, so your microcontroller also needs a driver for it. 

Your ATmega32 need UART TX functionality, while AT90USB1287 need UART RX functionality. Having already written both TX and RX for your ATmega32, writing the UART RX routine for AT90 should be a breese. You could add a bitvalue of some kind, identifying that the UART RX on AT90 is coming from your ATmega32, and directly pass it through to USB. 

EDIT: Code from AVRFreaks that is written for at90usb1287

#include &lt;avr/io.h&gt; 
#include &lt;util/delay.h&gt; 

#define RXC      (RXC1) 
#define TXC      (RXC1) 
#define UCSRC    (UCSR1C) 
#define UCSRB    (UCSR1B) 
#define UCSRA    (UCSR1A) 
#define UDR      (UDR1) 
#define UBRRL    (UBRR1L) 
#define UBRRH    (UBRR1H) 
#define UBRR     (UBRR1) 
#define UDRE     (UDRE1) 
#define RXCIE    (RXCIE1) 
#define TXEN     (TXEN1) 
#define RXEN     (RXEN1) 
#define UCSZ0    (UCSZ10) 
#define UCSZ1    (UCSZ11) 
#define UMSEL0   (UMSEL10) 
#define UMSEL1   (UMSEL11) 

#define FRAMING_ERROR (1&lt;&lt;FE1) 
#define PARITY_ERROR (1&lt;&lt;UPE1) 
#define DATA_OVERRUN (1&lt;&lt;DOR1) 
#define DATA_REGISTER_EMPTY (1&lt;&lt;UDRE1) 
#define RX_COMPLETE (1&lt;&lt;RXC1) 

#define FOSC 16000000 

typedef unsigned char       Uchar; 
typedef unsigned long int   Uint32; 

#define Wait_USART_Ready() while (!(UCSR1A &amp; (1&lt;&lt;UDRE1))) 

#define lowByte(w) ((uint8_t) ((w) &amp; 0xff)) 
#define highByte(w) ((uint8_t) ((w) &gt;&gt; 8)) 

int main(void) 
{ 
/* Disable clock division */ 
clock_prescale_set(clock_div_1); 
   UBRRH = (Uchar)((((Uint32)FOSC)/((Uint32)USART_BAUDRATE*16)-1)&gt;&gt;8); 
   UBRRL = (Uchar)(((Uint32)FOSC)/((Uint32)USART_BAUDRATE*16)-1) &amp; 0x0ff; 

   UCSRB |= (1 &lt;&lt; RXEN) | (1 &lt;&lt; TXEN); 
   UCSRC |= (1 &lt;&lt; UCSZ1) | (1 &lt;&lt; UCSZ0); 

   char ReceivedByte; 
   for (;;) // Loop forever 
   { 
      while ((UCSRA &amp; (1 &lt;&lt; RXC)) == 0) {}; // Do nothing until data have been received and is ready to be read from UDR 
      ReceivedByte = UDR; // Fetch the received byte value into the variable "ByteReceived" 

      while ((UCSRA &amp; (1 &lt;&lt; UDRE)) == 0) {}; // Do nothing until UDR is ready for more data to be written to it 
      UDR = ReceivedByte; // Echo back the received byte back to the computer 
   } 
}