Forum: Mikrocontroller und Digitale Elektronik mehrere über RS232 kommende hex-Werte (String) auswerten


von Ch S. (spelli)


Lesenswert?

Hallo,

ich möchte per UART mehrere aneinander gereihte hex-Werte auswerten.

Ich bekomme alles problemlos hin, wenn ich nur EINEN hex-Wert (bspw. 01) 
auswerte.


Leider scheitere ich an dem ganzen String:
01040A00FF - das ist der kommende Befehlssatz bzw. String. Dieser wird 
immer mit FF abgeschlossen.

Momentan realisiere ich das über eine If-Schleife.

Bin Newbie, habe versucht das hier: 
Beitrag "mittles ATmega VISCA "hex Werte" empfangen und auswerten" schon einmal 
darzustellen. Der Thread ist aber etwas lang geworden.


Danke und Gruß
Christoph

von Walter S. (avatar)


Lesenswert?

Ch Sp schrieb:
> Momentan realisiere ich das über eine If-Schleife.

das ist nicht gut, versuch mal eine while-Schleife

von Ch S. (spelli)


Lesenswert?

Hallo Walter S.,

warum ist eine If-Schleife nicht gut?

von Purzel H. (hacky)


Lesenswert?

Alles Schrott. Das Mittel der Wahl heisst Zustandsmaschine. 
(Statemachine)

von Ch S. (spelli)


Lesenswert?

Hallo,

das habe ich nach Lesen im Internet so halb verstanden.

Habe mein programm auf Case umgestellt.

Jetzt habe ich folgendes Problem:
1
(...)
2
Dim Com1 As ???                                            'Variable für UART
3
4
(...)
5
6
  If Usr.rxc = 1 Then                                       'Byte aus Empfangsregister lesen
7
    Com1 = Udr                                              'aus UART auslesen und Com1 zuweisen
8
9
  Select Case Com1
10
11
    Case &H01040602FF
12
(...)

Wobei das so ja falsch ist: Case &H01040602FF
Das sind ja 5 Byte (??), also muss die Variable ein String sein (??)

Habs probiert, aber ich habe auch nichts gefunden, was da näher bringt.
Auch jeden Wert einzeln macht mir beim compilieren Probleme...

von weinbauer (Gast)


Lesenswert?

if ist keine Schleife sondern ne Verzweigung ...
Dein Codeschnipsel ist Müll ...

von Ch S. (spelli)


Lesenswert?

1
$regfile = "m8def.dat"
2
$crystal = 4000000
3
$baud = 9600
4
5
Config Watchdog = 2048                                      'Watchdog konfigurieren auf 2048 Millisekunden
6
Start Watchdog                                              ' Watchdog starten
7
8
Led1 Alias Portc.1
9
Led2 Alias Portc.0
10
11
Config Servos = 2 , Servo1 = Portd.5 , Servo2 = Portb.1 , Reload = 10       'Servos konfigurieren
12
13
Config Led1 = Output                                        'Led1 "rot" (PortC.1) ist Ouput
14
Config Led2 = Output                                        'Led2 "grün" (PortC.0) ist Ouput
15
Config Portd.5 = Output                                     'PortD.5 ist Output
16
Config Portb.1 = Output                                     'PortB.1 ist Output
17
18
Enable Interrupts                                           'Interrupts aktivieren
19
20
Dim Com1 As String * 6                                            'Variable für per RS232 übergebene Werte
21
Dim Dummy As Eram Byte                                      'erstes Byte im EPROM vorsorglich belegen; keine weitere Funktion
22
Dim Winkel1_eram As Eram Byte                               'Variable für EPROM für Winkel1 - Servo1
23
Dim Winkel1 As Byte                                         'Arbeitsvariable für Winkel1 - Servo1
24
Dim Winkel2_eram As Eram Byte                               'Variable für EPROM für Winkel2 - Servo2
25
Dim Winkel2 As Byte                                         'Arbeitsvariable für Winkel2 - Servo2
26
27
Const Status = 15                                           'Zeit in ms: so lange leuchtet Led1 bei (bekanntem) RS232 Signal
28
29
Winkel1 = Winkel1_eram                                      'Werte für Servo 1 und 2 aus EPROM in Arbeitsvariable Winkel1 und Winkel2 laden
30
Winkel2 = Winkel2_eram
31
Servo(1) = Winkel1
32
Servo(2) = Winkel2
33
34
Led2 = 1                                                    'Led2 für Betriebsanzeige etc.
35
36
37
Do
38
39
  If Usr.rxc = 1 Then                                       'Byte aus Empfangsregister lesen
