Go Down

Topic: Drei Arduinos miteinander verbinden (Read 7030 times) previous topic - next topic

agmue

#30
Feb 04, 2017, 12:28 pm Last Edit: Feb 04, 2017, 12:54 pm by agmue
Nein!
Stimmt, danke, ist korrigiert!

@Techniker89: Da ich keine zwei Mega2560 habe, nutze ich einen UNO als Datensender. Anstelle Serial. mußt Du beim Mega halt Serial3. benutzen. Verbunden habe ich TX vom UNO mit RX3 vom Mega. Der UNO sendet Text zum Mega, der es auf dem seriellen Monitor anzeigt.

Code: [Select]
// UNO als Sender
uint32_t aktMillis, ausgabeMillis, intervall = 200;
char zeichen = 'A', kette[20] = {"Hallo  "};

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

void loop() {
  aktMillis = millis();
  if (aktMillis - ausgabeMillis >= intervall) {
    ausgabeMillis = aktMillis;
    kette[6] = zeichen;
    Serial.println(kette);
    zeichen++;
    if (zeichen > 'Z') {
      zeichen = 'A';
    }
  }
}


Code: [Select]
// Mega2560 als Empfänger
void setup() {
  Serial.begin(9600);
  Serial3.begin(9600);
  Serial.println("Anfang");
}
void loop() {
  if (Serial3.available())  {
    char x = Serial3.read();
    Serial.print(x);
  }
}


Ausgabe:
Hallo A
Hallo B
Hallo C
Hallo D
Hallo E
Hallo F
Hallo G
Hallo H

Ich hoffe, es hilft Dir
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Techniker89

#31
Feb 04, 2017, 01:48 pm Last Edit: Feb 04, 2017, 01:53 pm by Techniker89
Code: [Select]
uint32_t aktMillis, ausgabeMillis, intervall = 200;
char zeichen = 'A', kette[20] = {"Hallo  "};

Wenn du mir die beiden Zeilen noch erklären könntest, wäre ich dir sehr dankbar.

agmue

uint32_t 32 Bits = 4 Bytes große vorzeichenlose (u) ganzzahline (int) Variable, wird für millis() benötigt
aktMillis Variable für die aktuelle Zeit in Millisekunden seit Reset
ausgabeMillis Zeitpunkt seit der letzten Aktion in in Millisekunden seit Reset
intervall Zeitdifferenz bis zur nächsten Aktion in Millisekunden
zeichen Variable für das zu verändernde Zeichen
kette[] Zeichenkette für mehrere Buchstaben

Puristen würden intervall als Konstante festlegen.

Die Zeichenkette enthält tatsächlich "Hallo  " und '\0' als Abschlußzeichen. In kette[20] kannst Du daher nur maximal 19 Zeichen speichern.

Alle Klarheiten beseitigt?
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Techniker89

Danke, aber was genau macht

Code: [Select]
kette[20] = {"Hallo  "}
?

kette ist wieder ein Variablenname? 20 steht für die Anzahl der Zeichen, die in ihr gespeichert werden sollen. = {"Hallo  "} versteh ich noch nicht so wirklich. Hast du dazu irgendeinen Link?

agmue

#34
Feb 04, 2017, 05:56 pm Last Edit: Feb 13, 2017, 09:02 pm by agmue
kette ist wieder ein Variablenname?
Ja. Nicht Integer oder Float, sonder Zeichenkette, ein Feld (array) aus Elementen mit einem Zeichen je Element.

20 steht für die Anzahl der Zeichen, die in ihr gespeichert werden sollen.
Ja fast, da am Ende noch '\0' als Abschluß stehen muß, sind es nur 19 "verwertbare" Zeichen.

= {"Hallo  "} versteh ich noch nicht so wirklich.
Damit wird ein zum Teil mit Zeichen vorbesetztes Feld erzeugt. kette[0] hat den Inhalt 'H'.

string
C von A bis Z dort Arrays
Das C Tutorial
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Tommy56

Von mir auch noch eine Ergänzung: Zeichenketten in C

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Techniker89

Danke, es klappt. Allerdings stelle ich mich mal wieder etwas schlecht an, was das Verändern einzelner Zeichen mitten in der Zeichenkette angeht.

Tommy56

Was willst Du denn machen?

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Techniker89

Ich möchte fünfstellige Zeichenketten übertragen, die alle mit einem 'B' beginnen und im Rest aus Ziffern (dann halt als Buchstaben) bestehen. Je nach Information, die übergeben werden soll, wird diese Zeichenkette beispielsweise auf "B6606" oder "B21" gesetzt und über TX zum anderen Arduino geschickt.

Tommy56

Schön und wo ist das Problem? Man muss Dir doch wohl nicht jeden Erklärungsbuchstaben einzeln aus der Nase ziehen.

Schreib mal 2 Beispiele hin, was Du wi verketten willst.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Techniker89

Drücke ich mich wirklich so kompliziert aus?

Wenn Ereignis 1 (z.B. Taster), setze die Zeichenkette auf B6606 und übertrage sie.
Bei Ereignis 2 auf B6607 usw.
...

Tommy56

Ja, machst Du. Ich probiers trotzdem mal.
Code: [Select]

char buffer[10];
...
strcpy(buffer,"B");
strcat(buffer("6606"); // Wenn Du was anhängen willst.
Serial.println(buffer);

Falls ich Deine "Beschreibung" richtig verstanden habe.
Ansonsten kannst Du den Rest hier nachlesen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

HotSystems

Drücke ich mich wirklich so kompliziert aus?

Wenn Ereignis 1 (z.B. Taster), setze die Zeichenkette auf B6606 und übertrage sie.
Bei Ereignis 2 auf B6607 usw.
...
Ich habe nicht gesamten Thread verfolgt, aber erkläre bitte mal kurz, warum du die Strings zusammensetzten musst und nicht einfach folgendes sendest:

Beispielcode!
Code: [Select]

if (digitalRead.PinDx == LOW) {
  Serial1.write("B9101");                             
  Serial1.print('\n');
}

else if (digitalRead.PinDy == LOW) {
  Serial1.write("B9201");                             
  Serial1.print('\n');
}
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Doc_Arduino

Hallo,

ich würde die zu sendende Nachricht als struct bauen, einzelne Elemente immer ändern, dann kann man das struct als ganzes übertragen.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

HotSystems

Code: [Select]

...
strcpy(buffer,"B");
strcat(buffer("6606"); // Wenn Du was anhängen willst.
Serial.println(buffer);

Hi Tommy, dir ist ein kleiner Fehler unterlaufen.

Sollte so sein:

Code: [Select]

strcat(buffer, "6606");


Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Go Up