You could configure the atmega328 usart yourself, have a look to datasheet or google it, there is lot of info in the web.
In theory you could configure usart up to 2 Megabauds with 16 MHz clock, using asinchonous double speed:
BAUD = Fosc/(8*(UBRRn+1))
with UBRRn=0 : BAUD = 16/8 = 2 (0% error)
To calculate UBRRn (double speed):
UBRRn = (Fosc/(8*BAUD))-1
Example C code to configure Usart0 in atmega328, not tested and perharps errors, but can show you how it's done :
#define USART0_BAUD 115200 // Define desired baud rate
#define USART0_UBBR_VALUE ((F_CPU/(USART0_BAUD<<4))-1)
void USART0_Init(void)
{
// Set baud rate
UBRR0H = (uint8_t)(USART0_UBBR_VALUE>>8);
UBRR0L = (uint8_t)USART0_UBBR_VALUE;
// Set frame format to 8 data bits, no parity, 1 stop bit
UCSR0C = (0<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00);
// Uncomment for double speed
//UCSR0A |= (1<<U2X0);
// Enable receiver and transmitter
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
}
One important thing is line isolation, at high speeds electric noise can produce lot of errors.
Best regards.