Forum: Mikrocontroller und Digitale Elektronik Arduiuno: Problem mit substring


von Frank E. (Firma: Q3) (qualidat)


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.

von Walter T. (nicolas)


Lesenswert?

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.

von Frank E. (Firma: Q3) (qualidat)


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

von J. S. (jojos)


Lesenswert?

Probiere mal String.remove(27);

von Walter T. (nicolas)


Lesenswert?

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

str.resize()

Beitrag #7773688 wurde vom Autor gelöscht.
von Loco M. (loco)


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/

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Loco M. schrieb:
> Dann kann man 'snprintf' anstelle von 'printf' nehmen.

Auch das braucht zusätzlichen Speicher (buffer) für den gekürzten 
String.

von Rainer W. (rawi)


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.

von Frank E. (Firma: Q3) (qualidat)


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 ...

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


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.

: Bearbeitet durch User
von Frank E. (Firma: Q3) (qualidat)


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 ...

: Bearbeitet durch User
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.