Mehrere serielle Terminal-Programme verwenden gleichzeitig gleiche Hardware

Serielle virtuelle COMs führen unter Windows 10 nicht selten zu Datenkollisionen. Meist dann, wenn Konventionen nicht eingehalten werden. Ein Betrieb ist dann Virtuell nicht möglich. Es wird deshalb eine Hardware/Software-Lösung gesucht.

Mit einem Arduino Mega 2560 R3 wurde das Vorhaben angegangen.

Das Programm ist soweit fertig.

Mit Putty-1 an COM 8 werden Daten an Arduino Serial 1 gesendet und an Serial 3 weitergegeben. Putty-2 holt sich über COM 6 die Daten beim Arduino von Serial 3 und zeigt sie korrekt an. Wird nun an COM 8 ein Terminalprogramm und an COM 6 eine Hardware angeschlossen, reagiert die Hardware nicht. Wird das Terminalprogramm direkt an der Hardware angeschlossen, funktioniert alles. Nur nicht über eine sog. Serial-Umleitung über den Arduino.

Funktioniert das Vorhaben mit dem Arduino, könnten drei verschiedene Terminalprogramme gleichzeitig die Hardware steuern.

Irgend etwas blieb am "Programm" unberücksichtigt. Für Anregungen wäre ich sehr dankbar!

/*
  Multiple Redirect Serial 
  Multiple terminals (Serial 1..Serial 3), one piece of hardware (Serial 3)
*/

void setup() {

  // initialize serial ports:
  Serial.begin(4800);
  Serial1.begin(4800, SERIAL_8N2);
  Serial3.begin(4800, SERIAL_8N2);
}

void loop() {

  // read from Serial 1, send to Serial 3:
  if (Serial1.available()) {
    int inByte = Serial1.read();
    Serial.print(inByte, HEX);
    Serial3.print(inByte, HEX);
  }

  // read from Serial 3, send to Serial 1:
  if (Serial3.available()) {
    int inByte = Serial3.read();
    Serial.print(inByte, HEX);
    Serial1.print(inByte, HEX);
  }

}

Geht denn Putty an Com8 und Hardware an Serial3?
Wenn Nein, dann TerminalProgramm an Com8 und Putty2 an Com6.
Aber:
Auf dem Arduino dann die Zeichen nicht 1:1 weiter reichen, sondern als HEX-Wert.

1 Like

Vielen Dank für die Idee.

Mit Putty-1 und Putty-2 kann von beiden Seiten geschrieben und gelesen werden. Funktioniert wie gewünscht. Nur wenn das Terminalprogramm die Hardware anspricht, passiert nichts.

Das was ich vermute.
Das TP sendet eine andere abschliessende Zeichenfolge.
Darum auf dem Mega:

void setup()
{
  Serial1.begin(9600);
  Serial3.begin(9600);
  Serial3.println(F("Start..."));
}

void loop()
{
  if (Serial1.available())
  {Serial3.println(Serial1.read(), HEX);}
}

Auf dem Putty-Empfänger bekommst die Startanzeige und danach jedes vom Serial1 emfangene Zeichen in Hex.
Schau wo sich der Unterschied zwischen TP und Putty findet.

Danke, danke, schaue mir das an und mache mir dazu Gedanken.

An der Ausgabe von Serial 3 kommt beim Putty-2 nach dem Start vom Arduino die Meldung "Start..." an. Interessanter Gedanke!

Das ist Absicht!
Du brauchst ja wenigstens eine Kontrollmöglichkeit, ob das senden geht.

Mal noch ne kleine Ergänzung

uint8_t umlauf;

void setup()
{
  Serial1.begin(9600);
  Serial3.begin(9600);
  Serial3.println(F("Start..."));
}

void loop()
{
  if (Serial1.available())
  {Serial3.print(Serial1.read(), HEX); Serial.print(' '); umlauf++;}
  if (umlauf >= 20)
  {
    Serial.println();
    umlauf = 0;
  }
}
1 Like

ist ungewöhnlich. Meistens wird 8N1 eingestellt.

Ich habe keine Erfahrung damit, bei den virtuellen COM-Ports kann man diese Details auch in Windows einstellen. Ich habe den Eindruck, dass die meisten Programme das überschreiben was da als Einstellung im Gerätemanager steht.
Du kannst ja mal nachschauen und es ausprobieren
vgs

1 Like

Gut, gut, das werde ich nachtragen, danke!

Die 4800 und die 8N1 geben die Hersteller der Hardware vor. In Manchen Branchen ist das ganz typisch. Die Einstellung erwartet die Hardware und das ist im Terminal ebenfalls so hinterlegt. Beim Arduino müsste das dann auch fortgesetzt werden. Nach dem Empfang geht das verloren. Was die Terminal-Programme der Hardware senden, das ist für das Vorhaben unerheblich. Hinzu kommt, das jede Hardware ihre eigenen spezifischen Parameter hat. Aber danke für den doch wichtigen Hinweis!

