Go Down

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

Tommy56

@hotsystems: Stimmt.

Ich weiß aber trotzdem nicht, was er eigentlich will.

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

HotSystems

Ich weiß aber trotzdem nicht, was er eigentlich will.
Genau, leider sind seine Erklärungen nicht sehr aussagekräftig.

Evtl. hat er ja demnächst noch weitere Infos für uns.
Jedenfalls ist dein Tipp schon mal der richtige Ansatz, er muss es nur verstehen und umsetzen.
Gruß Dieter

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

Techniker89

Code: [Select]

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

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

Mit dem Zusammensetzen wäre es insgesamt übersichtlicher geworden, weil mit den Zahlen, die hinter das 'B' kommen, bereits gearbeitet wird. Danke für deinen Code. Ich glaube, so werde ich es machen. Warum verwendest du einmal 'write' und einmal 'print'?

HotSystems

Mit dem Zusammensetzen wäre es insgesamt übersichtlicher geworden, weil mit den Zahlen, die hinter das 'B' kommen, bereits gearbeitet wird. Danke für deinen Code. Ich glaube, so werde ich es machen. Warum verwendest du einmal 'write' und einmal 'print'?
Ups, habe ich übersehen. Sollte eigentlich "print" sein, funktioniert hier aber beides.
Hier eine Erklärung: Serial.write

Das mit dem Zusammensetzen kannst du doch auch noch machen, wenn du den Code von Tommy nimmst. Das funktioniert dann auch.

Aber eine Erklärung was genau du machen möchtest, fehlt noch. Dann können wir besser helfen.

Gruß Dieter

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

Techniker89

Hallo,

ich habe nun als Code des Senders den von agmue aus Post 30 genommen, der Empfänger hat den Code von HotSystems aus Post 42. Wenn ich setzt aber

Code: [Select]
if(x=="W1") digitalWrite(W1, LOW);

schreibe, funktioniert es nicht.

Auch mit
Code: [Select]
if(x=="W1\n") digitalWrite(W1, LOW); klappt es nicht.

Tommy56

Zeichenketten kann man so nicht vergleichen. Wie ist x definieret? Evtl. wäre da ein strcmp sinnvoll. Infos über Zeichenketten gibt es hier.

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

Techniker89

x ist als character definiert.

Code: [Select]

char y = "W1";

if(strcmp(x,y)==0) digitalWrite(W1, LOW);


So funktioniert es leider nur, wenn y ein einzelnes Zeichen ist.

Tommy56

#52
Feb 22, 2017, 03:12 pm Last Edit: Feb 22, 2017, 03:16 pm by Tommy56
es macht ja auch keinen Sinn, ein einzelnes Zeichen mit einer Zeichenkette zu vergleichen. Schau Dir mal die verlinkten Grundlagen zu Zeichenketten in C an, dann wirst Du es evtl. verstehen.

Gruß Tommy

Edit: Die Zeile ist auch falsch: char y = "W1";
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Techniker89

#53
Feb 22, 2017, 03:25 pm Last Edit: Feb 22, 2017, 03:43 pm by Techniker89
Quote
// Vergleiche ergeben die Differnz des Zeichencodes des ersten ungleichen Zeichens
// aber eigentlich interessiert nur < 0, > 0 oder gleich 0
zahl = strcomp(quelle,vergleich); // ergibt 8 -> größer 0 also ist quelle größer
zahl = strcomp(vergleich,quelle); // ergibt -8 -> kleiner 0 also ist quelle kleiner
So habe ich es ja gemacht (Was ist der Unterschied zwischen 'strcomp' und 'strcmp'?) Quelle und Vergleich sind bei mir x und y. Also sollte es ja eigentlich funktionieren.

Quote
Die Zeile ist auch falsch: char y = "W1";
Was ist daran falsch?
Edit: Denkfehler, hab's jetzt verstanden.

Hier nochmal der komplette Code:

Code: [Select]
 
char x;
char y = 'W';

-LOOP-
if (Serial3.available())  {
    x = Serial3.read();
  }
  if(strcmp(x,y)==0) digitalWrite(W1, LOW);
  else digitalWrite(W1, HIGH);


Kann ich, anstatt y zu benutzen, den zu vergleichenden String auch direkt in die strcmp-Klammer schreiben?

michael_x


char y[] und char* y sind sehr ähnlich, aber etwas völlig anderes als ein char x .

Auch "W" und 'W' sind zwei komplett verschiedene Sachen.

strcmp geht nur mit "Texten in Doppelten Anführungszeichen" , char* oder char array[].
Sonst bekommst du den Hinweis
Quote
invalid conversion from 'char' to 'const char*'

Tommy56

Einzelne Zeichen musst Du wieder mit == vergleichen.
Code: [Select]

char x = 'W';
char c;

if (c==x) tu was


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

Techniker89

Ok, soweit habe ich das verstanden. Allerdings habe ich keine Ahnung, wie ich jetzt eine empfangene Zeichenkette so in einer Variable speichern kann, dass ich sie mit einer anderen vergleichen kann.

agmue

#57
Feb 22, 2017, 05:39 pm Last Edit: Feb 22, 2017, 05:42 pm by agmue
Ok, soweit habe ich das verstanden. Allerdings habe ich keine Ahnung, wie ich jetzt eine empfangene Zeichenkette so in einer Variable speichern kann, dass ich sie mit einer anderen vergleichen kann.
Eine Zeichenkette speicherst Du in einem Feld ab. Dann vergleichst Du zwei Felder auf Gleichheit. Ein Demosketch (Zeilenende beim seriellen Monitor auf "NL" stellen):

Code: [Select]
const byte ledPin = 13;
const char y[] = {"W1"};
char x[10], c;
byte j;

void setup() {
  Serial.begin(9600);
  Serial.println("Anfang");
  pinMode(ledPin, OUTPUT);
}

void loop() {
  if (Serial.available()) {
    c = Serial.read();
    if (c == '\n') {
      x[j] = '\0';
      j = 0;
      Serial.println(x);
    } else {
      x[j] = c;
      j++;
    }
  }
  if (strcmp(x, y) == 0) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

Go Up