PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Stringvariabel in ein Byte konvertieren, select case mit Stringvariablen



mat-sche
29.01.2019, 16:35
Liebes Forum,

über rs232 lese ich einen String ein


Read_string()<\r><\n>
+IPD,0,13:xxxxxxxx<\n>
<\r><\n>
Rxbyte(10 .. 11): 49 48<\r><\n>
Esp_uni_byte(1 .. 2): 10 0<\r><\n>
esp_uni_byte: 9<\r><\n>
app_command: :xxxxxxxxx<\r><\n>
error <\r><\n>


+IPD,0,7 besagt, dass 7 Zeichen vom Sender 0 gesendet werden: garten + 1x Line Feed.
Abhängig von der Anzahl der gesendeten Daten, möchte ich nur die Informationen z.Bsp "xxxxx0" aus dem String filtern.
Ich möchte nun den String "xxxxxx" herausfiltern und weiter in einer select case Struktur verarbeiten.

dazu habe ich eine Stringvariable:

Dim Rxstring As String * 51
Dim Rxbyte(50) As Byte At Rxstring Overlay
Dim App_command As String * 15

Ãœber dem String liegt ein Byte Array, Rxbyte(10) ; Rxbyte(11):

+IPD,0,13:gaaaa-ravo
=> 043 073 080 068 044 048 044 049 051 058 103 097 097 097 097 045 114 097 118 111 045 049 010
! !
Rxbyte(10)
!
Rxbyte(11) = beide Byte ergeben 13 und das ist die Anzahl für: gaaaa-ravo-0

Nun wollte ich über Esp_uni_byte(1) = Val(rxbyte(10)) mir die Zahl als Byte ausgeben, was auch gut geht.

If Uart_3_rxd = 1 Then
Uart_3_rxd = 0
Rxstring = Read_string()
Print #2 , "Read_string()" ; Rxstring
Esp_str_count = 0
Print #2 , "Rxbyte(10 .. 11): " ; Rxbyte(10) ; " " ; Rxbyte(11) ' was steht in den beiden byts?

Esp_uni_byte(1) = Val(rxbyte(10)) ' anzahl der gesendeten zeichen in byte schreiben
Print #2 , "Esp_uni_byte(1 .. 2): " ; Esp_uni_byte(1) ' anzahl anzeigen
Esp_uni_byte(1) = Esp_uni_byte(1) - 1 ' -1 für "LF(Line Feed)"
Print #2 , "esp_uni_byte: " ; Esp_uni_byte(1)
App_command = Mid(rxstring , 12 , Esp_uni_byte(1)) ' aus dem empfangenen string daten entnehmen
Print #2 , "app_command: " ; App_command ; " " ; Len(app_command)
Select Case App_command ' string auswerten
Case "xxxx" : Print #2 , "app_command " ; "garten!!!"
Case "xxx-1" : Print #2 , "app_command " ; "Rasen vorn an"
Case "xxx" : Print #2 , "app_command " ; "Rasen vorn aus"
Case Else : Print #2 , "error "
End Select

End If

1. Frage:
mit Esp_uni_byte(1) = Esp_uni_byte(1) - 1 ziehe ich immer ein zeichen ab, für line feed, wie kann ich über select case dieses line feed mit in die Auswertung nehmen? Also Case "garten"

2. mit dem Programmabschnitt lässt sich nur Daten unter 10 Zeichen auswerten, habe ich mehr sieht meine Stringauswertung dann so aus


Read_string()<\r><\n>
+IPD,0,13:gaaaa-ravo-1<\n>
<\r><\n>
Rxbyte(10 .. 11): 49 51<\r><\n>
Esp_uni_byte(1 .. 2): 13<\r><\n>
esp_uni_byte: 12<\r><\n>
app_command: 3:gaaaa-ravo 12<\r><\n>
error

Ich hole 12 Zeichen ab, es werden dann für die case-Struktur dieser String genommen: gaaaa-ravo 10 Zeichen und 2x space....
Woher kommen die 2x space her???

Grüße MAT

mat-sche
30.01.2019, 13:16
Moin Moin!

ich habe meinen Fehler noch selber finden können. Bei einer Zeichenfolge von mehr als 9 Zeichen stimmt der Platz nicht mehr, von dem ich dann den String hole.
neuer Code:


If Uart_3_rxd = 1 Then
Uart_3_rxd = 0
Rxstring = Read_string()
'inhalt Rxstring <\r><\n>+IPD,0,10:xxxxxxx<\n><\r><\n>

Esp_str_count = 0
Esp_uni_byte(1) = Instr(rxstring , "+IPD") ' ist im string die richtige info
If Esp_uni_byte(1) > 0 Then
Esp_uni_byte(1) = Val(rxbyte(10)) ' anzahl der gesendeten zeichen in byte schreiben
Esp_uni_byte(2) = Charpos(rxstring , ":") ' startpunkt für zu suchendes kommando suchen
Esp_uni_byte(2) = Esp_uni_byte(2) + 1 ' start komando ist stelle +1 (nach doppelpunkt)
Esp_uni_byte(1) = Esp_uni_byte(1) - 1 ' line feed hinter kommando abziehen
App_command = Mid(rxstring , Esp_uni_byte(2) , Esp_uni_byte(1)) ' aus dem empfangenen string kommando-daten entnehmen
Select Case App_command ' kommandodaten auswerten
Case "xxx" : Print #2 , "app_command " ; "garten!!!"
Case "xxx" : Print #2 , "app_command " ; "Rasen vorn an"
Case "xxx" : Print #2 , "app_command " ; "Rasen vorn aus"
Case Else : Print #2 , "error "
End Select
End If

End If


Grüße MAT