Re: Datenspeicherung in EEprom oder Ramdevice Kategorie: Programmierung (von Jörg Hansen - 30.09.2015 13:48) | ||
Als Antwort auf Datenspeicherung in EEprom oder Ramdevice von Rainer - 1.08.2015 13:51 | ||
| ||
> Hallo, ich habe eine Frage zur Speicherung in Eprom oder Ram. > Kann man Strings in ein Array speichern ? Ich möchte als Datenlogger das Datum und die Uhrzeit fortlaufend > speichern oder muss ich das umständlich mit strx.getnum umwandeln ? > > MfG > > R. Mandel Hallo, ich benutze genau diese Funktion: Event-Logging über V24 und parallel in ein EEPROM. Ich habe 2 EEPROMS: eines für alle Konfigurationseinstellungen (hier liegen auch die Start/Ende Adressen für das LogEEPROM ab) Im 2. EEPROM (Adresse 3) speichere ich die letzten Log-Events mit Datum und Text als Ringspeicher. Jedoch habe ich es mir hier mit der Speicherverwaltung einfach gemacht: Jede Eintrag benötigt 64 Byte (32 für den Zeitstempel und 32 für den Text) Aus den restlochen Code rufe ich nur die function log() z.B. log("Steuerung initialisiert"); oder bei variablen log(logstring); Hier mal der Quellcode: //----------------------------------------------------------------------------------- function log (string s) //Logging von Events zur Ausgabe auf hwcom und in EEPROM //----------------------------------------------------------------------------------- {string time; hwcom.put(13); //Carriage Return - Cursor an den Anfang der Zeile setzen time=(system.day()/10+0x30) + ((system.day()%10)+0x30); //Tag ausgeben time=time + "."; //Punkt zwischen Tag und Monat time=time + (system.month()/10+0x30) + ((system.month()%10)+0x30); //Monat ausgeben time=time + "."; //Punkt zwischen Monat und Jahr time=time + (system.year()/1000+0x30) + (((system.year()%1000)/100)+0x30); //Jahr ausgeben time=time + ((system.year()%100)/10+0x30) + ((system.year()%10)+0x30); //Jahr ausgeben time=time + 32; //ASCII-Zeichen 32 = Blank time=time + (system.hour()/10+0x30) + ((system.hour()%10)+0x30); //Stunde ausgeben time=time + ":"; //Doppelpunkt zwischen Stunde und Minute time=time + (system.minute()/10+0x30) + ((system.minute()%10)+0x30); //Minute ausgeben time=time + ":"; //Punkt zwischen Minute und Sekunde time=time + (system.second()/10+0x30) + ((system.second()%10)+0x30);//Sekunde time=time + 32; //ASCII-Zeichen 32 = Blank time=time + 32; //ASCII-Zeichen 32 = Blank hwcom.send(time,str.length(time)); //Zeitstempel über hwcom senden wait hwcom.ready(); hwcom.send(s,str.length(s)); // Logtext über hwcom senden hwcom.ret(); // Schreiben des Logs in EEPROM (24C64 auf Adresse 3 ) eeprom.writestr(3,EEStart,time); //Zeitstempel eeprom.writestr(3,EEStart+32,s); //Logtext EEStart = (EEStart+64); // Schreibpointer hochsetzen if EEEnde < EEStart EEEnde=EEStart; // Endpointer mitschleppen, bis Ringspeicher voll ist if EEStart >= 0x2000 EEStart = 0x0000; //Wenn EEProm Ende, dann wieder vorne beginnen eeprom.writeint(0,513,EEStart); // neue Werte Restartfest im 1. EEPROM sichern eeprom.writeint(0,515,EEEnde); }; //----------------------------------------------------------------------------------- function leselog() // EEProm Logfile lesen //----------------------------------------------------------------------------------- {int i; //Schleifenzähler string s; //Stringinhalt byte y; // Stringlänge if debug //Ausgabe der Pointer { s="EEStart: "; str.putint(s,EEStart); hwcom.send(s,str.length(s)); wait hwcom.ready(); s="EEEnde: "; str.putint(s,EEEnde); hwcom.send(s,str.length(s)); wait hwcom.ready(); hwcom.ret(); }; for i = 0 ... (EEEnde-64) step 64 // von Anfang bis Endpointer-64 lesen { y=eeprom.readstr(3,i,s); //y liefert die Stringlänge, keine Fehlerbehandlung bei y=0 hwcom.send(s,y); wait hwcom.ready(); y=eeprom.readstr(3,i+32,s); hwcom.send(s,y); wait hwcom.ready(); hwcom.ret(); if i >= 0x1fc0 break; // nicht über Bereich hinauslesen falls falscher Pointer }; }; Vielleicht dient dies ja als Anregung. Gru� Jörg | ||
Antwort schreiben Antworten: |