Konstante Stringlänge

Hallo, ich möchte mehrere 2-Bytewerte über die serielle Schnittstelle ausgeben.
Dabei ist es notwendig, daß die Anzahl der Stellen des übertragenen Strings immer gleich sind.
Egal ob Bit, Byte oder String. Aber alleine als Bytewert werden die anführenden Nullen immer gelöscht und irgendwie will das mit dem Formatieren nicht gelingen.
Wie löst man sowas am einfachsten?

Du willst da keine Strings übertragen, sondern Binärdaten. Das ist nicht ganz das gleiche. Rohe Zahlen schickt man mit Serial.write().

Oder willst du die Zahlen als Strings darstellen?

Hmmm, damit habe ich auch schon experimentiert. Leider ohne Erfolg.
Ich habe :
unsigned long duration2;
und nach
Serial.write(duration1)
kommt nur ein Zeichen : oder > oder so an. :frowning:

Mir ist das eingentlich egal wie das dargstellt wird, ich möchte nur eine konstante Länge...

byte buf[16];
for(int i = 0; i < 16; i++) Serial.write(buf*);*

Serial.write() schreibt entwerder ein Byte oder ein Array aus Bytes definierter Länge:

Du kannst es wahrscheinlich so machen:

Serial.write((byte*)&duration2, 4);

Das nimmt die Adresse von duration2 (mit &), welche dann ein long* ist. Dieser Pointer wird auf einen Pointer auf Byte gecastet, womit du dann den long as Byte Array ansprichst. Ein long hat 4 Byte, was als 2. Parameter übergeben wird.

EDIT:
Alternativ kannst du dir mit sprintf() Strings konstanter Länger erzeugen:
http://www.cplusplus.com/reference/cstdio/printf/

unsigned long val = 325354L;
char buf[12];
sprintf(buf, "%.10d", val);

Das sorgt dafür, dass die Zahlen immer konstant 10 Zeichen breit sind. Wenn sie kleiner sind wird mit führenden Nullen aufgefüllt. Das Array buf muss mindestens eins Größer als die Länge sein. Wenn du negative Zahlen hast, braucht du noch 1 für das Vorzeichen.

@ sschultewolter

for(int i = 0; i < 16; i++) Serial.write(buf);

Wenn dann buf[i]

EDIT:
Das ist dir genau wie bei mir zuerst verloren gegangen da du keine Code Tags verwendest hast. Dann formatiert er den Text kursiv :slight_smile:

Fehler gefunden. Die Klammern müssen rund sein :slight_smile:
Das Ergebnis hatte ich aber schon mal:
ABC\0x10\0x10\0x10\0x10\0x10\0x10\0x10\0x10\0x10\0x10\0x10\0x10\0x10\0x10\0x10\0x10

Viele Zeichen, aber Daten werden keine mitgeschickt.
Das ABC an Anfang ist mein Header, damit ich weiß wo der Anfang ist.

Nach Serial.write((byte*)&duration2, 4);

passiert das:

ABC=(\0x00\0x00

Es werden immer nur leere Bytewerte geliefert. Nur das =( bewegt sich....

Ich habe noch mal was hinzugefügt mit sprintf(). Das erzeugt Strings konstanter Länge

Jaja. Ganausowas wie dieses sprintf suche ich.
Leider kriege ich das nicht hin.
Das erzeugt nur einen String? Wie heißt der und wie kann ich den senden?
Ganz tollkühn:
Serial.write(sprintf(buf, "%.10d", val));

Geht aber auch nicht. Nur: ABC\0x0b

Du musst dir mal angewöhnen die Dokumentation von Funktionen zu lesen bevor zu sie verwendest:
http://www.cplusplus.com/reference/cstdio/sprintf/

On success, the total number of characters written is returned. This count does not include the additional null-character automatically appended at the end of the string. On failure, a negative number is returned.

Was du also ausgibst ist die Länge des Strings. In diesem Fall 11 (wobei das eigentlich 10 sein sollte??...)

sprintf() schreibt dir den String in buf. Entsprechend willst du den Puffer ausgeben:

Serial.println(buf);

println() (oder print()) weil du jetzt wieder einen String hast. Mit write() schickst du da glaube ich die ASCII Werte der chars.

Aaah! So einfach ist das, wenn es funktioniert:

char buf[12];
sprintf(buf, "%.10d", duration2);
Serial.write(buf);

Da reicht schon eine Kleinigkeit damit es (bei einem Anfänger) nicht mehr geht.

Super! Danke an Alle! :slight_smile:

Wie kann ich auf "gelöst" setzen?
Hier habe ich's nicht gefunden: How to use this forum - please read - Website and Forum - Arduino Forum

Serenifly:
@ sschultewolter

for(int i = 0; i < 16; i++) Serial.write(buf);

Wenn dann buf[i]

Richtig, hab den Code auch einfach nur schnell hier hinein geschrieben.