Hallo µC Community, Ich habe seit vorgestern wieder angefangen, an mein kleinen Homeserver zu basteln. Das ein oder andere mal hatte ich hier auch schon mal Fragen dazu gestellt. Nun, da es ja ein Homeserver ist wollte ich gerne alles was das System macht auf einer Website darstellen. Dafür habe ich denn ENC28J60. Der auch tadellos funktioniert. Zudem habe ich auch noch eine SD Karte. Es sind alle Relevanten Bauteile angeschlossen. Wie 74HCT125 für MISO Leitung bei dem ENC28J60 und der SD Karte sowie ein 74HC4050 um die Signal vom 5V AVR Signal in ein 3.3V Signal umzuwandeln. Da der Speicher des ATMega644-PU durch seine 64 KBytes stark beschränkt ist. Ist das programmieren der Seiten für den Webserver im Code vielleicht nicht so sinnvoll. Daher habe ich gedacht eine Datei von der SD Karte auszulesen und dann an denn Webserver senden. Der Vorgang ist so: Und zwar lese ich aus wie viele Zeilen eine bestimmte Datei hat, die Datei die später dargestellt werden soll. Dann gehe ich in einer For Schleife und erhöhe i solange bis die Anzahl der Zeilen erreicht sind, währenddessen lese ich jedes mal mit f_gets die Zeile aus. Prüfe ob dort Codes drin sind wie ~ds18b20TempIn~ und ersetzte diese mit einer replace Funktion durch denn Entsprechenden Sensor Wert. Das ganze funktioniert auch gut aber nur bei kleinen Dateien, die weniger als 15 Zeilen an Code haben. Wenn ich aber eine Datei mit mehr Zeilen nehme so um die 25. Dann klappt das mal, dann fehlt aber die Hälfte. Wenn ich dann den Puffer von 50 auf 100 erhöhe ist alles zu sehen. Lade ich aber die Seite neu, dann kommt keine Antwort mehr und das System hat sich aufgehangen. Und wenn ich denn Puffer auf 200 stelle startet er und hängt sich sofort auf. Ich weis nicht so ganz woran das liegt. Bei kleinen Webseiten(so 10 Zeilen) geht das ohne Probleme. Der Prozessor läuft auf 16 MHz. Die Versorgungsspannung ist stabil bei 5.02 Volt. Auch die für die SD Karte sowie ENC28J60 sind stabil bei 3.33 Volt. Ich habe die Funktionen als Text Dateien und die eigentliche Funktionen mit Kommentaren angehängt. Kann mir jemand helfen dieses Problem zu finden? Lg Jan.
Vielleicht sind die Zeilen zu groß, kopiere doch als Test die kleine Datei 3 mal in eine Große mit 30 Zeilen. Würdest Du zeichenweise einlesen und ausgeben bräuchtest Du nur einen Buffer der so groß wie Dein längstes Ersatz Austauschwort ist.
Toto mit Harry schrieb: > Vielleicht sind die Zeilen zu groß, kopiere doch als Test die kleine > Datei 3 mal in eine Große mit 30 Zeilen. > > Würdest Du zeichenweise einlesen und ausgeben bräuchtest Du nur einen > Buffer der so groß wie Dein längstes Ersatz Austauschwort ist. Hallo vielen dank für deine Antwort. Also wenn ich das ganze mit dem replace rausnehme dann gehen auch große Dateien. Muss nur denn Puffer SD_BUFFERSIZE erhöhen dort ist aber ab 250 schluss. Wieso genau bei 250? Der RAM ist noch nicht voll 11,7 % noch frei. Vielleicht hat das auch was mit der replace Funktion zutun hier ist sie mal:
1 | char *replace_str(char *str, char *orig, char *rep){ |
2 | static char buffer[50]; |
3 | char *p; |
4 | |
5 | if(!(p = strstr(str, orig))) |
6 | return str; |
7 | |
8 | strncpy(buffer, str, p-str); |
9 | buffer[p-str] = '\0'; |
10 | |
11 | sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig)); |
12 | |
13 | return buffer; |
14 | } |
Bei str gibt man denn String rein der Bearbeitet werden soll. Bei orig kommt rein was ersetzt werden soll. Und bei rep kommt rein was für orig stehen soll. Lg Jan
static char buffer[50]; bedeutet eine Zeile darf maximal 50 Zeichen lang sein.. Deine länsgte Zeile in "25 Zeilen" sind 106 Zeichen.. da reicht hier der Buffer nicht. in den 10 Zeilen ist die längste Zeile "Temperatur am Verdampfer der Klimaanlage: ~ds18b20TempIn~ *C" mit 60 Zeichen, wovon 12 auf auf die Temp fallen.. und womöglich nur durch 2 ersetzt werden. Html hat doch den schönen Beigeschmack durch die Tags formatiert zu werden.. du kannst das im Rawtext ruhig umbrechen.. also Deine Zeilen einfach mit nem enter trennen.. sieht dann nur im quelltext nicht so schön aus.
Toto mit Harry schrieb: > Deine länsgte Zeile in "25 Zeilen" sind 106 Zeichen.. da reicht hier der > Buffer nicht. Oh, ja gut dann kann das aber auch nicht gehen. Hmm, also funktionieren tut es schon mal jedoch nur einmal. Nachdem die Seite korrekt dargestellt wurde und man sie neu lädt bricht das System zusammen. Wieso erst nachdem Reload? //EDIT: Das System hängt sich nur auf wenn man die replaces drin hat oder einen davon. Ist kein Replace vorhanden. Kann man so oft neuladen das ist dann egal. Könnte es sein das ich dem RAM eventuell ein bisschen Quäle mit denn ganzen Puffern und sprintf's? Lg Jan.
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.