Serial.print schneidet letztes Zeichen ab.

Hallo,

ich hoffe, irgendjemand hat eine Idee zu diesem Problem:

Die Ausgabe für folgende procedure:

void ExecCmd(String CmdStr) {
 String s = "ADAB1123456789012345";

 Serial.print(s);
 SerialPrintln();


 if (CmdStr == "whois") { Serial.print(s); } 
}

sieht folgendermaßen aus:

ADAB1123456789012345
ADAB112345678901234

Bei dem zweiten Serial.print() wird das letzte Zeichen des String abgeschnitten.

Grüße

Knut
Hat dazu jemand eine Idee?

Bei mir passiert das nicht!

void ExecCmd(String CmdStr) {
 String s = "ADAB1123456789012345";

 Serial.print(s);
 Serial.println();


 if (CmdStr == "whois") { Serial.print(s); } 
}

void setup() 
{
 Serial.begin(9600);
 String a = "whois";
 ExecCmd(a);
}

void loop() 
{
}

Resultat:

ADAB1123456789012345
ADAB1123456789012345

combie:
Bei mir passiert das nicht!

Das glaube ich Dir.

Aber ich glaube dem Themenstarter NICHT, dass er DEN GANZEN CODE seines Sketches gepostet hat, mit dem er den Fehler bei sich beobachtet.

Womöglich liegt hier mal wieder der Fall vor, dass ein Themenstarter eine vollständig erschöpfende Auskunft zu einem Problem erwartet, er aber seinen Code nur in stark verkürzter Form gepostet hat. Ggf. auch so stark verkürzt, dass der behauptete Fehler mit dem geposteten Codeschnipsel überhaupt nicht auftritt.

Darüber hinaus hat der Themenstarter versäumt zu schreiben,
-welches Arduino-Board
und welche Arduino-IDE-Version

  • er auf welchem PC-Betriebssystem verwendet, um den Sketch zu kompilieren.

So hat er mit seinem "Neuen Thema" gleich den Grundstein dafür gelegt, dass NIEMAND den behaupteten Fehler mit derselben Hard- und Softwarekonfiguration bei sich nachvollziehen kann.

Nein!
Ich werde mich dem Misstrauen standhaft widersetzen.

Begründung:
Wer ist schon so, und postet ungetesteten Code, und behauptet da wäre ein Fehler drin?
Sogar mit Ausgabe...

Neee...., das will ich nicht glauben!

Vielen Dank für Eure witzigen und äußerst qualifizierten Kommentare.

Natürlich war die Prozedur stark vereinfacht. Reduziert auf eine Minimalversion, bei der der Fehler bei mir nach wie vor auftritt, wie man an dem Ausschnitt der Ausgabe sehen kann.

Ich kann natürlich auch die 6000 Zeilen Code posten, damit Spezialisten wie Jurs sofort erkennen, wo das Problem liegt. Wenn wir alle Glück haben, reicht Ihm aber auch die 800 Zeilen der Library in der das auftritt. Dumm nur, dass da ja einige includes drin sind, die er dann auch wieder nicht versteht, weil es Ihm dann wieder zuviel Code ist. Und dann sind Teile des Source auch noch im Assembler geschrieben. Jurs, willst Du die auch sehen um das Problem erkenne zu können? Ich kann Dir auch noch ein paar andere Sources schicken, damit wir das Problem so richtig schön im "Sourcecode Müll" ersaufen lassen können. Erstes Semester Informatik:

Die Kunst der Fehlersuche besteht darin, den schadhaften Code zu lokalisieren, stark zu vereinfachen und ihn aus dem "abstrakten" Gesamtzusammenhang rauszunehmen. (Entschuldigung: Auch das ist stark vereinfacht)

Ach ja: Verlagerung der Prozedur in den Main Sketch ändert auch nichts am Auftreten des Fehlers.

Und für die Neugierigen: Ich entwickle mit dem Atmel Studio 7 (Windows 7 pro, 64bit) mit Arduino 1.8.2 im Hintergrund, Atmel Ice Hardware Debugger, Rohde & Schwarz Logic Analyzer auf einen Arduino Mega 2560 (original Genuino) welcher fest in eine selbst entwickelten Platine eingebunden ist. Bei dem Arduino werden alle Pins intensiv und zeitkritisch benutzt. Dabei ist der Arduino aber nur "Mess- und Steuerknecht" für die eigentliche Software.

Aber Danke für Eure Mühen. Entschuldigt, wenn ich Eure Kreise gestört habe. Kommt nicht wieder vor. Ich versuche das ohne Eure "Hilfe" zu lösen. Das wird sicherlich schneller gehen.

Eine schönen Abend noch!

Und bei all dem hast du noch nichts von call by reference gehört?

Besser:

void ExecCmd(String& CmdStr)
{
}

Wird zwar mit dem Problem direkt nichts zu tun haben, wenn du das ständig machst wird nur Speicher und Zeit verschwendet.

Es stimmt aber halt, dass man so nicht sagen kann woran das liegt. Klar ist es schwer sich durch Tausende Zeilen fremden Code zu wühlen, aber das bisschen lässt keine klare Aussage treffen

Das ist/war ja der aufgeblasendste String-Auf-8-Bit-Avr-Benutzer den ich seit langem gelesen habe...

Whandall:
Das ist/war ja der aufgeblasendste String-Auf-8-Bit-Avr-Benutzer den ich seit langem gelesen habe...

Und, was lerne ich daraus?
Misstrauen aufbauen?
Nein!

Ich werde nicht die Urteile, welche ich mir in diesem Thread gebildet habe, auf andere übertragen.

Ich tippe mal darauf, dass der Arduino sich weghängt,
bevor das letzte Zeichen des Strings übertragen werden konnte.

@DF9QA: Poste doch mal den minimalen Sketch in dem das auftritt. Der sollte ja so ähnlich aussehen wie der von combi in Post #2. Ansonsten wäre es nicht minimal. Wenn es wie be combie nicht auftritt, dann ist die Funktion in welcher der String ausgegeben wird eben NICHT die Ursache, sondern nur zufällig der Auslöser.

Mario.

Das Problem konnte gefunden und gelöst werden. Der VisualMicro Debugger schneidet unter bestimmten Voraussetzungen das letzte Zeichen beim Serial.print() ab.

VisualMicro hat das in der letzten Version gefixt: (siehe den vorletzten Punkt der Liste:)

( Visual Micro Work in progress + Download )

Danke, für die Klarstellung.