- 12V Akku mit 280 Ah bauen         
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
    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.

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    06.08.2009
    Beiträge
    45
    Stimmt das mit dem endbyte hatte ich garnicht beachtet. Wegen der Auswertung: ich wollte in jeden Sektor nur einen datenstring schreiben und zur Auswertung dann die Sektoren durchgehen, dann brauche ich doch keine Endzeichen?
    Wegen der Anfangssektoren werde ich das mal bei meiner 1 gb Karte herausfinden und dann den Startsektor dementsprechend anpassen.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Fabian1995 Beitrag anzeigen
    ich wollte in jeden Sektor nur einen datenstring schreiben und zur Auswertung dann die Sektoren durchgehen, dann brauche ich doch keine Endzeichen?
    Wenn der Datenstring immer eine bestimmte Länge hat, könnte man auf das Endzeichen verzichten, ansonsten braucht man's um das Ende des Strings erkennen zu können. Bascom wird das Endzeichen aber auf jeden Fall schreiben, wenn also der String tatsächlich max 512 Bytes enthalten kann, dann unmittelbar auf die Buffervariable folgend ein einzelnes Byte dimensionieren, damit dieses das Endzeichen aufnimmt und nix überschrieben wird.

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Vielleicht solltest du nicht solche hintenrum Lösungen implementieren, die du nachher nicht mehr verstehen kannst.
    Tatsächlich habe ich es bei mir genau anders herum gemacht:

    Dim Messwerte_string * 512 as string
    Dim Buffer(512) As Byte at Messwerte_string overlay

    Dabei wird auch Platz für das Endezeichen bei 512 Byte langen Strings erzeugt.
    Die Bufferlänge von 512 reicht, weil die hier nur zur Verdeutlichung angegeben wird.

    Die DriveWriteSector() Funktion schreibt nicht bis zum Endezeichen des Strings sondern 512 Byte, egal was da drin steht.
    Das musst du dann nur beim Einlesen bedenken, wenn du die DriveReadSector() Funktion benutzt, um den Sektor wieder in den Buffer und damit in den String zu bekommen. Steht weder in den 512 Byte noch im zusätzlichen Byte von Messwerte_string kein 0-Byte, dann geht der String einfach weiter, solange bis er im SRAM auf ein 0-Byte trifft. Evtl. kommen damit aber die Stringfunktionen nicht mehr zurecht.

    Mit den Stringfunktionen solltest du bei solch langen Strings ohnehin sehr vorsichtig umgehen. Besonders Dinge wie

    Messwerte_string = "12345678901234567890" + Messwerte_string

    können zu recht hohen Anforderungen an deinen Frame Bereich führen, weil hierzu eine Kopie von Messwerte_string erzeugt werden muss.
    Damit werden dann evtl. die Stacks überschrieben, was zu recht garstigen Fehlern führen wird.

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    for_ro,
    Zitat Zitat von for_ro Beitrag anzeigen
    Vielleicht solltest du nicht solche hintenrum Lösungen implementieren,
    Die Hintenrum-Lösung war eine Korrektur Deines fehlerhaften Vorschlags:
    Zitat Zitat von for_ro Beitrag anzeigen
    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
    Und hat Dich immerhin dazu bewegt drüber nachzudenken und zu korrigieren.

Ä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