PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : String nach Array umwandeln (?)



slavezero
07.06.2012, 15:11
Hallo,

ganz einfach gefragt: wie bekomme ich Zeichen aus einem String in ein Array?
Ich mache zur zZ folgendes.


$regfile = "m2561def.dat"
$crystal = 8000000
$hwstack = 256
$swstack = 256
$framesize = 256
$lib "I2C_TWI.LBX"
Config Twi = 400000
$baud = 57600
$baud1 = 57600
Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
Spiinit


Dim Rxd_sgn As Byte
Dim Rxd_stat As Byte
Dim Rxd_buffer As String * 130

Dim Values(40) As Byte
Dim Rxdbuffer(130) As Byte

Dim Debugstr As String * 130
Dim A_str As String * 130
Dim B_str As String * 130
Dim C_str As String * 130
Dim L_str As Byte

On Urxc Record ' isr rxd (com1)
Rxd_stat = 0
Open "com2:" For Binary As #1

'-------------------------------------------------------------------------------
'main
Do

If Rxd_stat = 2 Then
If Left(rxd_buffer , 2) = "#a" Then A_str = Rxd_buffer
If Left(rxd_buffer , 2) = "#b" Then B_str = Rxd_buffer
If Left(rxd_buffer , 2) = "#c" Then C_str = Rxd_buffer

Rxd_stat = 0
L_str = 0
Rxd_buffer = ""
Enable Interrupts ' interrupts freigeben
Enable Urxc
End If

'(
' nur für test:
Print #1 , A_str;
Print #1 , Len(a_str)
Print #1 , B_str;
Print #1 , Len(b_str)
Print #1 , C_str;
Print #1 , Len(c_str)
')
Loop
Close #1
End
'-------------------------------------------------------------------------------
Record:
Rxd_sgn = Udr0 ' von uart register nach zeichen

If Rxd_sgn = &H23 Then Rxd_stat = 1 ' < # > empfangen
If Rxd_stat = 1 Then Rxd_buffer = Rxd_buffer + Chr(rxd_sgn) ' von zeichen nach string


If Rxd_sgn = &H0D Then
Rxd_stat = 2 ' < CR > empfangen. string ende
Disable Interrupts ' interrupts sperren
Disable Urxc
L_str = Len(rxd_buffer)
End If
Return
'-------------------------------------------------------------------------------



In der Int.routine < record: > wird jedes empfangene Zeichen in einen String < rxd_buffer > geschoben.
(Ende ist erreicht wenn &H0D empfangen worden ist)
dann verschiebe ich den empfangen String, je nach zweitem Zeichen in einen anderen String. Zb. nach <A_Strg>

nun bräuchte ich aber die Zeichen in einem Array, hier bei mir < Rxdbuffer > um sie weiter verarbeiten zu können.
Wie bekomme ich die Zeichen da hin?

sz

Che Guevara
07.06.2012, 15:26
Hallo,

hab hier schnell was zusammengetippt, sollte aber funktionieren:


Dim Lenght As Word
Dim Receive_ar(130) As Byte
Dim Rxd_buffer As String * 130
Dim Tmp As Word


'...
'...

Lenght = Len(rxd_buffer)
For Tmp = 1 To Lenght
Receive_ar(tmp) = Mid(rxd_buffer , Tmp , 1)
Next Tmp

Auch wenn diese Variante nicht die schnellste ist, funktionieren tuts ;)
Oder aber evtl. mittels Overlay:


Dim Rxd_buffer As String * 130
Dim Receive_ar(130) As Byte At Rxd_buffer Overlay

Dabei stehen dann die Werte automatisch im Array, da es streng genommen gar kein Array gibt, sondern du die Bytes, aus denen der String besteht, nur indirekt darüber ansprichst. Hat aber den Nachteil, dass wenn du das Array veränderst, du auch gleichzeitig den String veränderst. Außerdem musst du dann selbst herausfinden, wann der String zu Ende ist, sofern er nicht automatisch sowieso immer 130 Zeichen lang ist.... Diese Variante ist deutlich schneller, da sie eig gar keine Rechenzeit benötigt ;)

Gruß
Chris

slavezero
07.06.2012, 16:10
Hi,

danke für die schnelle Antwort. da werde ich mal probieren :)

sz

slavezero
07.06.2012, 17:21
Hi,

also, ich habe natürlich zuerst die Overlay Variante ausprobiert -> funktioniert.
Aber eins ist (für mich) seltsam:
wenn ich das overlay direkt über meinen bD_strg lege, so


Dim Rxdbuffer(130) As Byte At Bd_str Overlay

dann meldet BASCOM: Error : 90 Line : 155 Address out of bounds [RXDBUFFER] , in File : D:\Bascom_Projekte\ .... .bas
schreibe ich aber:


Dim Rxdbuffer(130) As Byte At Rxd_buffer Overlay

geht es.
MM habe ich alles richtig dim:


Dim Bh_str As String * 130
Dim Dk_str As String * 130
Dim Bd_str As String * 130
Dim Rxd_buffer As String * 130
'Dim Rxdbuffer(130) As Byte At Rxd_buffer Overlay
Dim Rxdbuffer(130) As Byte At Bd_str Overlay

eigenartig; na egal, Haupsache es funzt.
@ Chris: vielen Dank für Deine Hilfe :)

Uwe