Hallo zusammen,
Ich schreibe momentan ein Programm mit dem ich eine SD-Karte mit einem Mega32 auslese. Das ganze mache ich OHNE dateisystem. Ich lege in Windows auf einer mit FAT16 Formatierten SD-Karte eine Textdatei an die folgenden Inhalt hat: "<START>Datenbereich<ENDE>". Mit dem µC lese ich dann immer einen Sektor (512Bytes) in einen String ein und durchsuche den anschließend nach meinem Startstring. In meinem Fall "<START>". Anschließend Suche ich nach dem Endstring; in meinem Falll "<ENDE>".
Dann kann ich genau sagen, wo die Daten auf der SD-Karte liegen.
Das ganze funktioniert bisher FAST einwandfrei. "<START>" findet er immer in Sektor 771 an Stelle 1. Solange "<ENDE>" vor 254 ist funktioniert es auch, aber sobald das Ende nach 254 ist fehlt ihm 255Aus Stelle 400 wird dann also z.b. 145. Die Variable ist vom Word-typ, aber er speichert wohl nur das untere byte ab
Hier mal mein Quellcode (Falls wer verbesserungen weiß, immer her damit!):
Falls das wirklich nur bis 254 geht muss ich wohl selbst was stricken. Dann lese ich es in ein Array anstatt einen String ein und muss mir dann selbst eine Suchfunktion basteln. Falls dafür jemand einen Tipp hat wäre ich sehr verbunden!Code:$regfile = "m32def.dat" $crystal = 16000000 $lib "mmc.lib" Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.7 , Rs = Portc.6 Config Lcd = 16 * 4 $include "config_mmc.bas" Dim Berror As Byte Dim Abuffer As String * 512 ' Hold Sector to and from CF-Card Dim Wsrampointer As Word ' Address-Pointer for write Dim Lsectornumber As Long ' Sector Number Dim Ende As Byte Dim S_position As Word Dim E_position As Word Dim S_sektor As Long Dim E_sektor As Long Dim Datenmenge As Word Dim Temp As Word Ende = 0 Lsectornumber = 0 Cls If Gbdriveerror = 0 Then Cls Do Wsrampointer = Varptr(abuffer) Berror = Drivereadsector(wsrampointer , Lsectornumber) If S_position = 0 Then S_position = Instr(1 , Abuffer , "<START>") S_sektor = Lsectornumber End If If S_position <> 0 Then E_position = Instr(1 , Abuffer , "<ENDE>") If E_position <> 0 Then E_sektor = Lsectornumber Ende = 1 End If End If Incr Lsectornumber Loop Until Ende = 1 Else Lcd "Fehler :-(" End If If S_sektor = E_sektor Then Datenmenge = S_position + 7 Datenmenge = E_position - Datenmenge Else Datenmenge = S_position + 6 Datenmenge = 512 - Datenmenge Temp = E_sektor - S_sektor Temp = Temp - 1 Temp = Temp * 512 Datenmenge = Datenmenge + Temp Datenmenge = Datenmenge + E_position Datenmenge = Datenmenge - 1 End If If Gbdriveerror = 0 Then Cls Lcd S_sektor ; ":" ; S_position ; "-" ; E_sektor ; ":" ; E_position Locate 2 , 1 Lcd "Menge: " ; Datenmenge ; " Bytes" End If End 'end program
Gruß
Marius







Zitieren

Lesezeichen