Go Down

Topic: Serial.print schneidet letztes Zeichen ab. (Read 986 times) previous topic - next topic

DF9QA

Apr 18, 2017, 03:28 pm Last Edit: Apr 18, 2017, 03:33 pm by uwefed Reason: add CODE TAGS </>
Hallo,

ich hoffe, irgendjemand hat eine Idee zu diesem Problem:

Die Ausgabe für folgende procedure:

Code: [Select]
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?



combie

#1
Apr 18, 2017, 03:53 pm Last Edit: Apr 18, 2017, 03:54 pm by combie
Bei mir passiert das nicht!

Code: [Select]
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:

Code: [Select]
ADAB1123456789012345
ADAB1123456789012345
> Das größte Problem, ist die Wahl der richtigen Gedanken <
Frei nach Dale Carnegie

jurs

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.

combie

#3
Apr 18, 2017, 04:56 pm Last Edit: Apr 18, 2017, 05:18 pm by combie
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!
> Das größte Problem, ist die Wahl der richtigen Gedanken <
Frei nach Dale Carnegie

DF9QA

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!



Serenifly

#5
Apr 18, 2017, 07:10 pm Last Edit: Apr 18, 2017, 07:12 pm by Serenifly
Und bei all dem hast du noch nichts von call by reference gehört?

Besser:
Code: [Select]

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

Whandall

Das ist/war ja der aufgeblasendste String-Auf-8-Bit-Avr-Benutzer den ich seit langem gelesen habe...
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

combie

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.
> Das größte Problem, ist die Wahl der richtigen Gedanken <
Frei nach Dale Carnegie

Whandall

Ich tippe mal darauf, dass der Arduino sich weghängt,
bevor das letzte Zeichen des Strings übertragen werden konnte.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

mkl0815

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

DF9QA

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 )

combie

> Das größte Problem, ist die Wahl der richtigen Gedanken <
Frei nach Dale Carnegie

Go Up