Arduino UNO EEPROM von Text Datei beschreiben

Hallo,

Ich möchte folgendes realisieren:

Ich habe eine Text Datei mit Uhrzeiten. Diese sollen in den internen EEPROM gespeichert werden.
Nun habe ich es über die Seriellen Schnittstelle versucht und folgendes gebastelt:

#include <EEPROM.h>


char val;
int addr;
void setup(){
Serial.begin(9600);
addr = 0;

}


void loop() {
    if(Serial.available() > 0){
   
      val = Serial.read();
     
    

       
      EEPROM.write(addr++,val);
     }
      
       
      
}

Den Inhalt der Text Datei kopiere ich vollständig in den Seriellen Eingabe des IDEs.

So kann ich bis zu einer bestimmten Adresse fehlerfrei schreiben aber danach stimmt die Reihenfolge nicht mehr mit der Text Datei.

Write_Eeprom_Serial.ino (259 Bytes)

Vieleicht weil das Terminalprogram wenn Du Eter drückst ein CR und NL mitschickt.
Außerdem hat der UNO nur 1kByte EEPROM. Du solltest auch kontrollieren ob Du am ende angekommen bist sonst fängt das ganze wieder am Anfang an.
Grüße Uwe

a) Das Schreiben des EEPROMs ist sehr langsam: Das Beschreiben aller 1024 EEPROM-Adressen eines Arduino UNO dauert mehr als 3 Sekunden.
b) Der Empangs-Puffer der Seriellen Schnittstelle ist (nur) 64 Zeichen groß.

Beides kombiniert führt zu den Problemen, die du hast.
Die ersten Zeichen werden richtig ins EEPROM geschrieben, dann läuft der Puffer über und es kommt zu verstümmelten Zeichenfolgen.

Abhilfe:
Wie beim Füttern eines Kleinkindes (schön langsam: Löffelchen für Löffelchen), darst du die Serielle Schnittstelle nur mit kleinen Portionen füllen, also nicht die gesamte Datei "in einem Rutsch" senden.
Stelle das Zeilenende des Seriellen Monitors auf "kein Zeilenende" und sende immer nur z.B. 60 Zeichen auf einmal, danach erst die nächste Portion.
So bleibt genug Zeit für den EEPROM-Schreibprozess, ohne dass der Serielle Puffer überläuft.

Hallo vielen Dank für die Antworten. Ich hätte gedacht, dass die Serielle Schnittstelle die Zeichen alle auf einmal versucht zu schicken und somit eine Art Page write durchgeführt wird.
Ist es möglich:

  1. ein Page write auf den Internen EEPROM durchzuführen?
  2. Eine Art Begrenzung für den Seriellen Eingang einzubauen, sodass nur portionsweise abgearbeitet wird wenn mehr als 64 Zeichen vorhanden sind?
  1. ein Page write auf den Internen EEPROM durchzuführen?

Da das EEPROM keine Pages hat, naja...
Schaue dir mal die verschiedenen EEPROM.write() Methoden an.

  1. Eine Art Begrenzung für den Seriellen Eingang einzubauen, sodass nur portionsweise abgearbeitet wird wenn mehr als 64 Zeichen vorhanden sind?

Handshake, Xon/Xoff, ZModem
Baudrate auf 1200 stellen ungetestet

Alternativ:
Den ganzen Brocken ins Ram laden und dann erst ins EEPROM schaufeln.

Oder den EEPROM Inhalt per ISP übertragen.

grad nachgesehen, im "CoolTerm" gibts eine Option unter Transmit: "use transmit line delay", das kannst in ms Schritten setzen.

oder auch ein Option um die paketgröße festzulegen und ein delay zwischen den Paketen zu machen.

noiasca:
grad nachgesehen, im "CoolTerm" gibts eine Option unter Transmit: "use transmit line delay", das kannst in ms Schritten setzen.
oder auch ein Option um die paketgröße festzulegen und ein delay zwischen den Paketen zu machen.

CoolTerm ist ja wirklich sehr cool! :slight_smile:
Ich wollte gerade vorschlagen, so etwas z.B. in Python zu realisieren. Das ist ja nun nicht mehr nötig.

Danke! So hat es geklappt! Habe noch meinen Code mit Hilfe dieser Übersicht ergänzt und es funktioniert: Serial Input basic