mikrocontroller.net

Forum: PC-Programmierung Array aus Textdatei füllen?


Autor: Elias R. (e-ra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mir für meinen Mega164 ein Programm geschrieben, dass ein 
externes EEPROM per I2C programmiert. Die Daten dafür liegen im FLASH 
und werden so von mir definiert:

#include <avr/pgmspace.h>

const uint8_t e2p_data[] PROGMEM = { ...1024byte... }

Zum brennen auf den Chip verwende ich das Programm "jtagice.exe" von 
AVR. Damit kann ich per .bat den Chip mit einem klick brennen.

Kann ich irgendwie dieses Monsterarray in eine externe Datei auslagern?

Am besten so, dass ich einfach nur den Inhalt des Arrays, also 0x00, 
0x01, 0x02.....in einer Textdatei speichere und dann beim kompilieren er 
die Daten dort rausholt.

Textdatei an vorgegebene Stelle kopieren -> AVR Studio aufmachen und 
kompilieren -> Brennen -> fertig

Dann könnte ich die Textdatei - die Daten des Arrays, die dann später 
ins EEPROM sollen - einfach tauschen wenn was anderes reingeschrieben 
werden soll.

Danke

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Textdatei:
0x01, 0x02, 0x03

C-Code:

const uint8_t e2p_data[] PROGMEM = 
{ 

#include "textdatei"

};


Sollte so funktionieren.

Autor: Elias R. (e-ra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly schrieb:

> C-Code:
>
> 
> const uint8_t e2p_data[] PROGMEM =
> {
> 
> #include "textdatei"
> 
> };
> 
> 


Beim Öffnen der Datei setzt er mir drei komische Zeichen vorne hin:
0x40,0x01,0xB1,0xC3,0x1C,0x35, 

Meckert er dann so an:
../out_hex.txt:1: error: stray '\357' in program
../out_hex.txt:1: error: stray '\373' in program
../out_hex.txt:1: error: stray '\377' in program

In der Textdatei hingegen gehts gleich mit den "richtigen" Daten los.

Wie könnte man das noch lösen?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Elias R. schrieb:

>
> ../out_hex.txt:1: error: stray '\357' in program
> ../out_hex.txt:1: error: stray '\373' in program
> ../out_hex.txt:1: error: stray '\377' in program
> 
>

Wo hast du die Textdatei her?
Wird die mit einem Programm erzeugt?

> In der Textdatei hingegen gehts gleich mit den "richtigen" Daten los.

Zumindest zeigt ein anderer Texteditor diese Zeichen nicht an. Das 
heisst aber nicht notwendigerweise, dass sie nicht drinn sind. Am besten 
organisierst du dir einen Hex-Editor und siehst dir byteweise an, wie 
die Datei losgeht.

> Wie könnte man das noch lösen?

Der Lösungsweg ist schon richtig.
Nur muss die Textdatei dafür auch richtig aufgebaut sein. Kein 
Sonderzeichen, keine Codierungsinfo. Plain vanilla ASCII und sonst 
nichts. Dein Punkt zum Ansetzen ist die Erzeugung dieser Textdatei und 
nicht die Verwendung.

Autor: Elias R. (e-ra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Textdatei erzeuge ich mir selber aus einer binären Datei.
Die Hex Werte werden dann mit Komma getrennt in ein .txt geschrieben.
Ist also keine richtige Hex Datei, sondern nur die Hex Werte in einer 
Textdatei.

Was könnte man da falsch machen beim Umwandeln, bzw. beim Erstellen der 
Textdatei?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Evt als Unicode gespeichert? Dann werden manchmal ein paar 
Initialisierungsbits reingeschrieben

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
genau genommen die Byte order mark (BOM), siehe 
http://de.wikipedia.org/wiki/Byte_Order_Mark
Wahrscheinlich ist das Ding als UTF-8 gespeichert, deshalb geht es
mit okt 357 los, das ist 0xEF.

Autor: Elias R. (e-ra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> genau genommen die Byte order mark (BOM), siehe
> http://de.wikipedia.org/wiki/Byte_Order_Mark
> Wahrscheinlich ist das Ding als UTF-8 gespeichert, deshalb geht es
> mit okt 357 los, das ist 0xEF.

Richtig es war UTF8. Jetzt habe ich mal folgendes versucht:

VB-Code:
My.Computer.FileSystem.WriteAllText(OutPath, hexarray(i), True, System.Text.Encoding.ASCII)

Mit ASCII werden dann beim includen die ersten 5 bytes als 0x00 gelesen.
Also auch noch nicht das Wahre.

Karl heinz Buchegger schrieb:
> Der Lösungsweg ist schon richtig.
> Nur muss die Textdatei dafür auch richtig aufgebaut sein. Kein
> Sonderzeichen, keine Codierungsinfo. Plain vanilla ASCII und sonst
> nichts. Dein Punkt zum Ansetzen ist die Erzeugung dieser Textdatei und
> nicht die Verwendung.

Was ist dann "plain vanilla" ASCII?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ASCII ohne Schnickschnack, also auch ohne die drei einleitenden Bytes.

Nimm einen einfachen schlichten Editor, der nur oder zumindest
auf Anforderung nackte ASCII-Dateien speichern kann.

Oder du öffnest die Datei, wie du es oben gezeigt hast, lässt die
ersten Zeichen weg (deine fünf Nullen) und schreibst den Rest wieder.
Dann sollte das Resultat auch nacktes ASCII sein.

Autor: Elias R. (e-ra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> Oder du öffnest die Datei, wie du es oben gezeigt hast, lässt die
> ersten Zeichen weg (deine fünf Nullen) und schreibst den Rest wieder.
> Dann sollte das Resultat auch nacktes ASCII sein.

Die Frage ist doch eher wie ich die Daten gleich "plain vanilla" ASCII 
speichern kann? Oder besser gesagt: So speichern, dass beim includen 
alles reibungslos funktioniert.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich kann ja kein VB, aber du offenbar.
Du hast doch schon eine Zeile gezeigt wie:
...System.Text.Encoding.ASCII...
Wenn du alles so schreibst (ohne die Nullen vorweg) sollte
das Resultat doch ASCII sein.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: Ich hatte mir mal ein kleines Programm gebaut, das aus beliebigen
Binärdateien eine passende Folge von Initialisierungen für C macht,
die man mit #include einfügen kann.
Bei Bedarf kannst du das ja auch nehmen, und die Datei einfach neu
erzeugen aus deinem Original.

Autor: Elias R. (e-ra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> Wenn du alles so schreibst (ohne die Nullen vorweg) sollte
> das Resultat doch ASCII sein.

Das dachte ich auch. Aber wie gesagt er überschreibt mir die ersten 
Werte. Ich könnte also beim Erstellen des Files erstmal Platzhalter 
schreiben und dann mit den wirklichen Daten loslegen. Aber so richtig 
gefällt mir die Lösung noch nicht.

Muss doch möglich sein, dass sauber hinzubekommen?

Wie hast du denn das in deinem Programm gelöst?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Elias R. schrieb:
> schreiben und dann mit den wirklichen Daten loslegen. Aber so richtig
> gefällt mir die Lösung noch nicht.
Schau mal ob du irgenwie die Möglichkeit hast eine Datei im RAW/Binary 
Modus zu schreiben, ich vermute mal das die 'FileSystem.WriteAllText' 
Funktion standardmäßig ein paar Bytes hinzufügt um später beim einlesen 
das Encoding erkenne zu können.

Autor: Elias R. (e-ra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So VB bewandert bin ich leider auch nicht. Aber ich such mal nach einer 
anderen Möglichkeit das File zu speichern.

Autor: Klaus Wachtler (mfgkw)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Elias R. schrieb:
> ...
> Wie hast du denn das in deinem Programm gelöst?

In C++ ganz einfach und schlicht.

Quelltext: http://mfgkw.dyndns.org/bin2c.cpp
Für Windows übersetzt als Anlage.

Autor: Elias R. (e-ra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich meine konvertierten Daten aus dem Textfile rauskopiere, ein 
neues Textfile per rechte Maustaste -> Neu erstelle und die Daten dann 
wieder einfüge funktioniert alles.
Das heißt ich muss jetz einen Weg finden wie ich in VB ein "richtiges" 
Textfile erstelle so wie Windows es tut. (oder ich erstelle vorher ein 
Textfile und lass die Daten dann reinschreiben was aber nicht seh 
praktisch ist.)

Kann mir da jemand behilflich sein?

Autor: Elias R. (e-ra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt habe ich endlich einen Weg gefunden das Textfile richtig zu 
erstellen:
   Dim fso, MyFile
   Set fso = CreateObject("Scripting.FileSystemObject")
   Set MyFile = fso.CreateTextFile("c:\testfile.txt", True)
   MyFile.WriteLine("This is a test.")
   MyFile.Close

So funktionierts.
-closed-

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sieht doch ganz einfach aus, warum nicht gleich so? :-)

Autor: Elias R. (e-ra)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jaja.... ;-)

Es gibt in VB irgendwie so viele Arten gewisse Dinge zu bewirken. Ich 
hab allerdings absolut keine Ahnung wie man was wo wie verwendet...

Was unterscheidet denn den Code jetzt von dem oben in der Wirkung?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fragst du das mich? Ich habe mit VB nix am Hut...
Dafür bin ich zu doof, ich kann nur C.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.