Serialle Komunikation Rx/Tx

Hallo, ich habe gerade Schwierigkeiten mit der seriellen Kommunikation zwischen einem Arduino Uno und einem anderen Gerät über RS232.

Ich möchte nun ein einfaches Grundprogramm erstellen. Der Code soll lediglich warten, bis ich in der Tastatur den Befehl "V100" eingebe, diesen an den Arduino Uno senden und der Arduino Uno den Befehl anschließend über RX weiterleiten.

void setup() {
  // Starte serielle Kommunikation mit 9600 Bd
  Serial.begin(9600);
  // Warte, bis die serielle Verbindung hergestellt ist (nur für Dateischirme sinnvoll)
  while (!Serial) {
    ; // Nichts tun
  }
  Serial.println("Gib Text ein und druecke Enter:");
}

void loop() {
  // Lies Eingabezeile von Serial (bis newline)
  if (Serial.available()) {
    String input = Serial.readStringUntil('\n'); // liest bis newline
    input.trim(); // entferne führende/nachfolgende Leerzeichen
    // Echo zurück über TX/Serial
    Serial.println("Du hast eingegeben: ");
    Serial.println(input);
  }
}

Ist das genau das, was ich suche, oder muss ich noch irgendwelche Korrekturen vornehmen?”

Vielen Dank!

Auf einem Board mit 328P-Prozessor (wie Ihrem Uno) werden die Tx/Rx-Pins mit der USB-Verbindung zum PC geteilt. Sie können also entweder die serielle Schnittstelle zur Kommunikation mit dem PC oder zur Kommunikation mit einem anderen Gerät verwenden.

Wenn Sie sowohl mit dem PC als auch mit einem anderen Gerät kommunizieren möchten, können Sie sich SoftwareSerial (und Alternativen) ansehen.

Wenn du Eingaben über den seriellen Monitor machen möchtest und diese seriell weiter leiten möchtest, brauchst du für die Weiterleitung eine zusätzliche serielle Schnittstelle (z.B. SoftwareSerial). Aber beachte, das ist nicht RS232, da braucht es noch einen zusätzlichen Wandler, der die nötigen Spannungen herstellt.

Das geht nicht. Wenn dann TX :wink:
Der USB-Anschluss, den Du zur Eingabe benutzt, nutzt die PIN 0/1 und damit die Hardwareseitige serielle Schnittstelle.

Wenn Du auf dem Seriellen Monitor etwas eingeben willst, was dann eine serielle Übertragung auslösen soll, brauchst Du eine zweite serielle Schnittstelle.

Du kannst mit softwareserial eine solche generieren und dann ein Transportinterface bauen.

#include <SoftwareSerial.h>

SoftwareSerial Terminal {10, 11}; // RX TX

const char *vt = "VT100";  // Vergkleichstext

constexpr uint8_t maxIdx {10};
char buf[maxIdx] = {'\0'};
uint8_t idx;

void setup()
{
  // Starte serielle Kommunikation mit 9600 Bd
  Serial.begin(9600);
  Terminal.begin(9600);

  // Warte, bis die serielle Verbindung hergestellt ist (nur für Dateischirme sinnvoll)
  while (!Serial)
  {
    ; // Nichts tun
  }

  newChoice();
}

void loop()
{
  getText();
}

void newChoice()
{
  Serial.println(F("Gib Text ein und druecke Enter:"));
  memset(buf, '\0', sizeof(buf));
  idx = 0;
}

void getText()
{
  if (Serial.available())                                 // Zeichen im Puffer?
  {
    char c = Serial.read();                               // Zeichen lesen

    if (!isControl(c))                                    // Kein Steuerzeichen?
    {
      buf[idx++] = c;                                     // Zeichen übernehmen

      if (idx == maxIdx)                                  // Prüfung auf Überlauf
      {
        Serial.println(F("Zuviele Zeichen!"));
        idx--;
      }
    }
    else                                                  // Zeochen ist Steuerzeichen
    {
      if (idx != 0)                                       // buffer ist beschrieben
      {
        Serial.print(F("eingegebener Text: "));
        Serial.println(buf);

        if (strncmp(buf, vt, sizeof(vt)) == 0)            // Buffer entspricht der Vorgabe?
        {
          Serial.println(F("Vergleich erfolgreich"));
          Terminal.print(vt);
        }

        newChoice();                                      // Neue Abfrage
      }
    }
  }
}

