Forum: Mikrocontroller und Digitale Elektronik Arduino: Serial mag nicht


von Werner (Gast)


Lesenswert?

ich habe hier einen ganz seltsamen Effekt mit Arduino (ich weiß, den 
ganzen Sketch zeigen), aber das ist so strange vielleicht kennt das 
jemand

der Codeausschnitt:

    Serial.print( menue[midx].text );
    if ( entry.isDirectory() )
    {
      Serial.println("+");
      Serial.println("/");
      Serial.println("-");

im Serial-Monitor erfolgt dann bei 3 Aufrufen als Ausgabe:

das erste Mal richtig:
DCIM+
/
-

Dann fehlt der /
100MEDIA/
listDir 1
100MEDIA+

-

und bei 3.Mal + anstatt /
DCIM+
+
-

und wenn ich anstatt / z.B. ? ausgebe, funktioniert alles wie gewünscht.
Warum geht das mit / nicht?

von Georg G. (df2au)


Lesenswert?

K&R, Seite 7, "escape sequence"

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Georg G. schrieb:
> K&R, Seite 7, "escape sequence"

Nö. '/' hat damit nichts zu tun. Das wäre '\'.

von Georg G. (df2au)


Lesenswert?

Rufus Τ. F. schrieb:
> Nö.

Sorry, Brille nicht aufgesetzt.
Beitrag am besten löschen.

von Christian M. (Gast)


Lesenswert?

Hä? Wie 3 Mal aufrufen? 3 x Reset? Im loop() 3 x aufrufen?
Kannst mal ganz genau schreiben, was zurückkommt, am Besten mit [code]!

Danke und Gruss Chregu

von Werner (Gast)


Lesenswert?

das Ganze ist in einem Programm um in einem Verzeichnis einer SD-Card 
rum zu navigieren. Wenn ich das mache wird der gezeigte Programmteil 
aufgerufen und macht eben diese Ausgaben.
Ich habe jetzt mal statt des Serialmonitors von Arduino ein 
Terminalprogramm verwendet, es kommt die gleiche Ausgabe.
Hier die 2. Ausgabe bei der das / fehlt als Hexcode:

0D 0A 31 30 30 4D 45 44 49 41 2B 0D 0A 0D 0A 2D 0D 0A

oder noch Mal als ASCII
100MEDIA+

-

Dann habe ich die 3x println zusammengezogen, slso

 Serial.println("+/-");

Funktioniert!

Ich schiebe es jetzt Mal auf einen Fehler in der Lib,
dann wird halt kein / verwendet!

von Werner (Gast)


Lesenswert?

es muss was mit Strings zu tun haben:

      strcat( menue[midx].text, "/");
Funktioniert auch oft nicht (es wird nichts angehängt)

      strcat( menue[midx].text, "/ ");
oder
      strcat( menue[midx].text, "+");
funktioniert

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und Du bist Dir ganz, ganz sicher, daß das auch der Quelltext ist, den 
Du verwendest, und nicht etwas, an das Du Dich erinnerst und hier wieder 
neu eintippst?

Lad' mal Dein .ino-File hier hoch. Irgendwie kommt mir das merkwürdig 
vor.

von Werner (Gast)


Lesenswert?

nee, wirklich kopiert.

Den Quelltext im jetzigen Bau-Zustand traue ich mich nicht der Meute 
vorzuwerfen. Ich versuche es noch etwas einzugrenzen, wird aber heute 
nichts mehr und morgen nicht gleich :-(

von Werner (Gast)


Lesenswert?

wenn ich darüber nachdenke kann doch nur sein dass irgendwo der String 
"/" zerschossen wird, und das wäre übel in der Arduino-IDE ohne Debugger 
da das Programm inzwischen ein bißchen mehr als "Hello world" macht.

Werden eigentlich zwei gleiche konstante Strings vom Compiler 
übereinander gelegt, das Verhalten deutet darauf hin.

von Einer K. (Gast)


Lesenswert?

Ich bin mir recht sicher, dass du an der falschen Stelle suchst.....


Meine Glaskugel sagt:
1. Heap - Stack Kollision
2. Zeiger, welche in die Wiese zeigen
3. Arrayüberschreitung
Also: Unbeabsichtigtes Überschreiben von unschuldigen Speicherbereichen.

von Werner (Gast)


Lesenswert?

scheinbar liegt es an der Programmgröße dass es nicht geht

mit
void loop()
{
  doInput();
  //doMenu();
}
ist die Programmgröße
Binary sketch size 19,270 bytes (of a 30,720 byte maximum)
und die Ausgabe im setup ist alles ok

mit
void loop()
{
  doInput();
  if ( lastmillis<0 )   // Bedingung ist nie erfuellt
    doMenu();
}
ist die Programmgröße
Binary sketch size 21,754 bytes (of a 30,720 byte maximum)
und bei der Ausgabe im setup kommt schon Käse.

Ist das Programm schon zu groß? Es ist ein pro Mini mit mega328

von Einer K. (Gast)


Lesenswert?

Werner schrieb:
> Ist das Programm schon zu groß?
Nein!
Steht doch in der Meldung!
Zeige doch mal den RAM Verbrauch, der ist viel interessanter.

Werner schrieb:
> scheinbar liegt es an der Programmgröße dass es nicht geht

Es gilt weiterhin:
> Ich bin mir recht sicher, dass du an der falschen Stelle suchst...

von Werner (Gast)


Lesenswert?

funktioniert:
   text     data      bss      dec      hex  filename
  18764      536      924    20224     4f00  CNC.cpp.elf

funktioniert nicht
   text     data      bss      dec      hex  filename
  21208      536      958    22702     58ae  CNC.cpp.elf

da ist ja auch noch 1k für Stack frei.
Ich selbst brauche bis zum Auftauchen des Fehlers gar keinen Stack.
Aufgerufen werden nur Librarys (TFT und SD), siehe setup an dessen Ende 
printdirectory aus dem arduino Beispiel aufgerufen wird. Das ist zwar 
recursiv, aber es gibt auf der SD Card nur einen Ordner der einen Ordner 
enthält und eine Datei, Rekursionstiefe also 3.
Und das funktioniert ja auch wenn das Programm nicht zu groß wird.
Mein Programm verbraucht relativ wenig Flash und RAM, viel braucht die 
SD-Library, gibt es da was kleineres?

void setup(void)
{
  Serial.begin(9600);

  lastmillis = millis();
  Serial.println("mini is running ...");

  tft.initR(INITR_BLACKTAB);   // ST7735-Chip initialisieren
  tft.setFont(font5x7);
  tft.fillScreen(ST7735_BLACK);
  tft.setTextSize(2);
  tft.setTextWrap(false);
  tft.setTextColor(ST7735_WHITE, ST7735_BLACK);
  tft.setCursor(0, 4);
  tft.println("Hallo Welt");

  pinMode(blLCD, OUTPUT);
  digitalWrite(blLCD, HIGH);
  tft.println("Init. SDC");
  Serial.print("Initializing SD card...");
  pinMode(csSD, OUTPUT);

  if ( !SD.begin(csSD) )
  {
    tft.println("failed!");
    Serial.println("initialization failed!");
  }
  else
  {
    tft.println("done.");
    Serial.println("initialization done.");

    dirs[0] = SD.open("/");
    printDirectory(dirs[0], 0);
  }
}

von Werner (Gast)


Lesenswert?

ich habe mir noch Mal den größmöglichen Block mit malloc geben lassen, 
das sind
417 bzw. 383 Byte

Wie ist das denn alles angeordnet oder wie finde ich raus wo Variablen 
und der Stack und Heap liegen

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Werner schrieb:
> Wie ist das denn alles angeordnet oder wie finde ich raus wo Variablen
> und der Stack und Heap liegen

Das Stichwort dürfte "map file" lauten. Das sollte auch Dein Compiler 
ausgeben können.

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.