Arduino Mega - verfälschte Werte bei Serielle Kommunikation

Hallo,

folgendes Szenario: ich besitze zwei Arduino Mega 2560.
Nun möchte ich, dass diese Boards mit ihren Seriellen Schnittstellen kommunizieren. Dabei sende ich mit einem permanent einfach eine ‘3’. Mit dem anderen frage ich permanent auf input ab und gebe diesen dann aus.
Dies hat auch am Anfang gut funktioniert, es kam an, was ich gesendet habe und dies wurde korrekt verarbeitet.
Doch als ich den Code dann erweitert habe, da dies noch lange nicht alles war, was der Mega machen sollte, entstand ein mir unerklärlicher Bug. Die Werte die nun ausgelesen werden, sind nicht mehr die, die ich gesendet habe. Es sind einfach irgendwelche Daten angekommen, die keinen Sinn ergeben haben, es gab kein Schema dahinter und sie waren immer verschieden.

Ich habe ein neues Projekt erstellt und die Codes so simpel gehalten, wie es geht (wie oben beschrieben), habe mit anderen Boards getestet (habe noch ein Uno und ein Raspberry Pi) aber es kamen stetig nur die falschen Ergebnisse.

Der Topf mit Ideen ist mittlerweile leer und ich bin immer mehr verwundert und einfach nur ratlos :o . Hat irgendwer dazu eine Idee? Bin für jede Hilfe dankbar! :slight_smile:

Welch Glück, dass wir hier die Beschaltung und die Sketche auf Sender- und Empfängerseite durch unsere Glaskugeln sehen können...

Ins Blaue geraten: Haben deine Megas eine gemeinsame Masseverbindung?

Bitte Code nachliefern.

sth77:
Ins Blaue geraten: Haben deine Megas eine gemeinsame Masseverbindung?

Gute Idee!

Prankzubi99:
Ich habe ein neues Projekt erstellt und die Codes so simpel gehalten, wie es geht (wie oben beschrieben), habe mit anderen Boards getestet (habe noch ein Uno und ein Raspberry Pi) aber es kamen stetig nur die falschen Ergebnisse.

Aber das lässt böses erahnen. Der Uno hat nur EINE hardwaremäßige serielle Schnittstelle.

Wir brauchen auf jeden Fall den Code und ein Foto des Aufbaus oder eine Zeichnung/Schaltplan!

Sketch vom Sender:

#include <Arduino.h>

void setup(){
   Serial2.begin(9600);
}

void loop(){ 
   Serial2.println(5);
}

Sketch vom Empfänger:

#include <Arduino.h>

void setup(){
   Serial.begin(9600);
   Serial2.begin(9600);
}

void loop(){ 
   if (Serial2.available() > 0) {
       int input = Serial2.read();
       if(input-48 > 0){
           Serial.print("input ist: ");
           Serial.println(input-48, DEC);
       }
   }
}

Der Sender bekommt über seinen USB-Port Strom vom Akku,
das Verbindungskabel ist bei dem Sender bei TX2 und bei dem Empfänger bei RX2.
Der Empfänger ist mit seinem USB-Port an meinem MacBook, wodurch ich die Ergebnisse am Seriellen Monitor sehen kann.

Falls da noch Fragen zum Aufbau sind, kann noch ein Foto geliefert werden.

Nur RX2 nach TX2? Oder wie sth77 geschrieben hat:

sth77:
Ins Blaue geraten: Haben deine Megas eine gemeinsame Masseverbindung?

Ja, wie beschrieben, nur TX2 nach RX2. Das ist die einzige Verbindung von den beiden.

Prankzubi99:
Ja, wie beschrieben, nur TX2 nach RX2. Das ist die einzige Verbindung von den beiden.

Du brauchst ein Bezugspotential. Ohne das geht es nicht. Einfach GND vom einen Arduino
mit dem GND vom anderen Arduino verbinden und es sollte funktionieren.

sth77 hat Recht gehabt. Verdient wohl einen Karmapunkt mehr :slight_smile:

Dein Sketch vom Emfänger ist SCHROTT.

Mit Deinem Sender sendest Du nämlich immer drei Zeichen:

Serial2.println(5);

Damit sendest Du eine ASCII-Ziffer '5' und zusätzlich zwei Steuerzeichen für "Carriage Return" und "Newline".

Also: Zeilenende und am linken Rand eine neue Zeile beginnen.

Das, was Du sendest, wird von Deinem Empfänger-Code NICHT angemessen interpretiert und wiedergegeben.

Vielleicht probierst Du auf der Empfängerseite mal das:

void loop()
{
char c=Serial2.read();
if( c!=-1) Serial.write(c);
}

Mit Serial.write() gibst Du empfangene Steuerzeichen genau so weiter wie sie empfangen wurden.

Und eine -1 liest Du aus Serial2 immer dann aus, wenn der Fmpfangspuffe von Serial2 leer ist, also tatsächlich gar kein Zeichen empfangen wurde.

jurs:
Und eine -1 liest Du aus Serial2 immer dann aus, wenn der Fmpfangspuffe von Serial2 leer ist, also tatsächlich gar kein Zeichen empfangen wurde.

Na ja, wenn man das Ergebinis in einen Integer packt schon, sonst ist das von einem übertragenen 0xFF nicht unterscheidbar.

Besser wäre:

void loop()
{
  if (Serial2.available()) {
    Serial.write(Serial2.read());
  }
}

Katsumi:
Du brauchst ein Bezugspotential. Ohne das geht es nicht. Einfach GND vom einen Arduino
mit dem GND vom anderen Arduino verbinden und es sollte funktionieren.

Danke, ich betrachte das gerade aus einem ganz anderen Blickwinkel :slight_smile: Werde ein wenig probieren und mich mit Ergebnissen melden!

jurs:
Dein Sketch vom Emfänger ist SCHROTT.

Mit Deinem Sender sendest Du nämlich immer drei Zeichen:

Serial2.println(5);

Damit sendest Du eine ASCII-Ziffer ‘5’ und zusätzlich zwei Steuerzeichen für “Carriage Return” und “Newline”.

Also: Zeilenende und am linken Rand eine neue Zeile beginnen.

Das, was Du sendest, wird von Deinem Empfänger-Code NICHT angemessen interpretiert und wiedergegeben.

Vielleicht probierst Du auf der Empfängerseite mal das:

void loop()
{
char c=Serial2.read();
if( c!=-1) Serial.write(c);
}

Mit Serial.write() gibst Du empfangene Steuerzeichen genau so weiter wie sie empfangen wurden.

Und eine -1 liest Du aus Serial2 immer dann aus, wenn der Fmpfangspuffe von Serial2 leer ist, also tatsächlich gar kein Zeichen empfangen wurde.

Danke für deinen Beitrag, aber ich wollte lieber den Int Wert Empfangen und Verarbeiten, da die ASCII Codierung nicht gerade schwierig ist und mir Zeichen wie “Carriage Return” und “Newline” direkt ausgegeben werden. Da die mich bei dem momentanen Szenario aber nicht interessieren kann man bei Zeile 11, dass ich darauf prüfe, ob eines dieser Zeichen gesendet wurde und sortiere diese dort aus. Mein Problem sind auch keine negativen Ergebnisse, sondern Ergebnisse im Bereich 50-400.

Und mach in deinen Sendetestsketch noch ein böses delay rein

Die gemeinsame Masseverbindung hat das Problem beseitigt, vielen Dank an alle!