Wie SD Bsp. CardInfo auf Serial 1 ausgeben?

Hallo,

ich bekomme nicht die Wunschausgabe auf Serial 1 ausgegeben.

In dem Bsp. der SD Library "CardInfo" gibt es am Ende diese beiden Informationen. Die werden aber sturr auf Serial 0 ausgegeben. Kann man das ändern?

root.openRoot(volume);

root.ls(LS_R | LS_DATE | LS_SIZE);

Das hier funktioniert nicht, 2. Zeile wird auch von der IDE angemeckert.

Serial1.println( root.openRoot(volume) );
Serial1.println( root.ls(LS_R | LS_DATE | LS_SIZE) );

Kann man das ändern?

Nur in der library selbst.

root.ls() macht schon direkt die Ausgabe.

Serial.print( root.ls() ); // würde nur gehen, wenn ls einen char* auf einen Puffer mit dem Text des Dateiverzeichnis liefern würde, aber dafür hat ein Uno gar nicht genug RAM

Ist aber schnell gemacht. Die Methode ist in utility/SdFile.cpp

Der relevante Teil:

    for (int8_t i = 0; i < indent; i++) Serial.print(' ');

    printDirName(*p, flags & (LS_DATE | LS_SIZE) ? 14 : 0);

    if (flags & LS_DATE) {
       printFatDate(p->lastWriteDate);
       Serial.print(' ');
       printFatTime(p->lastWriteTime);
    }
    // print size if requested
    if (!DIR_IS_SUBDIR(p) && (flags & LS_SIZE)) {
      Serial.print(' ');
      Serial.print(p->fileSize);
    }
    Serial.println();

Wie man da sieht muss man dann aber auch printDirName(), printFatDate() und printFatTime() ändern! Die stehen weiter unten. Und diese Methoden verwenden wiederum printTwoDigits() direkt darunter

Hallo,

Danke für die Information. Vielleicht bekomme ich das hin ohne die Library zu verbiegen, also das die auch noch standardmäßig nutzbar bleibt. Denke an Funktion kopieren und abändern.

Verwende ein Makro am Anfang der Datei:

#define USE_SERIAL1

#ifdef USE_SERIAL1
    #define SERIAL_IMPL Serial1
#else
    #define SERIAL_IMPL Serial
#endif

Dann ersetzt du in den entsprechenden Funktionen "Serial" durch "SERIAL_IMPL". Wenn jetzt das Makro USE_SERIAL1 existiert wird das durch Serial1 ersetzt. Wenn nicht durch Serial. Dann kann man einfach die eine Zeile auskommentieren um die Funktionalität zu ändern

EDIT:
#endif vergessen :s

Hallo,

kann man nicht auch jede Zeile kopieren, verdoppeln, und Serial 0 in Serial 1 ändern?
Funktioniert dann der Sketch noch richtig, wenn in void setup
dann entweder nur Serial 0 oder Serial 1 oder beide "aktiviert" sind? Es würde manches ins Leere gesendet.
Ich könnte dann je nach Lust und Laune bestimmte Ausgaben auf Serial 0 und andere auf Seriel 1 ausgeben lassen.
Damit müßte ich mich nicht in der SdFile.cpp auf einen bestimmten seriellen Port global festlegen.

Zum Bsp. aus der Unterfunktion

// print size if requested
    if (!DIR_IS_SUBDIR(p) && (flags & LS_SIZE)) {
      Serial.print(' ');
      Serial.print(p->fileSize);
    }
    Serial.println();

wird dann sowas

// print size if requested
    if (!DIR_IS_SUBDIR(p) && (flags & LS_SIZE)) {
      Serial.print(' ');
      Serial1.print(' ');
      Serial.print(p->fileSize);
      Serial1.print(p->fileSize);
    }
    Serial.println();
    Serial1.println();

Edit:
ach ne, dass macht eigentlich keinen Sinn, ich belasse es "fest" auf Serial 1 mittels #define.
Vielen Dank für die Hilfe! :slight_smile: