Code:
//https://forum.pjrc.com/threads/54711-Teensy-4-0-First-Beta-Test?p=195343&viewfull=1#post195343
#define SPD 2000000
#define BUFFER_SIZE 320
char buffer_out[BUFFER_SIZE];
char buffer[80];
#include <EEPROM.h>
int whoami = 2;
char chWho = 'z';
HardwareSerial *psAll[7] = { &Serial1, &Serial2, &Serial3, &Serial4, &Serial5, &Serial6, &Serial7 };
void setup() {
// To set the whoami run one time on each Teensy with
// EEPROM[0]=0; // or EEPROM[0]=1;
pinMode(13, OUTPUT);
for ( int ii = 0; ii < 7; ii++ ) {
psAll[ii]->begin(SPD);
}
digitalWrite( LED_BUILTIN, 1 );
while (!Serial && millis() < 2200) digitalWrite( LED_BUILTIN, !digitalRead( LED_BUILTIN) );
Serial.println("\n" __FILE__ " " __DATE__ " " __TIME__);
digitalWrite( LED_BUILTIN, 1 );
if ( 1 == EEPROM[0] ) {
whoami = 1;
chWho = 'A';
Serial.print( " __I am 1 :: Slave__ " );
}
else {
whoami = 0; // ZERO is the MASTER
chWho = 'a';
Serial.print( " __I am 0 :: Master__ " );
}
delay(100);
Serial.print("Test all Serials - Serial @ms=");
digitalWrite( LED_BUILTIN, !digitalRead( LED_BUILTIN));
delay(100);
Serial.println(millis());
digitalWrite( LED_BUILTIN, !digitalRead( LED_BUILTIN));
delay(10);
Serial.printf("Baud rate: %d\n", SPD);
digitalWrite( LED_BUILTIN, !digitalRead( LED_BUILTIN));
if ( 0 == whoami ) {
while ( 0 == Serial2.availableForWrite() ) {
Serial1.print( 'x' );
delay(1);
}
Serial1.println( "Hello World! #1" );
}
}
void serialXfer(HardwareSerial * psIn, HardwareSerial * psOut, bool bWrite, uint32_t ii)
{
uint32_t cb = psIn->available();
buffer[0] = 0; // NULL buffer when nothing read !!!
if (cb) {
if ( 0 != whoami ) Serial.print( cb ); // bugbug debug
if (cb > sizeof(buffer)) cb = sizeof(buffer);
if (cb > psOut->availableForWrite()) cb = psOut->availableForWrite();
if ( 0 == psIn->readBytes(buffer, cb) ) {
Serial.printf( "Read Error on %u - expected %u Bytes" , ii, cb );
buffer[0] = 0; // NULL buffer when nothing read !!!
}
else if ( bWrite ) {
psOut->print((char)( chWho + ii));
psOut->write(buffer, cb);
}
}
if ( 0 == whoami ) // bugbug debug // FORCE OUTPUT
psOut->print((char)( chWho + ii)); // bugbug debug
}
uint32_t iiCnt = 0;
void loop() {
if ( 0 != whoami ) {
return; // Slave uses serialEvent#
}
for ( int ii = 0; ii < 7; ii++ ) {
serialXfer( psAll[ii], psAll[ii], true, ii );
if ( 0 != buffer[0] ) {
Serial.print( ii );
Serial.print( ">>_" );
Serial.print( buffer );
}
buffer[0] = 0;
delay(8);
}
Serial.println( "<<==============================" );
delay(100);
iiCnt++;
if ( !(iiCnt % 14) ) {
for ( int jj = 0; jj < 8; jj++ ) {
for ( int ii = 0; ii < 7; ii++ ) {
serialXfer( psAll[ii], psAll[ii], false, ii );
buffer[0] = 0;
delay(5);
}
}
if ( 0 == whoami ) {
Serial1.print( "Hello World!" );
Serial1.println( iiCnt );
}
buffer[0] = 0;
}
}
void serialEvent1() { // ONLY this one receives calls
if ( 0 == whoami ) return; // this is for SLAVE processing test
uint32_t ii = 0;
Serial.print( " #" );
Serial.println( ii );
Serial2.print( "sE1>2 " ); // BUGBUG DEBUG >>
Serial3.print( "sE1>3 " ); // BUGBUG DEBUG
do {
serialXfer( psAll[ii], psAll[ii], false, ii );
delayMicroseconds(50);
} while ( psAll[ii]->available() > 0 );
buffer[0] = 0;
}
void serialEvent2() {
if ( 0 == whoami ) return;
uint32_t ii = 1;
Serial.print( ii );
do {
serialXfer( psAll[ii], psAll[ii], false, ii );
delayMicroseconds(50);
} while ( psAll[ii]->available() > 0 );
buffer[0] = 0;
}
void serialEvent3() {
if ( 0 == whoami ) return;
uint32_t ii = 2;
Serial.print( ii );
do {
serialXfer( psAll[ii], psAll[ii], false, ii );
delayMicroseconds(50);
} while ( psAll[ii]->available() > 0 );
buffer[0] = 0;
}
void serialEvent4() {
if ( 0 == whoami ) return;
uint32_t ii = 3;
Serial.print( ii );
do {
serialXfer( psAll[ii], psAll[ii], false, ii );
delayMicroseconds(50);
} while ( psAll[ii]->available() > 0 );
buffer[0] = 0;
}
void serialEvent5() {
if ( 0 == whoami ) return;
uint32_t ii = 4;
do {
serialXfer( psAll[ii], psAll[ii], false, ii );
delayMicroseconds(50);
} while ( psAll[ii]->available() > 0 );
buffer[0] = 0;
}
void serialEvent6() {
if ( 0 == whoami ) return;
uint32_t ii = 5;
do {
serialXfer( psAll[ii], psAll[ii], false, ii );
delayMicroseconds(50);
} while ( psAll[ii]->available() > 0 );
buffer[0] = 0;
}
void serialEvent7() {
if ( 0 == whoami ) return;
uint32_t ii = 6;
do {
serialXfer( psAll[ii], psAll[ii], false, ii );
delayMicroseconds(50);
} while ( psAll[ii]->available() > 0 );
buffer[0] = 0;
}