Soweit funktioniert alles mit zwei verschmerzbar kleinen Unzulänglichkeiten und einem unangenehmen Nachteil.
Bei den anfänglichen Tests wurde eine Serial.print(variable) Ausgabe zur Überprüfung der Daten zwischen
Serial1 mit Serial3,
Serial2 mit Serial3
verwendet. Um nun die Serial, eigentlich "Null", ebenfalls verwenden zu können, muss die Serial.print(variable) Ausgabe deaktiviert sein, was zur Folge hat, das keine Kommunikation mehr stattfindet. Dieser Umstand konnte mit einer LCD-Ausgabe über SDA und SLC umgangen werden. Die LCD-Ausgabe ist bei jedem Programmteil
Serial mit Serial3,
Serial1 mit Serial3,
Serial2 mit Serial3
notwendig. Die LCD-Ausgabe ersetzt somit die übliche Serial.print(variable) Ausgabe. Ein LCD-Display wurde jedoch nicht angeschlossen.
Der nächste Umstand entstand durch die Terminal-Programme selbst. Sobald die Terminal-Programme die Serial, Serial1, Serial2 mit Daten ansprechen, kommt es recht oft zu Daten-Kollisionen im Arduino. Die Hardware kann die Empfangs-Daten an sie nicht auswerten. Leider verfügen die Terminal-Programme selten über eine RTS-Steuerung, die dafür sorgt, wann die Terminal-Programme ihre Daten senden dürfen. ― Dies ist auch nicht zwingend notwendig, den üblicherweise wird nicht mit mehreren Terminal-Programmen parallel gearbeitet. Was aber wenn verschiedene Terminal-Programme über exzellente Programm-Funktionen verfügen und genau das liegt vor. Sobald keine Kommunikations-Standards vorliegen, treten unweigerlich Probleme mit Datenkollisionen auf. Unter Windows 10 können virtuelle Ports das kaum noch bzw. nicht mehr bewerkstelligen. ―
Die Deaktivierung und Aktivierung der RX-Dateneingänge der DARTs brachte keine Abhilfe. Abgesehen vom Zeitverzug, erbrachten Serial.end() und Serial.beginn() ebenso keine Abhilfe. Erst mit einem Analogschalter 4066 konnten die Eingänge abgeschottet werden. Jedes Terminal-Programm bekommt gezielt durch den 4066 eine Datenfreigabe. Ab diesem Zeitpunkt traten keine weiteren Daten-Kollisionen auf. Drei Terminal-Programme können nun nacheinander über die Serial3 ihr Daten an die Hardware senden und empfangen. Natürlich nicht gleichzeitigt, sondern mit einem kleineren Zeitverzug.
Nachteil:
Wird nun von einem Terminalprogramm ein Befehl an die Hardware gesendet, dann gelingt das gut. Nur in einem Fall nicht, weil das Terminal-Programm nicht lange genug wartet, um wiederholt den gewünschten Befehl erneut an die Hardware zu senden.
#include <Wire.h> // LCD library
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
char inByte;
void setup()
{
// initialize serial ports:
//Serial.begin(4800);
Serial.begin(4800, SERIAL_8N2); // Baud, Config
Serial1.begin(4800, SERIAL_8N2); // Baud, Config
Serial2.begin(4800, SERIAL_8N2); // Baud, Config
Serial3.begin(4800, SERIAL_8N2); // Baud, Config
}
void loop()
{
//****************************************************
// read from Serial 0, send to Serial 3:
if (Serial.available())
{Serial3.print(inByte = Serial.read());}
// Serial1.print(inByte);
//=====[ LCD ]====
lcd.setCursor(0, 0);
lcd.print("P0: ");
lcd.print(inByte);
lcd.setCursor(7, 0);
lcd.print(" ");
lcd.setCursor(7, 0);
//=====[ LCD ]====
//****************************************************
// read from Serial 3, send to Serial 0:
if (Serial3.available())
{Serial.print(inByte = Serial3.read());}
//****************************************************
// read from Serial 1, send to Serial 3:
if (Serial1.available())
{Serial3.print(inByte = Serial1.read());}
// Serial1.print(inByte);
//=====[ LCD ]====
lcd.setCursor(0, 0);
lcd.print("P1: ");
lcd.print(inByte);
lcd.setCursor(7, 0);
lcd.print(" ");
lcd.setCursor(7, 0);
//=====[ LCD ]====
//****************************************************
// read from Serial 3, send to Serial 1:
if (Serial3.available())
{Serial1.print(inByte = Serial3.read());}
//****************************************************
// read from Serial 2, send to Serial 3:
if (Serial2.available())
{Serial3.print(inByte = Serial2.read());}
// Serial2.print(inByte);
//=====[ LCD ]====
lcd.setCursor(0, 0);
lcd.print("P2: ");
lcd.print(inByte);
lcd.setCursor(7, 0);
lcd.print(" ");
lcd.setCursor(7, 0);
//=====[ LCD ]====
//****************************************************
// read from Serial 3, send to Serial 2:
if (Serial3.available())
{Serial2.print(inByte = Serial3.read());}
}