Gildemeister?
Ich kann mich dran erinnern, das ich mit denen mal mit ner Simatic gekämpft habe...
Ach warn das noch Zeiten....

Ja, Gildemeister ist mir auch bekannt. Es sind Sende/Empfänger unterschiedlicher Hersteller und unterschiedlicher Art.

Da Du nicht schreibst, was der Empfänger ist, bedenke: Das könnte auch schief gehen, weil Du nicht nur TX/RX sondern DTR/DTS z.b. noch brauchst, was beim Direktanschluss funktioniert.

1 Like

Es wäre möglich, das im Einzelfall eine Hardware doch die DTR/DTS benötigt. Sie wird im Terminal-Programm hinterlegt, geht aber nach der Übrnahme durch den Arduino verloren.

Jau.
Ich hatte die Tage eine Variante, da konnte die Sequenz zur Programmierung geändert werden. Danach brauchte es kein DTR mehr. Die Empfangsbereitschaft wurde dann manuell ausgelöst....
Mal sehen, ob ich das noch finde.
Gefunden.
Kommt das infrage?

Alternativ, könntest mit zusätzlichen Pins auch selbst bauen....

Hoch interessanter Bericht und klasse Idee, auch zur Umsetzung. Für aktuelle Hardware ist egal was in der Terminal-Software eingestellt wird, auch bei DTR/DTS off funktioniert der Datenaustausch vom Termial-Programm zur Hardware und von der Hardware zurück zum Terminal-Programm. Alles was das Terminal-Programm von der Hardware mitgeteilt bekommt, wird später in einer Datei gespeichert.

Danke für den tollen Bericht!

Wie bereits erwähnt, die Kommunikation mit zwei Puttys funktionierte ausgezeichnet. Nun stellte sich heraus, das die RS232-TTL Konverter zum Arduino Mega mit Putty funktionieren, doch als die Puttys mit Terminal-Software und Hardware ersetzt wurden, kam keine Verbindung zur Hardware zustande. Die Kabelverbindungen waren korrekt, alles wurde mit dem Ohmmeter ausgemessen. Steuerleitungen benötigt die Hardware nicht. Ein Kabel mit RX, TX und Ground bestätigt dies nachdrücklich.

Es liegt offensichtlich am MAX232 für die RS232-TTL Konvertierung. Diese werden durch MAX3232 getauscht und dann eine neuer Versuch unternommen. Bis dahin, vielen Dank für die netten Hinweise. Kommende Woche werden wohl die neuen Konverter kommen. Theoretisch könnten auch zwei Arduino Mega zusammengeschaltet werden, um dann 6 bzw. 7 Terminalprogramme gleichzeitig mit der gleichen Hardware verbinden zu können. Die aktuelle Anwendung reicht mit Serial (0) für vier Terminal-Programme allerdings aus. Beim Laden des Programms in den Arduino muss lediglich der Konverter von Serial abgesteckt werden. Ansonsten meldet sich der Compiler. Herzlichen Gruss!

Hallo Sarah,

ich möchte noch auf einen anderen microcontroller aufmerksam machen.
Der kann wenn es sein muss mal eben 16 serielle Schnittstellen gleichzeitig bedienen
Der Propeller-Chip von Parallax.

8 core-Microcontroller 32 Bit

vgs

1 Like

Vielen Dank für den interessanten Microcontroller. Ich versuche mit dem Arduino eine einfache Lösung zu finden, so können viele weltweit dieses Vorhaben umsetzen. In Insiderkreisen ist Arduino recht bekannt und beliebt. Viele Vorhaben wurden so auf den Weg gebracht. Eigentlich reichen vier Serial. Eine Serial ist für eine spezielle standardisierte virtuelle Variante vorgesehen. Terminal-Programme und Hardware haben es mit dieser speziellen Variante ganz einfach. Weil sich einige aber nicht auf einen gemeinsamen Standard einlassen wollen, ist dieses Vorhaben entstanden. Wenn es funktioniert, könnte eine sehr grosse Klientel weltweit davon profitieren. Ich habe die gängigsten virtuellen Serial-Varianten auf Windows 10 getestet und keine Applikation lief wie sie sollte. Nur bei ganz wenigen Produkten sollen angeblich mehrere Programme die gleich Hardware zur gleichen Zeit ansprechen können. Das gelingt bei älteren Betriebssystem um Windows 2000. Bei Windows 10 ist mir kein Betrieb gelungen. Mit Putty funktionierte alles, jetzt muss es noch mit Hardware gelingen und dann können die anderen Serial angehängt werden. Wer möchte kann für den Einzelfall die Steuerleitungen hinzufügen.

Sorry, das System sperrte für meinen Account für 2 Stunden. Ich konnte somit nur zeitverzögert antworten...

Sei froh, früher war das nen ganzer Tag :wink:

1 Like