- fchao-Sinus-Wechselrichter AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: String auf SD-Karte mit Drivewritesector()

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Laut der Hilfe schreibst du mit dem Befehl bis zu 512 Bytes in einen Sektor:

    Write a Sector (512 Bytes) to the (Compact Flashcard) Drive
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    06.08.2009
    Beiträge
    45
    Okay hab ich anscheinend überlesen....
    Aber wo wird bei dem Befehl definiert was ich jetzt eigentlich speichere?
    in meinem Fall gibt doch Berror einen Wert zurück, ob das Schreiben funktioniert hat, wsrampoint die Adresse von wo und Lsectornumber in welchen Sektor ich es schrieben will.
    oder wird mit wsrampoint automatisch das byte an dieser Stelle übertragen?

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Fabian,
    ich habe das einfach so gemacht:
    Code:
    Dim Berror As Byte
    Dim Buffer(512) As Byte 'SRAM-Bereich für Transfer
    Dim Messwerte_string * 512 as string at Buffer(1) overlay
    Dim Wsrampoint As Word 'Adress-Pointer für die Drive.. Routinen
    Dim Lselectornumber As Long 'Variable für Sektor-Nummer
    Wsrampointer = Varptr(buffer(1))
    Lselectornumber =1
    .....
    Druck1 = Getadc(4)
    Druck2 = Getadc(5)
    Temperatur = Getadc(6)
    Messwerte_string = Gpgga + ";" + Str(druck1) + ";" + Str(druck2) + ";" + Str(temperatur) + "*"
    Berror = DriveWriteSector(Wsrampointer,Lselectornumber)
    Du schreibst in den String, durch das Overlay aber gleichzeitig auch in das Byte-Array Buffer.
    Der DriveWriteSector Befehl schreibt immer die nächsten 512 Byte ab der angegebenen Adresse auf die SD Karte.
    Beachte, dass du die Karte mit Windows nicht mehr lesen kannst, wenn du auf den Sektor 1 schreibst.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    09.03.2012
    Beiträge
    51
    Zitat Zitat von for_ro Beitrag anzeigen
    Der DriveWriteSector Befehl schreibt immer die nächsten 512 Byte ab der angegebenen Adresse auf die SD Karte.
    Beachte, dass du die Karte mit Windows nicht mehr lesen kannst, wenn du auf den Sektor 1 schreibst.
    Hallo!
    Grundsätzlich ist es bei SD-Karten möglich, innerhalb eines Sektors Schritt für Schritt zu schreiben - jedes Byte immer dann, wenn es vom Messgerät eingelesen wird. Wahrscheinlich geht das aber nicht mit den üblichen Prozeduren.
    Ich wollt nur auf die Möglichkeit hinweisen, weil ist so etwas schon einmal gemacht habe. Dadurch kann man auch mit Mikrocontrollern mit wenig Speicher (z.B. ATtiny25) auf SD-Karten schreiben.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    06.08.2009
    Beiträge
    45
    Danke for_ro,
    Genau das habe ich gesucht
    Hatte auch noch dummer Weis eine Variable falsch geschrieben... aber jetzt funktioniert es
    Hatte gedacht in Sektor 0 stehen die wichtigen Daten die man nicht verändern darf aber in Sektor 1 darf man doch schon etwas schreiben oder?

    Fabian

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von Fabian1995 Beitrag anzeigen
    Hatte gedacht in Sektor 0 stehen die wichtigen Daten die man nicht verändern darf aber in Sektor 1 darf man doch schon etwas schreiben oder?
    Wenn du die Karte mit Windows lesen willst, dann kannst du sehr viele Sektoren am Beginn der Karte nicht benutzen.
    Wieviele hängt wohl auch von der Größe der Karte und der Art der FAT ab.
    Ich hatte damals eine Karte frisch formatiert und dann einen File mit bekanntem Inhalt (1234567890123456...) draufgeschrieben. Der steht dann auf dem ersten verwendbaren Sektor. Mit dem µC habe ich dann über DriveReadSector diesen Sektor gesucht.
    Bei meiner 1GB Karte war es der Sektor 768.

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von trekko Beitrag anzeigen
    Ich wollt nur auf die Möglichkeit hinweisen, weil ist so etwas schon einmal gemacht habe. Dadurch kann man auch mit Mikrocontrollern mit wenig Speicher (z.B. ATtiny25) auf SD-Karten schreiben.
    Hallo trekko,
    würde mich auch mal interessieren, wie das geht. Müsste man wahrscheinlich die DriveWriteSektor Funktion so ändern, dass über einen zusätzlichen Parameter die Anzahl bytes übergeben wird. Und nur die werden dann geschrieben.
    Irgendwo habe ich mal gelesen, dass die Daten erst in einen Buffer geschrieben werden. Wenn dann ein Sektor komplett ist, wird er auf die Karte übertragen. Dies geschieht im Controller der Karte.

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    09.03.2012
    Beiträge
    51
    Zitat Zitat von for_ro Beitrag anzeigen
    würde mich auch mal interessieren, wie das geht. Müsste man wahrscheinlich die DriveWriteSektor Funktion so ändern, dass über einen zusätzlichen Parameter die Anzahl bytes übergeben wird. Und nur die werden dann geschrieben.
    Irgendwo habe ich mal gelesen, dass die Daten erst in einen Buffer geschrieben werden. Wenn dann ein Sektor komplett ist, wird er auf die Karte übertragen. Dies geschieht im Controller der Karte.
    Hi for_ro, ich kenn ja die DriveWriteSektor-Funktion nicht, ich hab die SD-Karte "zu Fuß" beschrieben, das heißt, ich hab die Schreibbefehle für die SD-Karte direkt über die serielle Leitung geschickt. Hier findest du ein paar Infos zu dem Thema: http://elm-chan.org/docs/mmc/mmc_e.html

    Natürlich ist das aufwändiger, als so komfortable Funktionen wie DriveWriteSektor zu benutzen, es hat aber den Vorteil, dass man den Schreibvorgang so beeinflussen kann, wie man will. Das Schreibprotokoll für die SD-Karten erlaubt es nämlich, während des Schreiben eines Blocks den Clock-Takt vorübergehend anzuhalten und dann ein paar Sekunden (oder Minuten) später weiterzuschreiben, als wäre nichts gewesen.

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Zitat Zitat von trekko Beitrag anzeigen
    ... ich kenn ja die DriveWriteSektor-Funktion nicht, ich hab die SD-Karte "zu Fuß" beschrieben, das heißt, ich hab die Schreibbefehle für die SD-Karte direkt über die serielle Leitung geschickt.
    Hatte ich mir auch so gedacht. Cool wäre es allerdings, wenn man das auch über einen modifizierten DriveWrite Befehl machen könnte.
    Zitat Zitat von trekko Beitrag anzeigen
    Hier findest du ein paar Infos zu dem Thema: http://elm-chan.org/docs/mmc/mmc_e.html
    Natürlich ist das aufwändiger, als so komfortable Funktionen wie DriveWriteSektor zu benutzen, es hat aber den Vorteil, dass man den Schreibvorgang so beeinflussen kann, wie man will. Das Schreibprotokoll für die SD-Karten erlaubt es nämlich, während des Schreiben eines Blocks den Clock-Takt vorübergehend anzuhalten und dann ein paar Sekunden (oder Minuten) später weiterzuschreiben, als wäre nichts gewesen.
    Aber diese Sache mit dem Clock anhalten ist dort nicht beschrieben, oder habe ich das übersehen?
    Hast du dieses unterbrechen schon mal implementiert? Das wäre genau das, wie ich es auch gerne machen würde. Zur Zeit warte ich 8 Minuten, bis ich 512 Byte zusammen habe und diese dann en Block auf die Karte schreibe.

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von for_ro Beitrag anzeigen
    Code:
    Dim Buffer(512) As Byte 'SRAM-Bereich für Transfer
    Dim Messwerte_string * 512 as string at Buffer(1) overlay
    Man kann keinen String mit einer Länge von 512 Zeichen über ein 512 Byte Array legen, denn der String benötigt tatsächlich 512 Zeichen + 1 Endbyte. Wenn der String tatsächlich mal 512 Byte lang ist, wird die dem Array folgende Variable zerstört, hier Wsrampoint, mit unbestimmten Folgen. Auch fehlt dem String, sollte er überhaupt korrekt geschrieben werden, auf der SD-Karte das Endzeichen. Das kann dann bei der Weiterverarbeitung zu Problemen führen. Also den String nur 511 Zeichen lang dimensionieren.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Chr(0) im String
    Von Furtion im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 28.11.2008, 10:37
  2. string an lcd senden, string in pointer speichern
    Von andi.studi im Forum PIC Controller
    Antworten: 15
    Letzter Beitrag: 13.08.2008, 23:51
  3. String auf String zuweisen geht nicht
    Von Jaecko im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 14.12.2006, 17:48
  4. Sim-Karte
    Von Speed im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 2
    Letzter Beitrag: 18.11.2006, 11:51
  5. SD-Karte oder CF-Karte?
    Von Johannes G. im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 22.08.2006, 12:28

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen