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.
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?
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 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
Hat bis jetzt immer so funktioniert
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';
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.
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
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.
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
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 Muss ich in Zukunft besser drauf aufpassen. Hab das Programm mittlerweile komplett auf Write umgestellt.
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!