//connect Serial1 TX -> Serial2 RX, Serial2 TX -> Serial3 RX, Serial3 TX -> Serial4 RX....
#define SPD 1000000
int loop_count = 0;
#define BUFFER_SIZE 320
#define TIMEOUT_MILLIS 250
char buffer_out[BUFFER_SIZE];
char buffer_in[BUFFER_SIZE];
char buffer[80];
void setup() {
pinMode(13, OUTPUT);
// while (!Serial && millis() < 4000) ;
// Serial.begin(115200);
delay(800);
Serial4.println("Test all Serials");
Serial4.printf("Baud rate: %d\n", SPD);
Serial1.begin(SPD);
Serial2.begin(SPD);
Serial3.begin(SPD);
Serial4.begin(SPD);
Serial5.begin(SPD);
Serial6.begin(SPD);
Serial7.begin(SPD);
Serial8.begin(SPD);
}
void echoSerial(HardwareSerial *pserial)
{
int cb = pserial->available();
if (cb) {
if (cb > sizeof(buffer)) cb = sizeof(buffer);
if (cb > pserial->availableForWrite()) cb = pserial->availableForWrite();
pserial->readBytes(buffer, cb);
pserial->write(buffer, cb);
}
}
void loop() {
Serial4.printf("Loop: %d\n", ++loop_count);
for (int i = 0; i < BUFFER_SIZE; i++) {
buffer_out[i] = (i + loop_count) & 0xff;
}
char *pb_out = buffer_out;
int cb_out_left = BUFFER_SIZE;
char *pb_in = buffer_in;
int cb_in_left = BUFFER_SIZE;
int cb;
uint32_t start_time = millis();
while ((cb_out_left || cb_in_left) && ((millis() - start_time) < TIMEOUT_MILLIS)) {
// See if we have more to output
if (cb_out_left) {
cb = Serial1.availableForWrite();
if (cb > cb_out_left) cb = cb_out_left;
Serial1.write(pb_out, cb);
pb_out += cb;
cb_out_left -= cb;
}
echoSerial(&Serial2);
echoSerial(&Serial3);
// We are using Serial4 for other stuff
echoSerial(&Serial5);
echoSerial(&Serial6);
echoSerial(&Serial7);
echoSerial(&Serial8);
// Serial1 is special so handle that one here.
cb = Serial1.available();
if (cb) {
// should verify that we fit, but...
Serial1.readBytes(pb_in, cb);
pb_in += cb;
cb_in_left -= cb;
}
}
// Exited loop see if we received everything.
uint32_t dt = millis() - start_time;
Serial4.printf("Delta time: %d, CB Out: %d, CB In: %d\n", dt, BUFFER_SIZE - cb_out_left, BUFFER_SIZE - cb_in_left);
int error_count = 0;
for (int i = 0; i < BUFFER_SIZE; i++) {
if (buffer_out[i] != buffer_in[i]) {
error_count++;
if (error_count < 5)Serial4.printf(" %d %x != %x\n", i, buffer_out[i], buffer_in[i]);
}
}
Serial4.printf(" Error Count %d\n", error_count);
delay(500);
}