Go Down

Topic: Senden mehrerer Hex-Werte (Read 4143 times) previous topic - next topic

Chris72622

Hallo,

ich würde gerne mehrere Hex-Werte senden.

Ist die Verwendung eines Arrays in Kombination mit einer for-Schleife die beste Möglichkeit um das hier kompakter zu schreiben:

Code: [Select]
  Serial.write(0x52);
  Serial.write(0x54);
  Serial.write(0x45);
  Serial.write(0x3F);
  Serial.write(0x0D);
  Serial.write(0x0A);
  Serial.write(0x0D);
  Serial.write(0x0A);
  Serial.write(0x3D);
  Serial.write(0x31);
  Serial.write(0x0D);
  Serial.write(0x0A);
  Serial.write(0x0D);
  Serial.write(0x0A);
  Serial.write(0x23);


Gruß Chris
Bilnk wtiohut daley.

Eisebaer

oder für schreibfaule:

Code: [Select]

S(0x52);S(0x54);S(0x45);S(0x3F);S(0x0D);S(0x0A);S(0x0D);S(0x0A);S(0x3D);
S(0x31);S(0x0D);S(0x0A);S(0x0D);S(0x0A);S(0x23);

void S(w) {
  Serial.write(w);
}


gruß stefan

Chris72622

Für was steht das "w"?

Gruß Chris
Bilnk wtiohut daley.

Eisebaer


michael_x

#4
Aug 20, 2013, 03:39 pm Last Edit: Aug 20, 2013, 03:54 pm by michael_x Reason: 1
Ich würde das entweder so schreiben :

Code: [Select]
Serial.println("RTE?");
Serial.println();
Serial.println("=1");
Serial.println();
Serial.print("#");


Oder ein byte Array mit dem obigen Text incl. der 0x0D 0x0A Zeichen nehmen, und das direkt ausgeben
Code: [Select]
const char myArray[] = "RTE?\r\n\r\n=1\r\n\r\n#";
Serial.write((byte*)myArray,strlen(myArray)); // Write a byte array


Nachtrag:
Sollte dasselbe sein wie
Code: [Select]
const byte myArray[] = { 0x52, 0x54, 0x45, 0x3F, 0x0D, 0x0A, 0x0D, 0x0A, 0x3D, 0x31, 0x0D, 0x0A, 0x0D, 0x0A, 0x23  };
Serial.write(myArray,sizeof(myArray));

Schachmann

#5
Aug 20, 2013, 03:55 pm Last Edit: Aug 20, 2013, 04:07 pm by Schachmann Reason: 1
Hallo,

wenn der String wirklich den Hex-Zahlen entspricht (ich habe das nicht nachgeprüft), spricht sicher auch nichts gegen
Serial.println("RTE?\r\n\r\n=1\r\n\r\n#");

Gruß,
Ralf

Chris72622

Ah- ok.

Das Ergebnis müsste das selbe sein, meinst Du; Ralf?

Gruß Chris
Bilnk wtiohut daley.

michael_x

Bis auf das letzte 0x0D 0x0A
;)

Schachmann

Ja, ich denke schon. Folgender Sketch

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

void loop() {
  Serial.print("RTE?\r\n\r\n=1\r\n\r\n#");
 
  delay(5000);
}


bringt in Hyperterm folgendes Ergebnis: (siehe Bild)

Das scheint also zu passen. Wenn Du, wie von mir oben angegeben, ein Serial.Println() benutzt, wird halt noch ein 0x0D, 0x0A angehängt.

Gruß,
Ralf

rudirabbit

Code: [Select]
Serial.print("RTE?\r\n\r\n=1\r\n\r\n#");

C (++) wird wohl nie meine Muttersprache  :smiley-red:
Bitte um eine Erklärung ..
Arduino UNO,MEGA,DUE 
Dunkel die andere Seite ist. - Klappe, Yoda, und iss deinen Toast :-)

Serenifly

Das ist nicht C-spezifisch

\r = carriage return
\n = line feed

\ dient dabei als escape character. Deshalb muss man "\\" schreiben wenn man wirklich einen Backslash will.

Schachmann

Erklärung der Character-Literale und der ESC-Sequenzen: http://www.elektronik-bastelkeller.de/C_Ardu_3_6.php

Gruß,
Ralf

michael_x

Na ja, C-spezifisch ist es schon, aber du sollst ja hier was lernen ;)

Ralfs Link zeigt dir auch eine Alternative:
bis du dich an '\n' gewöhnt hast, kannst du auch '\x0A' nehmen, falls dir das lieber ist,
oder wenn es dir eher auf den hex-Code des Zeichens als auf seine Bedeutung (newline) ankommt.

Serenifly

Ok, es kommt von C, aber das funktioniert in Java, C# und anderen Sprachen mit C-ähnlicher Syntax genauso. Du hast dort lediglich Methoden wie newline(), die dir Plattform-abhängig eine neue Zeile erzeugen. Aber gerade wenn man etwas an eine andere Maschine schickt kann man sich darauf nicht unbedingt verlassen, dass die Sequenz gleich ist.

rudirabbit

Ahh... jetzt klingelts, war wohl das bekannte Brett vor Kopf - Danke !
Arduino UNO,MEGA,DUE 
Dunkel die andere Seite ist. - Klappe, Yoda, und iss deinen Toast :-)

Go Up