Problem mit Serieller Kommunikation zw. Uno & Mega

Hallo Leute,

arbeite derzeit an einem Projekt, bei dem ein Arduino Uno und Mega miteinander über die serielle Schnittstelle kommunizieren müssen. Hatte den Uno soweit fertig programmiert und mittels des seriellen Monitors getestet. Als ich allerdings mit dem Mega die Datenübertragung testen wollte, habe ich festgestellt dass es überhaupt nicht funkitoniert.

Habe mal Testweise einen Sktech geschrieben, wobei der Empfangsteil auf dem Uno auch so in meinem Projekt verwendet wird.

Der Sketch des Mega (in diesem Fall Sender):

void setup() {
  Serial1.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() {
  Serial1.print('1');
  Serial1.print('\n');
  digitalWrite(13, 1);
  delay(1000);
  Serial1.print('0');
  Serial1.print('\n');
  digitalWrite(13, 0);
  delay(1000);
}

Habe bewusst Serial.print genommen, da später auch Buchstaben und Zahlen übertragen werden müssen.

Der Sketch des Uno:

const byte Serielle_Daten_empfangen_Anzahl = 20;
char Serielle_Daten_empfangen_Buffer[Serielle_Daten_empfangen_Anzahl];
byte Serielle_Daten_empfangen_Counter = 0;

bool Serielle_Daten_vollempfangen = false;

bool Status;

void setup(){
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop(){
  Serielle_Daten_empfangen();
  digitalWrite(13, Status);
}

void Serielle_Daten_empfangen(){
  while(Serial.available() > 0){
    Serielle_Daten_empfangen_Buffer[Serielle_Daten_empfangen_Counter] = Serial.read();
    if(Serielle_Daten_empfangen_Buffer[Serielle_Daten_empfangen_Counter] == '\n'){
      Serielle_Daten_vollempfangen = true;
      Serielle_Daten_empfangen_Counter = -1;
    }
    Serielle_Daten_empfangen_Counter++;
  }
  if(Serielle_Daten_vollempfangen == true){
    Status = Serielle_Daten_empfangen_Buffer[0];
  }
}

Warum funktioniert dieser Code ohne Probleme mit dem Seriellen Monitor, allerdings nicht mit zwei Arduinos?
Was macht der Monitor anderst als Serial.print im Program?

Vielen Dank im Vorraus :slight_smile:

mfg Skyliiine

PS: Frohes neues Jahr :slight_smile:

Weil die serielle des UNO schon mit dem USB Wandler verbunden ist.
Oder du die Pins nicht gekreuzt hast.

Warum schmeckt dir I2C nicht?

Ups, dass habe ich vergessen zu erwähnen :confused:

Der Mega hängt am USB und versorgt den Uno mit Spannung, der USB Port des Uno ist frei.
+5V des Mega auf Vin des Uno, Gnd auf Gnd, RX1(19) auf TX(1) und TX1(18) auf RX(0)

I2C kommt aufgrund der Leitungslänge von rund 8m leider nicht in Frage.

der USB Port des Uno ist frei.

Der Wandler ist aber trotzdem drauf!
Der verschwindet ja nicht einfach.

Außerdem ist 8m auch für TTL Serial recht weit.
Vielleicht möchtest du RS232C verwenden.

+5V des Mega auf Vin des Uno,

Warum das denn...
Dann kann sein, dass es für den UNO nicht mehr reicht.
Der Regler nimmt schließlich noch mal 1 oder 2 Volt.
An Vin ist das Minimum 7V.
So steht es in der UNO Doku

skyliiine:
+5V des Mega auf Vin des Uno

Dürfte erst mal schon nicht funktionieren. Vin braucht mehr Spannung.

Gruß Tommy

Hat bis jetzt immer so funktioniert :cold_sweat:
Hab mal eben auf ein externes 12V Netzteil umgesteckt. Macht aber auch keinen Unterschied.

Der Wandler ist aber trotzdem drauf!
Der verschwindet ja nicht einfach.

Dann wäre ja eine Serielle Kommunikation nie möglich, oder? Zudem hatt diese schon funktioniert. Habe bereits Daten an den Uno gesendet auch auch welche zurück erhalten.

Mein Problem besteht darin, dass meine Variable Status nicht geschrieben wird:

Status = Serielle_Daten_empfangen_Buffer[0];

Auch damit funkioniert es nicht:

Status = Serielle_Daten_empfangen_Buffer[0] - '0';

skyliiine:
Hat bis jetzt immer so funktioniert

Liest sich wie: Ichngehe immer bei rot über die Ampel, hat bisher immer funktioniert.

Glück gehabt.
Sieh dir das Datenblatt dazu an, das sagt was anderes.

Liest sich wie: Ichngehe immer bei rot über die Ampel, hat bisher immer funktioniert.

Liest sich wie: Hab zwar keine Antwort auf sein eigentliches Problem, aber wir hacken mal auf einem Fehler rum, der eigentlich nichts zur Sache tut.

Hallo,
benutze für den Uno eine Softserial, dann kann das gehen. Der Uart macht doch was mit den Pegeln an pin0 ,pin1 auch wenn von der USB nichts kommt.

Heinz

Nachtrag : warum setzt Du denn den counter auf -1 , überdenke doch noch mal das Einlesen. Du kannst auch über den Monitor was eingeben um das zu testen.

skyliiine:
Liest sich wie: Hab zwar keine Antwort auf sein eigentliches Problem, aber wir hacken mal auf einem Fehler rum, der eigentlich nichts zur Sache tut.

Wieso tut dein Fehler nichts zur Sache ?

Der Vin braucht einfach mindestens 6,5 Volt.
Das ist es dein Fehler, also deine Sache, wenn du nur 5 Volt drauf gibst.
Aber wenn du meine Antwort nicht verstehst, einfach mal im Datenblatt nachlesen. Oder ist das ein Problem ?

Rentner:
benutze für den Uno eine Softserial, dann kann das gehen. Der Uart macht doch was mit den Pegeln an pin0 ,pin1 auch wenn von der USB nichts kommt.

Heinz

Okay, dachte eigentlich wenn die USB Verbindung getrennt ist, dass über die Pins 0 und 1 die serielle Verbindung zu einem anderen Arduino aufgebaut werden kann. Steht ja nicht ohne Grund RX und TX dran, oder?
Außerdem hat das Senden von Eingängen an meinem UNO über die Schnittstelle an den Mega bereits funktioniert.
Werde ich aber morgen trotzdem mal testen

HotSystems:
Wieso tut dein Fehler nichts zur Sache ?

Der Vin braucht einfach mindestens 6,5 Volt.
Das ist es dein Fehler, also deine Sache, wenn du nur 5 Volt drauf gibst.
Aber wenn du meine Antwort nicht verstehst, einfach mal im Datenblatt nachlesen. Oder ist das ein Problem ?

Weil ich den Fehler zu dem Zeitpunkt deines posts ja bereits behoben hatte, hab ja geschrieben dass ich ein externes 12V Netzteil angeschlossen habe und es trotzdem nicht funktioniert.

Nachtrag : warum setzt Du denn den counter auf -1 , überdenke doch noch mal das Einlesen. Du kannst auch über den Monitor was eingeben um das zu testen.

Da der counter direkt nach der while Schleife um eins erhöht wird und damit dann auf 0 steht. Das Einlesen habe ich bereits mit dem seriellen Monitor getestet, funktioniert ohne Probleme (wenn auch nicht Perfekt programmiert). Wenn Daten von meinem Mega an den Uno gesendet werden tut sich allerdings nichts.

Also doch nicht verstanden.
Nochmal:
Mein Beitrag bezog sich hierauf:

Hat bis jetzt immer so funktioniert

Ok, alles klar.

Hallo,

Ahh , ok soweit hatte ich mich nicht reingehangen, Deine langen Variablenamen haben mich etwas verwirrt. Wenn das mit der Eingabe über den Monitor klappt dann geht das aich über softserial von dem zweiten Arduino aus. Allerdings kann die Softserial nicht sehr schnell, aber 9600 geht auf jeden Fall.
Heinz

 Serial1.print('1');

versendet nicht den Wert 1 sondern das Zeichen "1" was dem Wert 49 (dezimal) entspricht
siehe Serial.print() - Arduino Reference

Warum funktioniert dieser Code ohne Probleme mit dem Seriellen Monitor, allerdings nicht mit zwei Arduinos?

Funktioniert eigentlich schon aber nicht so wie Du glaubst.
Was siehst Du auf dem Monitor? "0" und "1"? wenn Du die Zeichen 0 und 1 auf dem Monitor siehst dann hast Du nicht die Werte 0 und 1 übertragen.

Grüße Uwe

Rentner:
Hallo,

Ahh , ok soweit hatte ich mich nicht reingehangen, Deine langen Variablenamen haben mich etwas verwirrt. Wenn das mit der Eingabe über den Monitor klappt dann geht das aich über softserial von dem zweiten Arduino aus. Allerdings kann die Softserial nicht sehr schnell, aber 9600 geht auf jeden Fall.
Heinz

So, nachdem ich auch mit SoftwareSerial keinen Erfolg hatte bin ich doch sehr stutzig geworden und hab mal den Uno ausgetauscht, vielleicht stimmt etwas mit ihm nicht. Nachdem das auch nichts gebracht hat habe ich mir den Mega vorgenommen und mal einen anderen Seriellen Port genommen und siehe da. Der TX1 vom Mega ist schrott :o >:( Hat ja zum Glück noch noch zwei weitere die nicht benutzt werden :grinning:

 Serial1.print('1');

versendet nicht den Wert 1 sondern das Zeichen "1" was dem Wert 49 (dezimal) entspricht
siehe Serial.print() - Arduino Reference
Funktioniert eigentlich schon aber nicht so wie Du glaubst.
Was siehst Du auf dem Monitor? "0" und "1"? wenn Du die Zeichen 0 und 1 auf dem Monitor siehst dann hast Du nicht die Werte 0 und 1 übertragen.

Grüße Uwe

Wusste zwar dass Print als ASII Zeichen überträgt und Write als Binär, aber dass das einen Unterschied ausmacht :slightly_frowning_face: Muss ich in Zukunft besser drauf aufpassen. Hab das Programm mittlerweile komplett auf Write umgestellt.

Danke euch für die Hilfe :slight_smile:

Serial.print() schickt auch Werte und nicht nur Zeichen.
Der Unterschied sind die Gänsefüßchen.

Lies Dir den Link den ich eingefügt habe gut durch:

Serial.print(78) gives "78"
...
Serial.print('N') gives "N"

Grüße Uwe

Serial.print() schickt auch Werte und nicht nur Zeichen.

Diesen Satz halte ich für mindestens missverständlich.

Serial.print macht je nach Datentyp des Arguments Unterschiedliches:
Serial.print(78); wandelt die Zahl 78 in einen Text, und sendet diesen über die Serielle Schnittstelle als zwei Zeichen, '7' und '8'.

Der Unterschied sind die Gänsefüßchen.

Richtig, das ist ein anderer Datentyp.

Will man die Zahl 78 (die wahlweise auch als 0x4E geschrieben werden kann) als 1 Zeichen (als Binär-Wert) senden, wäre dies das gleiche wie ein 'N'.

Das kann man mit Serial.print((char)78); sehen oder klarer noch mit Serial.write(78);

Der Uno ist der Empfänger:
"pinMode(13, OUTPUT);"
was soll ich mit Output empfangen?
Wenn über USB-Seriell nichts reinkommt, kannste den nehmen, hab ich auch so gemacht. Ansonsten -> SoftwareSeriell!