1. Let us assume that the Fig-1 depicts the nature of signal you are acquiring and digitizing using ADC of UNO. The assumed sampling rate 1500/sec.

Figure-1:
2. Theoretically the sampling is 2xmaxFrequency. Practically, it is about 10 times (5000 samples/sec); however, I would recommend to sample the signal five times which means 5x500 = 2500 samples in one second in order to get closer reproduction of the original signal. Then the time gap between two samples is: 400 us. At 1500 samples/sec, the time gap between two samples is: 666 us. In the calculations that follow, I would use 1500 samples/sec.
3. The ADC will take about 100 us time (1/125 kHzx10 = 80 us) to finish the conversion of a sample. There is still 566 us time in hand to carry out Serial transmission of a sample, other tasks (if any), and other house keeping jobs.
4. As you are using UNO, (probably) you have to use Software UART Port (SUART) which works well only at 9600 Bd. Hardware UART Port (which can work at higher Bd) of the UNO may not be available as this port remains engaged with PC/IDE/SM.
5. Every sample of the data is 16-bit wide (only lower 10-bit carries information) whose range is: 0000 - 1023 (0x0000 - 0x03FF).
(1) If sending ASCII codes for the decimal digits, then the time required to transmit one sample would be: 4-characterx1/9600 = 4x10x1/9600 = 4166 us. This is not feasible as the available time is only 566 us. (To transmit one character/digit, a 10-bit wide frame is required, Fig-2).

Figure-2:
(2) If sending ASCII codes for the hex digits, then the time required to transmit one sample would be: 3-characterx1/9600 = 3x10x1/9600 = 3125 us. This is not feasible as the available time is only 566 us.
(3) If sending raw binary codes (2-byte) of a sample, then the time required to transmit one sample would be: 2-bytex1/9600 = 2x10x1/9600 = 2083 us. This is not feasible as the available time is only 566 us. When sending binary over SUART Port, there is overhead in sending the at least 2-byte (3-byte better) synchronization pattern and 1-byte checksum for every packet of data (a packet size could be max 60-byte).
6. Considering the facts of Step-4, I would suggest to use one of the Hardware UART Ports (UART1 or UART2 or UART3) of MEGA and acquire 2500 samples/sec (or 5000 samples/sec) and transmit ASCII codes of the decimal digits at suitable Bd (Baud Rate).
(1) 1500 samples/sec; sending ASCII codes of decimal digits; UART1 of MEGA at Bd = 115200.
Time required to transmit one sample : 347 us when there is 566 us available
(2) 2500 samples/sec (time gap between two samples: 400 us) ; sending ASCII codes of decimal digits; UART1 of MEGA at Bd = 115200.
Time required to transmit one sample : 347 us (4x10x1/1152000) when there is 400 us available (marginal). Increase Bd to 230400 or 250000.
(3) 5000 samples/sec (time gap between two samples: 200 us) ; sending ASCII codes of decimal digits; UART1 of MEGA at Bd = 250000.
Time required to transmit one sample : 160 us (4x1x1/250000) when there is 200 us available.
7. TC1 (Timer/Counter 1) Module of MEGA could be used to generate 200 us Time Tick to periodically interrupt the MCU to acquire data and send it to destination without any buffering.
8. Example Sketch (testing UART1 communication)
(1) MEGA (Transmitter) Sketch
//MEGA acquire 5000 samples/sec and send at Bd = 250000
volatile bool flag = false;
int counter = 0;
void setup()
{
Serial.begin(250000);
Serial1.begin(250000);
//--------------------
TCCR1A = 0x00; //TC1 is an upcounter in normal mode
TCCR1B = 0x00; //TC1 is OFF
TCNT1 = 65486; //preset value for 200 us Time Tick
TCCR1B = 0x03;//Start TC1 at clkTc1 = 16MHz/64
bitSet(TIMSK1, TOIE1); //TC1 overflow interrupt is enabled
}
void loop()
{
if(flag == true)
{
int y = analogRead(A0);
Serial.println(y, DEC);
Serial1.print(y, DEC);
counter++;
if(counter == 5000);
{
Serial1.write(0x03); //End-of-packet mark
Serial.println("5000 samples are sent.");
counter = 0;
}
flag = false;
}
}
ISR(TIMER1_OVF_vect)
{
TCNT1 = 65486;
flag = true;
}
(2) Receiver (DUE) Sketch
char myBuff[5000];
int i = 0;
void setup()
{
Serial.begin(250000);
Serial1.begin(250000);
}
void loop()
{
byte n = Serial1.available();
if (n != 0)
{
char y = Serial1.read();
if (y != 0x03)//end of packet found
{
myBuff[i];
i++;
}
else
{
Serial.println("5000 samples received.");
Serial.println("Process Data.");
i = 0;
while(1);
}
}
}