Archiv verlassen und diese Seite im Standarddesign anzeigen : String Frage
BlaueLed
12.01.2006, 12:55
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 :
Dim Text as String * 16 jetzt speichere ich das ganze folgendermaßen :
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
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
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.
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.
BlaueLed
12.01.2006, 19:27
hi,
hier ist mein kompletter 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
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.
BlaueLed
12.01.2006, 20:38
hi,
hab was reingeschrieben und dann mit pony ausgelesen. ( siehe Anhang )
das heißt, bevor ich den string speicher muss ich also folgendes machen :
Text = Text + &H00
writeeeprom Text, 1
wäre das so richtig ?
mfg Kay
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.