Pages: [1]   Go Down
Author Topic: Zwei Arduinos Seriell verbinden  (Read 1398 times)
0 Members and 1 Guest are viewing this topic.
Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

ich will meinen UNO mit dem Code:

Code:
void setup()
{
  Serial.begin(9600);
}

void loop()
{
  // send data
  Serial.print('11010101');
  delay(1000);
}

mit meinem Mega:

Code:
byte val;

void setup()
{
  Serial.begin(9600);
  Serial1.begin(9600);

}

void loop()
{
 val = Serial1.read();
 Serial.println(val);
 delay(1000);
}

Seriell verbinden. Also wenn der UNO das Byte (hier als Beispiel: 11010101) per Seriell rausschickt soll der Mega das Byte aufnehmen und speichern. Ich hab das Problem das der Mega jedes mal einen anderen Wert anzeigt / speichert.

Uno RX (Pin 0)  geht auf TX1 (Pin 18) vom Mega
Uno TX (Pin 1) geht auf RX1 (Pin 19) vom Mega

Mega erwartet dann auf Serial1 dann seine Daten.

I²C kann ich nicht nehmen wegen der geplanten Leitungslänge.
« Last Edit: March 24, 2013, 04:26:03 am by Arduinoianer » Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 171
Posts: 3233
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn Du ein binär codiertes Byte senden möchtest, versuche es beim Sender stattdessen mal mit:

  Serial.print(0b11010101);


Und Deine Empfangsschleife ist völlig daneben, weil Du damit Zeichen liest, ohne zu prüfen ob Zeichen vorhanden sind, und weil Du von einer exakten Synchronisierung beider Arduinos ausgehst, die ihre Aktionen auf 1000,0000000 Millisekunden genau synchron halten, ohne dass diese Synchronisierung durch irgendwas gewährleistet wäre.

Versuche auf Empfängerseite also eher eine Empfangsschleife der Art:

void loop()
{
 if (Serial1.available())
 {
   val = Serial1.read();
   Serial.println(val);
 }
}
Logged

Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Jurs,

danke schonmal für die Info.

Hab das mal so angepasst:

Sender:

Code:
void setup()
{
  Serial.begin(9600);
}

void loop()
{
  // send data
  Serial.print(0b11010101);
  delay(1000);
}

Empfänger:

Code:
byte val;

void setup()
{
  Serial.begin(9600);
  Serial1.begin(9600);

}

void loop()
{
 if (Serial1.available())
 {
   val = Serial1.read();
   Serial.println(val,BIN);
 }
}

Raus kommt beim Empfänger aber:

Code:
110010
110001
110011

Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 171
Posts: 3233
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Raus kommt beim Empfänger aber:

Wie sieht es denn mit Deiner Schaltung aus, stimmt die Bezugsmasse für die Pegel an den beiden Arduinos, d.h. hast Du nicht nur RX mit TX und TX mit RX, sondern auch Ground mit Ground verbunden?
Logged

Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

Massen sind verbunden!
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 171
Posts: 3233
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Massen sind verbunden!

Sehr merkwürdig. Schaltung mit verbundenen Massen und passende Sketche, das sollte eigentlich funktionieren.

Testest Du schon mit 40m Leitung dazwischen?
Wenn ja, was für eine Leitung?
Oder testest Du erstmal mit einer kürzeren Leitungslänge?

Haben beide Boards einen 16 MHz Quarz drauf?
Oder sind das Board-Designs, die ihre Frequenz nur über Resonatoren stabil halten?

Ändert sich etwas, wenn Du auf der Empfangsseite die serielle Schnittstelle mal mit einer knapp neben der Soll-Baudrate liegenden Baudrate initialisierst, also z.B. statt
Serial1.begin(9600);
mal versuchen zu empfangen mit:
Serial1.begin(9500);
oder
Serial1.begin(9400);
oder
Serial1.begin(9700);
oder
Serial1.begin(9800);

Wird dann noch etwas empfangen?
Wird es besser/richtiger oder noch schlechter?
Logged

Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

beide haben 16MHz Quarz
Kabellänge ca 10cm


der gibt das hier:

Code:
110010
110001
110011

immer als Block auf einmal aus.... das wundert mich halt!
« Last Edit: March 24, 2013, 07:15:29 am by Arduinoianer » Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 171
Posts: 3233
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

der gibt das hier:

Code:
110010
110001
110011

immer als Block auf einmal aus.... das wundert mich halt!

Verstehe, alles klar soweit, ist nur ein kleiner Fehler beim Sender drin.

Du empfängst den ASCII-String "213".

Das ist die binäre Zahl 0b11010101 umgewandelt als Dezimalzahl in einen String. Sowas macht "print", also der Sender. Der sendet dann die drei Zeichen "213" hintereinander weg statt nur der Zahl in einem Byte binär codiert.

Wenn Du die Zahl als Binärcode senden möchtest, müßte es beim Sender heißen:
Serial.write(0b11010101);
Dann geht bei jedem Senden nur ein Byte über die Leitung.
(Sorry, mein Fehler in meinem ersten Posting für den Sender "print" statt "write" zu schreiben.)
« Last Edit: March 24, 2013, 08:05:21 am by jurs » Logged

Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Jurs,

genau so funktionierts jetzt.

Hier poste ich nochmal den Kompletten Quellcode


Sender (Arduino UNO)

Code:
void setup()
{
  Serial.begin(9600);
}

void loop()
{
  // send data
  Serial.write(0b11111111);
  delay(1000);
}

und der Empfänger Arduino Mega

Code:
byte val;

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

void loop()
{
 if (Serial1.available())
 {
   val = Serial1.read();
   Serial.println(val,BIN);
 }
}

Danke!
Logged

Pages: [1]   Go Up
Jump to: