- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 6 von 6

Thema: String Frage

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    43
    Beiträge
    318

    String Frage

    Anzeige

    Praxistest und DIY Projekte
    Hallo,

    ich bekomme über den UART des AVR einen String von meinem PC gesendet. Diesen String möchte ich dann ins interne eeprom schreiben.

    Frage :

    Der String, welcher über die Serielle kommt ist unterschiedlich lang. in Bascom definiere ich ja :
    Code:
     Dim Text as String * 16
    jetzt speichere ich das ganze folgendermaßen :
    Code:
     writeeeprom Text, 1
    Sende ich einen String danach mit 10 Zeichen, dann überschreibt er ja im eeprom nur die ersten 10 Zeichen. Lese ich dann mit
    Code:
     readeeprom Text, 1
    den String aus, dann liest er die ersten 10 Zeichen vom 2. String aus und die restlichen 6 Zeichen vom 1. String.

    gibt es eine Möglichkeit, das ich bevor ich die Zeichen speichere das eeprom lösche ?


    habs vielleicht kompliziert geschrieben, aber ich hoffe Ihr könnt mir weiterhelfen.

    mfg Kay

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2004
    Ort
    Hard, Vorarlberg
    Beiträge
    155
    Strings haben einen String-Begrenzer und zwar das Zeichen &H00.
    Dieses Zeichen wird an das Ende jedes Strings sowohl im SRAM als auch im EEPROM gespeichert.
    Darum brauchen die Strings auch 1 Zeichen mehr Platz als es bei DIM definiert ist. In dieses zusatzliche Byte wird der String-Begrenzer gespeichert, falls der String selbst die ganze geDIM-te Länge benötigt.
    Wird ein String geschrieben, wird immer an das Ende des Strings auch das &H00 abgespeichert.
    Strings werden bis zu diesem Stringbegrenzer gelesen.

    Ich habe dein Beispiel im Simulator ausprobiert und hier werden die Strings korrekt ins EEPROM abgespeichert und auch wieder ausgelesen.

    Da du die Variablen im EEPROM nicht definierst, sondern mit absoluten Adressen beschreibst (zumindest in deinem Beispiel), könntest Du vielleicht übersehen haben, dass dieser String in Wirklichkeit 17 Bytes im EEPROM belegt oder der Fehler liegt möglicherweise woanders in deinem Code, was aber nicht ersichtlich ist, da Du nur Code-Fragmente angegeben hast.
    Viele Grüße
    Josef
    -------------------------------------------------------------------------------------
    DOS-File System für BASCOM-AVR auf http://members.aon.at/voegel

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich glaub, wenn Bascom einen String transferiert, nimmt er das 0-Byte am Ende ohnehin mit. d.h. beim Lesen liest du nur das aktuelle und nix altes dahinter.

    "glauben" heißt, es ist sicher immer so, nur beim writeeeprom hab ich es noch nicht probiert.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    43
    Beiträge
    318
    hi,

    hier ist mein kompletter Code :

    Code:
    $regfile = "m16def.dat"
    $crystal = 16000000
    $baud = 9600
    $eeprom
    
    
    Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.1 , Rs = Portc.0
    Config Lcd = 16 * 2
    Cursor Off
    Cls
    
    
    Const Keys = 5
    Dim I As Byte
    Dim Key As Byte
    Dim Text As String * 10
    Dim A As String * 10
    Dim B As String * 10
    Dim C As String * 10
    
    Dim A1 As String * 10
    
    
    Config Porta = Input
    Config Serialin = Buffered , Size = 10
    Enable Interrupts
    
    Resettaster Alias Pina.3
    Leuchte1 Alias Pina.0
    Leuchte2 Alias Pina.1
    Leuchte3 Alias Pina.2
    Kommunikation Alias Pina.4
    
    
    Porta = 255
    
    
    Declare Sub Firststart
    Declare Sub Nurdisplay
    Declare Sub Kommunikation2
    Declare Sub Speichern
    
    
    Call Firststart
    
    
    Do
    For I = 1 To Keys
    Key = I
    Select Case Key
       Case 1 : Debounce Leuchte1 , 0 , Display_key , Sub
       Case 2 : Debounce Leuchte2 , 0 , Display_key , Sub
       Case 3 : Debounce Leuchte3 , 0 , Display_key , Sub
       Case 4 : Debounce Resettaster , 0 , Display_key , Sub
       Case 5 : Debounce Kommunikation , 0 , Display_key , Sub
    
    End Select
    Next
    
    Loop
    End
    
    
    
    
    
    Sub Firststart
    Locate 1 , 1
    Lcd "..: Home SPS :.."
    Wait 1
    Locate 2 , 1
    Lcd "--Checking RAM--"
    Wait 1
    Locate 2 , 1
    Lcd "--Checking ROM--"
    Wait 1
    Locate 2 , 1
    Lcd "--System Ready--"
    Wait 1
    Cls
    Locate 1 , 1
    Lcd "..: Home SPS :.."
    End Sub
    
    Sub Nurdisplay
    Cls
    Locate 1 , 1
    Lcd "..: Home SPS :.."
    End Sub
    
    
    Display_key:
    Locate 2 , 1
    If Key = 4 Then
    Locate 2 , 1
    Lcd "     Reset"
    Wait 1
    Goto &H0X0000
    Else
    If Key = 1 Then
    Readeeprom Text , 1
    Locate 2 , 1
    Lcd Text
    Wait 1
    Else
    If Key = 2 Then
    Readeeprom B , 20
    Locate 2 , 1
    Lcd B
    Wait 1
    Else
    If Key = 3 Then
    Readeeprom C , 40
    Locate 2 , 1
    Lcd C
    Wait 1
    Else
    If Key = 5 Then
    Goto Kommunikation2
    Else
    
    End If
    End If
    End If
    End If
    End If
    
    
    Wait 1
    Call Nurdisplay
    
    Return
    
    
    Sub Kommunikation2
    Locate 2 , 1
    Lcd "PC Konfigurator"
    Text = Inkey()
    
         Inputbin Text
         Waitms 100
    
    
    Writeeeprom Text , 0
    
    Wait 1
    Goto &H0X0000
    'Call Nurdisplay
    
    
    End Sub
    das speichern geht. wenn ich hingehe und speichere einen String mit 10 Zeichen und diesen dann nach dem reset auslese, dann stimmt alles. speichere ich danach dann einen String mit 5 Zeichen, dann liest er nach dem Reset diese 5 Zeichen + die letzten 5 Zeichen vom letzten String.
    Das soll er nicht machen. er soll mir nur die 5 Zeichen vom letzten empfangenen String.

    mfg Kay

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich muß mir das zwar erst zerklamüsern, aber es ist eher so, daß du beim WRITEEPROM vergißt, am Ende des String einen &H00 anzufügen.
    Dann find' der readeeprom natürlich auch kein Ende beim kürzeren String.
    Check: Was reinsschreiben, 10 Byte, dann 5 Byte und dann mit dem Pony oder so den EEPROM auslesen. Du wirst sehen, da ist nix nuller nach den 5 Bytes.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    43
    Beiträge
    318
    hi,

    hab was reingeschrieben und dann mit pony ausgelesen. ( siehe Anhang )

    das heißt, bevor ich den string speicher muss ich also folgendes machen :

    Code:
     
    
    Text = Text + &H00
    
    writeeeprom Text, 1
    wäre das so richtig ?

    mfg Kay

Berechtigungen

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

Solar Speicher und Akkus Tests