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?”
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
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....
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.
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.
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.