Irgendwie steh ich auf dem Schlauch...
Will eine Intel-Hex-Datei einlesen, und hab das dann auch in einem
String stehen.
Original:
:1000000030303030305AFF10863133303930325A88
txt:
584948484848484848514851485148514851485365707049485654514951515148515751
485150536556561310
passt ja auch - nur wie mach ich daraus richtige Zahlen?
Sub Cmd1loadClick(ByVal sender As Object, ByVal e As EventArgs)
Dim myStream as IO.Stream, txt as String, i as Integer
openFileDialog1.DefaultExt = "hex"
openFileDialog1.Filter = "Hex files (*.hex)|*.hex"
openFileDialog1.Title = "Datei Laden ..."
openFileDialog1.FileName = ""
If openFileDialog1.ShowDialog() = DialogResult.OK Then
myStream = openFileDialog1.OpenFile()
txt=""
For i=0 To myStream.Length
txt = txt &(myStream.Readbyte)
Next i
myStream.Close()
End If
End Sub
hallo crazy horse
versuche das mal!
'Datei lesen
Private Sub lesen()
Dim FiStr As FileStream = _
New FileStream("c:\hextest.txt", FileMode.Open)
Dim StrRe As StreamReader = New StreamReader(FiStr)
MessageBox.Show(StrRe.ReadLine)
StrRe.Close()
End Sub
Du willst die einzelnen Bytes in ein Byte Array einlesen, oder?
Wenn ja, dann lies einfach eine Zeile ein, kopiere jeweils 2 Ziffern (in
Hex Darstellung ein Byte) in einen String (substring?) und wandle den
mit Convert.ToInt32() mit Basis 16 in eine Zahl um.
Naja, da gehört ja bissl mehr Gehirnschmalz dazu, als einfach einlesen.
Man muss ja Zieladresse, Länge der Zeile, Record-Type, Checksumme usw,
beachten. Ist aber in jeder programmiersprache machbar. Eine fertige
Funktion oder Klasse kenn ich aber auch nicht. Vielleicht findest du
hier die passenden Denkanstöße:
http://alumni.media.mit.edu/~deva/software/HexFileParser.java
>Original:>:1000000030303030305AFF10863133303930325A88>txt:>58494848484848484851485148514851485148536570704948565451495151514851575
1485150536556561310
>passt ja auch - nur wie mach ich daraus richtige Zahlen?
Jetzt (nach fünf- oder sechsmaligen Durchlesen...) habe ich auch
verstanden, was die Zahlen ausdrücken: Das sind die ASCII-Werte.
Zahlen zwischen 48 und 57 sind die Ziffern zwischen 0 und 9,
Zahlen zwischen 65 und 70 die Buchstaben "A" bis "F".
Zum Wandeln wirst du wohl eine Statemachine brauchen, da ja immer eine
bestimmte Menge Zeichen eine bestimmte Hex-Zahl darstellt
(Intel-Hex-Format zerlegen...).
Sollte aber nichts aufwändiges sein.
Ja, mit den Ascii-Werten ist klar, ich dachte, das wäre ersichtlich.
Das eintüten schaffe ich dann schon, obwohl PC-Programmierung nicht
gerade mein Steckenpferd ist :-)
Ich scheitere einfach an der Umwandlung Ascii-> reale Zahl.
Selbst wenn ich die Hexwerte A..F erstmal aussen vor lasse:
Warum funktioniert selbst folgendes einfaches nicht:
ByteAnzahl=(val(txt(2))*10 + val(txt(3))-48)*16 'Anzahl der Datenbytes
im record high
Fehlermeldung:
Ausnahme System.IndexOutOfRangeException wurde im ausgeführten Programm
ausgelöst:
Der Index war außerhalb des Arraybereichs.
Weiter ratlos...
Und was ich wirklich will:
Anzahl der Datenbytes in diesem record (0...16)
Startadresse dieser Daten (nur 64k-Modus, also 0..65535)
Recordtyp (es kommt nur 00 oder 01 vor)
Daten in einem Feld (max. 16 Bytes)
CRC
Das kann eigentlich gar nicht schwer sein, aber ich sitze jetzt schon 2
Tage an dieser jämmerlichen Umwandlung und komme kein Stück weiter.
Die Anzahl meiner grauen Haare hat sich verdoppelt :-)
Ich habe mal irgendwo einen AVR Bootloader in C#.NET gefunden. Könntest
davon die Klasse Hexfile für dich verwenden. Einfach Objekt erstellen
und mit der Methode LoadFile die Datei einlesen. Schon stehen dir alle
Informationen der Hexfile in deinem Programm zur verfügung.
Gruß
Roland
So, nun hammers....
Sub Cmd1loadClick(ByVal sender As Object, ByVal e As EventArgs)
Dim txt as String, test as String, i as Integer
Dim Adresse As Integer
Dim DateiNr As Integer
Dim k As Integer
openFileDialog1.DefaultExt = "hex"
openFileDialog1.Filter = "Hex files (*.hex)|*.hex"
openFileDialog1.Title = "Datei Laden ..."
openFileDialog1.FileName = ""
If openFileDialog1.ShowDialog() = DialogResult.OK Then
DateiNr=Freefile
FileOpen(DateiNr, openFileDialog1.FileName, OpenMode.Input)
do while not EOF (DateiNr)
txt =LineInput(DateiNr)
test=mid(txt,2,2) 'Anzahl Datenbytes
k=byte.Parse(test, Globalization.NumberStyles.HexNumber)
test=mid(txt,4,4) 'Adresse
Adresse=Integer.Parse(test,
Globalization.NumberStyles.HexNumber)
if k>0 Then
For i=10 To k*2+9 step 2
test=mid(txt,i,2)
EEpromBuffer(Adresse)=byte.Parse(test,
Globalization.NumberStyles.HexNumber)
'CRC_calc=CRC_calc+EEpromBuffer(i)
Adresse=Adresse+1
Next i
test=mid(txt,i,2)
'CRC_rec
End If
loop
FileClose(DateiNr)
End If
End Sub
Hauptsächliche Änderung: nicht mit I/O-Stream arbeiten sonern mit dem
guten alten LineInput. Dann habe ich direkt den String Zeile für Zeile
und kann den zerpflücken.
CRC fehlt zwar noch, aber es funktioniert wenigstens erst mal :-)
Vielen Dank an alle.