Arduiuno: Problem mit substring

OP (Firma: Q3) #7773565
Lesenswert?

Ich habe hier so ein Kiosk-Thermo-Druckmodul (hängt an einer SoftSerial) anzusteuern, das hat eine Druckbreite von 28 Zeichen. Ist der gesendete String nur 1 Zeichen breiter, wird nichts gedruckt, ist eine Macke dieser Hardware.

Also habe ich sicherheitshalber diese Zeile eingebaut (s ist die Stringvariable:

1
if(s.length()>27){s=s.substring(0,27);}

Allerdings ist nun s immer leer. Das sehe ich anhand der Kontrollausgabe im seriellen Monitor. Warum zum Kuckuck?

Danke für Tips.

OP (Firma: Q3) #7773573
Lesenswert?

Walter T. schrieb:

Dir ist aber schon klar, dass s=s.substring(0,27); jedes Mal den Konstruktor von std::string neu aufruft? Das ist eine teure Operation.

Frank E. schrieb:

Warum zum Kuckuck?

Keine Ahnung. Es liegt nicht an diesen zwei Zeilen.

Ich bin auch dankbar für eine Alternative, muss nur die Länge des String begrenzen.

Ich glaub, ich habe mal was gelesen, mit CharAt eine Null als neues Endekennzeichen einzufügen ... ? Werd ich probieren

Beitrag #7773688 wurde von einem Moderator gelöscht.
#7773720
Lesenswert?

Frank E. schrieb:

Walter T. schrieb:

Dir ist aber schon klar, dass s=s.substring(0,27); jedes Mal den Konstruktor von std::string neu aufruft? Das ist eine teure Operation.

Frank E. schrieb:

Warum zum Kuckuck?

Keine Ahnung. Es liegt nicht an diesen zwei Zeilen.

Ich bin auch dankbar für eine Alternative, muss nur die Länge des String begrenzen.

Brauchst du wirklich die String Klasse, oder geht nicht auch ein einfaches Character Array? Dann kann man 'snprintf' anstelle von 'printf' nehmen.

https://www.geeksforgeeks.org/snprintf-c-library/

#7773768
Lesenswert?

Frank E. schrieb:

Ist der gesendete String nur 1 Zeichen breiter, wird nichts gedruckt, ist eine Macke dieser Hardware.

Dir ist sch klar, dass ein Teilstring [0...27] aus 29 Zeichen besteht?

Frank E. schrieb:

if(s.length()>27 {s=s.substring(0,27);}

Bei substring(0,26) wird der Text gedruckt? Dann setzt doch versuchsweise einmal im String das Zeichen an der Position 27 bzw. 28 auf 0x00.

OP (Firma: Q3) #7773989
Lesenswert?

Rainer W. schrieb:

Dir ist sch klar, dass ein Teilstring [0...27] aus 29 Zeichen besteht?

Ja, schon: Index 0 bis 27 sind 28 Zeichen und dazu "intern" die Null als Terminierung. Ich nehme aber doch an, dass die abschließende Null bei "sserial.print(t)" nicht mit gesendet wird, oder?

Allerdings habe ich nach meinem Post noch einen (peinlichen) Fehler in meinem Code entdeckt und beseitigt: Ich habe eine Variable mit dem gleichen Namen sowohl global als auch lokal in einer Funktion angelegt.

Das hat der Compiler nicht als Fehler gemeldet (ist ja auch keiner), das hat aber auch zu sehr irritierenden Resultaten geführt ... da muss ich erstmal noch forschen.

Danke einstweilen ...

Gast #7774009
Lesenswert?

Frank E. schrieb:

Ich nehme aber doch an, dass die abschließende Null bei "sserial.print(t)" nicht mit gesendet wird, oder?

Was ist sserial?

Du solltest mehr von deinem Quelltext zeigen, damit wir nicht aneinander vorbei diskutieren, und damit nicht noch mehr unpassende Vorschläge kommen.

OP (Firma: Q3) #7774018
Lesenswert?

Sherlock 🕵🏽‍♂️ schrieb:

Frank E. schrieb:

Ich nehme aber doch an, dass die abschließende Null bei "sserial.print(t)" nicht mit gesendet wird, oder?

Was ist sserial?

Steht doch im Einganspost: SoftSerial, weil ich die Harware-Serial (Arduino Nano) zum Debuggen (Monitor-Ausgabe) brauche. Bevor noch jemand meint, das ginge nicht gleichzeitig.

Aber das mit dem leeren String wird wohl an dem weiter oben (7:18) eingestandenen Fehler liegen, da bin ich noch dran ...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren