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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.