In dem Fall müsstes Du dann PIN 11 und GND mit deinem anderen Gerät verbinden....

Es ist nicht das was @maty247 will.

@maty247

Welcher Uno?
Und einmal den Schaltplan bitte.

Vielen Dank für Ihre Antworten. Wenn ich es richtig verstanden habe, muss ich für die Kommunikation mit dem Rechner die Pins 0 und 1 verwenden und für die Ausgabe zum anderen Gerät die Pins 10 und 11. Die Bibliothek SoftwareSerial wird verwendet. Dieser Test gehört zu einem größeren Projekt: Ich steuere mit Arduino einen DC-Motor über einen Motioncontroller von Faulhaber. Das hat auch funktioniert. Leider kann man diesen Motioncontroller nicht mehr kaufen. Faulhaber hat jetzt eine neue Generation von Motioncontrollern; natürlich hat sich auch die Software geändert, und das wirft jetzt die Frage auf, warum es nicht mit dem neuen Motioncontroller von Faulhaber funktioniert. Naja, und dazu will ich auch auf Arduino Giga mit dem Giga Display umsteigen. Da habe ich mir wieder etwas vorgenommen. :smiley:

Wenn du zur Kommunikation mit dem PC die USB-Schnittstelle verwendest, passiert das ohne weiteres Zutun.

Wenn du das schon machst, warum zeigst du das nicht ?

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX (an diese Pins verbinden)

void setup() {
  Serial.begin(9600);      // USB Serial
  mySerial.begin(9600);    // Serielle Verbindung zur externen Linie
  Serial.println("Gib Text ein:");
}

void loop() {

  if (Serial.available()) {
    String input = Serial.readStringUntil('\n');
    input.trim();
    // Weiterleiten über externe TX-Schnittstelle
    mySerial.println(input);
    // Bestätigung an USB-SERIAL
   // Serial.println("Weitergeleitet: ");
    Serial.println(input);

  }

}

Die Pin 0/1 sind mit der USB-Schnittstelle parallel verbunden.

Hast Du nix am USB-Port zur Kommunikation dran, kannst Du die ungehindert verwenden.
Nur drauf achten, dass evtl. das programmieren erst geht, wenn die Hardware abgeklemmt ist.

Und ja, vom Prinzip her würde Dein jetziger Code auch tun.
Allerdings ist das String-Geraffel unglücklich gewählt.
Darum hatte ich Dir eine Vorlage ohne String gebaut, in der Du dann auch siehst wie Du an die Information des Inhaltes kommst und passend darauf reagieren kannst.

Du könntest jetzt die verschiedenen Commandos neu zuordnen und Dir eine komplette Umsetzungstabelle bauen.

Das mag ja jetzt alles stimmen, nur warum zeigst du hier immer nur alles Häppchenweise ? Diese Salamitaktik kommt nie gut an.
Schreibe und zeige doch mal genau und ausführlich was du wie machen möchtest. Und zeige auch Links der verwendeten Bauteile.

Wenn Du eine RS232 Schnittstelle mit den Pins des Arduino UNO R3 verbindest machst Du den Arduino kaputt.
Grüße Uwe

Sorry, ich habe vergessen zu erwähnen, dass die Verbindung über den MAX3232 stattfindet.

Vielen Dank Für die Vorlage ohne String:)

Was meinst du mit „Häppchenweise“? Ich habe am Anfang nach einem einfachen Test-Sketch für eine serielle Kommunikation gefragt. Ich habe auch Antworten bekommen, die mir weitergeholfen haben, und bin dafür auch dankbar.

Na dann ist doch alles prima.