Go Down

Topic: SD Karten Zugriff über Wifi sehr langsam (Read 1 time) previous topic - next topic

Ich habe einen Arduino Mega und ein Wifi-Shield. Ich möchte die SD Karte vom Wifi-Shield über WLAN auslesen. Das funktioniert prinzipiell auch ist aber leider sehr langsam und damit für mich ziemlich unbrauchbar.

Den Code habe ich von: http://www.ladyada.net/learn/arduino/ethfiles.html
übernommen und für den Wifi-Shield modifiziert.

Das auslesen der Daten von SD-Karte und senden über WLAN erfolgt in dieser Schleife:

Code: [Select]

int16_t c;
while ((c = file.read()) > 0) {
client.print((char)c);
}


Weiß jemand warum das Lesen so langsam ist? Und wie geht es schneller?

uwefed


Ich habe eine Textdatei mit Messwerten (2000 Werte) die ich übertragen möchte.
Über WLAN kommen so ca. 10 Zeichen pro Sekunde an. Es macht hinsichtlich Geschwindigkeit keinen Unterschied ob ich die Daten mit dem Browser oder über die Kommandozeile (get) anfordere.
Momentan verwende ich die Library: SdFat.h. Library SD.h habe ich auch schon ausprobiert. Ergebnis ist immer das gleiche.

uwefed

Du liest immer 1 Byte und verschickst dann 1 Byte oder machst Du es in Blöcken?
Grüße Uwe

Genau...Ich lese 1Byte und schicke es anschließend raus:

Code: [Select]

int16_t c;
while ((c = file.read()) > 0) {
client.print((char)c);
}

uwefed

#5
Nov 23, 2012, 09:56 pm Last Edit: Dec 09, 2012, 10:38 pm by uwefed Reason: 1
Wenn Du es blockweise Machst wirds schneller. Ich weiß jetzt nicht wie umfangreich Dein Sketch ist (wieviel RAM frei ist). Fang mal mir 32 Byte an und versuch's dann mit größeren Blöcken.
Grüße Uwe

Danke für den Tipp! Ich probiere es mal Blockweise.

bschaeff

Hallo, das gleiche habe ich auch vor und bei mir ist die Übertragung auch sehr langsam, vor allem weil ich bilder übertragen will. Allerdings bekomme ich es überhaupt nicht hin hier die Daten Blockweise zu übertragen. Hat hier jemand zufällig ein kleines Beispiel wie man Blockweise die SD Daten auslesen kann?

Danke

mkl0815

Definiere Dir einfach einen Puffer, setze das letzte byte auf "0" (Wert Null, nicht das Zeichen 0) und lese byteweise von der SD-Karte (gibt leider kein Blockread). Am Ende dann den Puffer mittels client.print() abschicken.

z.B.
Code: [Select]


#define BUFFERSIZE 32

//BUFFERSIZE  bytes plus null-byte
char buffer[BUFFERSIZE +1];

//zähler für puffer
int i =0;

//solange noch daten vorhanden sind
while( file.available()) {
    buffer[i++] = file.read();
    //wenn BUFFERSIZE  zeichen gelesen, dann puffer abschicken
    if(i == BUFFERSIZE ) {
        //nullterminierung
        buffer[i] = 0

        //puffer abschicken
        clientprint(buffer);

        //zähler auf 0 setzen
        i=0;
    }
}
//letzen rest auch noch abschicken, weniger als BUFFERSIZE  bytes im puffer nach file-ende
if(i > 0) {
   //nullterminierung
    buffer[i] = 0

    //puffer abschicken
    clientprint(buffer);

}



Achtung!! Code ist aus der Hüfte geschossen und ungetestet.

bschaeff

Danke schon mal!!

Werde es mal testen. Sieht aber logisch aus

Go Up