Arduino: Serial mag nicht

Gast #4834669
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?
Gast #4834783
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!
Gast #4834795
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
Gast #4834826
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 :-(
Gast #4834847
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.
Gast #4834902
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.
Gast #4837075
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
Gast #4837133
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);
  }
}
Gast #4837189
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren