Forum: Mikrocontroller und Digitale Elektronik String filtern (BASCOM BASIC)


von Michael U. (Gast)


Lesenswert?

Hallo

Ich habe folgendes Problem:
Ich habe einen String, der folgendermaßen aussieht:

<A><C><K><CR><1><SP><1><SP><8><7><SP><1><4><3><CR>

Jedes Zeichen in < > sind ASCII-Zeichen, darunter auch 2 nicht-druckbare 
(CR und SP).

Ich will nun die Zahlen aus dem String herausfiltern und jede Zahl in 
einer extra Stringvariablen abspeichern. Das Problem welches nun 
hinzukommt ist, dass die Zahlen nicht fix sind, alle anderen Zeichen 
jedoch schon.

Sprich, der String könnte auch so aussehen:

<A><C><K><CR><1><3><SP><4><1><SP><1><8><7><SP><4><3><CR>


Ich habe schon eine gute Weile überlegt aber eine richtig gute 
Angehensweise habe ich nicht gefunden. Meine Lösung wäre, die ersten 3 
Zeichen erstmal wegzuschneiden (<A><C><K><CR>) und dann für jedes 
Zeichen extra eine Fallunterscheidung zu machen ob es eine Zahl ist.

Aber vielleicht weis ja einer on euch wie es einfacher geht :)

von Avr N. (avrnix) Benutzerseite


Lesenswert?

Wenn deine Zahl immer eine feste Position hat würde ich sagen mit MID 
Befehl die Zahl auschneiden.


http://www.comwebnet.de - Bascom AVR Projekte

von Harry U. (harryup)


Lesenswert?

hi,
die sprache dabei ist eigentlich egal, du kannst die einzelnen strings 
innerhalb der klammern mit der funktion 'val(string)' auf ihren 
numerischen wert untersuchen, dann bekommst du raus, welcher einer zahl 
entspricht.
grüssens, harry

von Michael U. (Gast)


Lesenswert?

Hallo

Ich bin die Sache nun folgendermaßen angegangen, hier der Code:

Definitionen:
1
Dim received_char_len As Byte
2
Dim schleifenvar As Byte
3
Dim received_char_split As String * 1
4
Dim Cmu_vw_array As String * 30

1
  '***** String filtern*****
2
  received_char_len = Len(received_char)
3
  received_char_len = received_char_len - 1     'wegen dem <CR> am Ende
4
5
  For schleifenvar = 5 To received_char_len
6
    received_char_split = Mid(received_char , schleifenvar , 1)
7
8
    Select Case received_char_split
9
       Case "0" : Mid(cmu_vw_array , schleifenvar , 1) = "0"
10
                   Print #2 , "0";              'Zur Kontrolle
11
       Case "1" : Mid(cmu_vw_array , schleifenvar , 1) = "1"
12
                   Print #2 , "1";
13
       Case "2" : Mid(cmu_vw_array , schleifenvar , 1) = "2"
14
                   Print #2 , "2";
15
       Case "3" : Mid(cmu_vw_array , schleifenvar , 1) = "3"
16
                   Print #2 , "3";
17
       Case "4" : Mid(cmu_vw_array , schleifenvar , 1) = "4"
18
                   Print #2 , "4";
19
       Case "5" : Mid(cmu_vw_array , schleifenvar , 1) = "5"
20
                   Print #2 , "5";
21
       Case "6" : Mid(cmu_vw_array , schleifenvar , 1) = "6"
22
                   Print #2 , "6";
23
       Case "7" : Mid(cmu_vw_array , schleifenvar , 1) = "7"
24
                   Print #2 , "7";
25
       Case "8" : Mid(cmu_vw_array , schleifenvar , 1) = "8"
26
                   Print #2 , "8";
27
       Case "9" : Mid(cmu_vw_array , schleifenvar , 1) = "9"
28
                   Print #2 , "9";
29
      Case Else : Mid(cmu_vw_array , schleifenvar , 1) = " "
30
                   Print #2 , " ";
31
   End Select
32
33
   Waitus 10
34
 Next schleifenvar

Die Variable cmu_vw_array soll später die einzelnen Zahlen in einem 
String speichern und sie mit einem Leerzeichen trennen.

Wenn ich mir mit dem Logic Analyzer die Print-Befehle anschaue passt das 
soweit. Aber die Zuweisung

Mid(cmu_vw_array , schleifenvar , 1) = "9"

funktioniert nicht. Da bekomme ich nichts brauchbares zusammen...
Wie kann ich das umschreiben?

von avrnix = Spammer (Gast)


Lesenswert?

Avr Nix ist ein Spammer

von STK500-Besitzer (Gast)


Lesenswert?

>Mid(cmu_vw_array , schleifenvar , 1) = "9"

kann auch nicht gehen, da MID 1 Zeichen des cmu_vw_array an der Stelle 
schleifenvar zurückliefert. Es setzt keine Strings zusammen.

Das einfachste wäre so:

for i = 1 to received_char_len
    if mid(received_char,i,1) >= "0" and mid(received_char,i,1) <="9" 
then cmu_vw_array = cmu_vw_array + mid(received_char,i,1)
next i

Zumindest funktioniert das so oder ähnlich in verschiedenen 
PC-Basic-Dialekten.
Du solltest dir die Stringverarbeitung von Bascom mal ansehen...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.