40
    Com1 = Udr                                              'aus UART auslesen und Com1 zuweisen
41
42
  Select Case Com1
43
44
    Case &H01 ; &H04 ; &H06 ; &H02 ; &HFF                   'Es geht um diese Werte, die als "01040602FF" empfangen werden               
45
46
            Winkel1 = 70
47
            Servo(1) = Winkel1
48
            Winkel2 = 70
49
            Servo(2) = Winkel2
50
            Winkel1_eram = Winkel1                          'hier und im ff. Wert des jeweiligen Servos in EPROM schreiben
51
            Winkel2_eram = Winkel2
52
53
            Led1 = 1                                        'hier und im ff. kurzes Aufblitzen für "Befehlsanname/-umsetzung"
54
            Waitms Status
55
            Led1 = 0
56
57
58
59
    Case &H46                                               'nicht belegt (Funktion1)
60
61
            Led1 = 1
62
            Waitms Status
63
            Led1 = 0
64
65
66
67
    Case &H47                                               'nicht belegt (Funktion2)
68
69
            Led1 = 1
70
            Waitms Status
71
            Led1 = 0
72
73
74
75
    Case &H06 And Winkel1 >= 40                             'Servo1 nach links "PAN"
76
77
            Decr Winkel1                                    'um 1 verkleinern
78
            Servo(1) = Winkel1
79
            Winkel1_eram = Winkel1
80
81
            Led1 = 1
82
            Waitms Status
83
            Led1 = 0
84
85
86
87
    Case &H04 And Winkel1 <= 99                             'Servo1 nach rechts "PAN"
88
89
            Incr Winkel1                                    'um 1 erhöhen
90
            Servo(1) = Winkel1
91
            Winkel1_eram = Winkel1
92
93
            Led1 = 1
94
            Waitms Status
95
            Led1 = 0
96
97
98
99
    Case &H00 And Winkel2 >= 50                             'Servo2 nach oben "TILT"
100
101
            Decr Winkel2                                    'um 1 verkleinern
102
            Servo(2) = Winkel2
103
            Winkel2_eram = Winkel2
104
105
            Led1 = 1
106
            Waitms Status
107
            Led1 = 0
108
109
110
111
    Case &H02 And Winkel2 <= 90                             'Servo2  nach unten "TILT"
112
113
            Incr Winkel2                                    'um 1 erhöhen
114
            Servo(2) = Winkel2
115
            Winkel2_eram = Winkel2
116
117
            Led1 = 1
118
            Waitms Status
119
            Led1 = 0
120
121
122
123
    End Select
124
  End If
125
 Reset Watchdog                                             'Watchdog zurücksetzen
126
Loop
127
End



"Müll" ist als Umschreibung auch Müll!

Das If eine Verzweigung und keine Schleife ist, werde ich mir aber 
merken.

von astroscout (Gast)


Lesenswert?

Hi,
so wie ich das sehe wird dein Code nicht funktionieren.

Du list mit dieser Zeile immern nur ein Byte aus
1
If Usr.rxc = 1 Then                                       'Byte aus Empfangsregister lesen
2
    Com1 = Udr                                              'aus UART auslesen und Com1 zuweisen

Allerdings ist jedes Zeichen, dass über die RS232-Schnittstelle gesendet 
wird jewels ein Byte. Du musst dir mal genau anschauen, wie die Zeichen 
codiert sind (ASCII, hex,...). Wenn ich deinen Post richtig verstanden 
habe, dann ist das ganze jeweils ein ganzer Befehlsblock, richtig?
Du musst dir also einen Zwischenspeicher programmieren, z.B. indem du 
die Werte in ein Array schreibst nachdem ein FF enfangen wurde, wenn 
dann wieder FF empfangen wurde, kannst du dein Array (also deinen 
Befehl) auswerten.



Gruß Astroscout

von Ch S. (spelli)


Lesenswert?

Guten morgen!

Ja, eigentlich total offensichtlich... Kommentar...

Die Zeichen sind hex Werte, also ein Block immer abgeschlossen durch FF.

Das mit dem Zwischenspeicher muss ich mir dann noch mal anschauen.

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.