Forum: PC-Programmierung String in Serial.write einbinden


von Sebastian G. (sgraw)


Lesenswert?

Hallo

ich habe ein Char array mit 6 Zahlen. Diese Zahlen kann ich uber 
Pfeiltasten hoch bzw runterzählen.
jetzt zu meinem Problem

ich möchte diese Zahl in einem Serial.write einbinden.
Leider funktioniert das nicht.

einmal mein grober Aufbau

char load[] = {'0','0','0','0','0'};





Serial.write("Load beträgt: %s",load);



Fehler:
Programmierger_t_ino.ino: In function 'void loop()':
Programmierger_t_ino:160: error: invalid conversion from 'const char*' 
to 'const uint8_t*'
Programmierger_t_ino:160: error: initializing argument 1 of 'virtual 
size_t Print::write(const uint8_t*, size_t)'
Programmierger_t_ino:160: error: invalid conversion from 'char*' to 
'size_t'
Programmierger_t_ino:160: error: initializing argument 2 of 'virtual 
size_t Print::write(const uint8_t*, size_t)'


Was mach ich falsch?

von Peter II (Gast)


Lesenswert?

Sebastian Graw schrieb:
> Serial.write("Load beträgt: %s",load);

Serial.write("Load beträgt: %d %d %d %d",load[0],load[1],load[2],load[3] 
);

von Peter II (Gast)


Lesenswert?

Peter II schrieb:
> Serial.write("Load beträgt: %d %d %d %d",load[0],load[1],load[2],load[3]
> );

es sind ja chars, also

Serial.write("Load beträgt: %c %c %c %c",load[0],load[1],load[2],load[3] 
);

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sebastian Graw schrieb:
> Serial.write("Load beträgt: %s",load);

Formatiert Serial.write die übergebenen Argumente analog zu printf?

Sieh Dir mal genau die Dokumentation dieser Funktion an.

von amateur (Gast)


Lesenswert?

Serial.write wird wohl einen "echten" String als Parameter erwarten.

char Etwas [] = "0000"; sollte gehen

Die Manipulation mittels:
Etwas [ 1 ] = '9';
sollte kein Problem darstellen.

um dann mittels:
Serial.write ( Etwas );
ausgegeben zu werden.

Bei den Arduinos gibt es auch einen Datentyp mit Namen String. Eventuell 
ist der noch besser geeignet.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

amateur schrieb:
> Serial.write wird wohl einen "echten" String als Parameter erwarten.

Tut es nicht:
1
virtual size_t Print::write(const uint8_t*, size_t)

Das ist der Funktionsprototyp. Offensichtlich ist das eine Funktion, die 
ein Array aus uint8_t ausgibt, und die Anzahl der zu schreibenden Bytes 
wird als zweites Argument übergeben.

Woher ich den Funktionsprototypen habe?

Fehlermeldungen angucken. Da steht er drin.

von Peter II (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Fehlermeldungen angucken. Da steht er drin.

und wenn es noch weiter übladene gibt?

von amateur (Gast)


Lesenswert?

>und wenn es noch weiter übladene gibt

Bei den Arduinos gibt's deren wenigstens drei.

_(val)
_(str)
_(buf,Siz)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

amateur schrieb:
> Bei den Arduinos gibt's deren wenigstens drei.

Das hier ist der Forenbereich "PC-Programmierung". Arduino & Co. passt 
hier nicht hin.

Egal, selbst wenn es das täte, keine der anzunehmenden überladenen 
Varianten nimmt eine Stringformatierung analog zu printf vor.

von Sebastian G. (sgraw)


Lesenswert?

Sorry das ich den falschen Forenbereich gewählt habe.

Wollte nur noch eben sagen wie ich das Problem gelöst habe.

sprintf(outString,"blablabla: %s\r\n",load);
Serial1.write(outString);

von Peter II (Gast)


Lesenswert?

Sebastian Graw schrieb:
> Wollte nur noch eben sagen wie ich das Problem gelöst habe.
>
> sprintf(outString,"blablabla: %s\r\n",load);
> Serial1.write(outString);

damit hast es fehlerhaft gelöst. Bei Load gibt es das 0 Byte(stringende) 
nicht. Es kann also passieren das du viel mehr Daten ausgibst als 
gewünscht. Das es abhängig davon welche Daten im speicher hinter der 
Variabel kommen.

von Sebastian G. (sgraw)


Lesenswert?

load ist ein array in dem immer 6 Zeichen stehen.

char load[] = "000000";

Diese Zahlen kann ich mithilfen von Tasten einzeln hoch bzw runter 
zählen.
Funktioniert eigentlich alles super.

von Peter II (Gast)


Lesenswert?

Sebastian Graw schrieb:
> load ist ein array in dem immer 6 Zeichen stehen.
>
> char load[] = "000000";

genau das ist das Problem. Es müssten dort 7 Zeichen stehen, damit es 
ein String für %s ist.

'0', '0', '0', '0', '0','0', 0

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter II schrieb:
> genau das ist das Problem. Es müssten dort 7 Zeichen stehen, damit es
> ein String für %s ist.

Das aber tun sie, wenn das Array mit einer Stringkonstanten 
initialisiert wird:
1
char load[] = "000000";

Ein sizeof(load) wird 7 ergeben.

Wenn so initialisiert wird, wie zu Anfang* des Threads
1
char load[] = {'0','0','0','0','0','0'};

dann ist das Array nur 6 Bytes groß, und ein sizeof(load) ergibt 6.


*) ich habs auf sechs Zeichen korrigiert, das Beispiel am Anfang enthält 
sogar nur fünf

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.