mehrere über RS232 kommende hex-Werte (String) auswerten

OP #2295246
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
OP #2295434
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...
OP #2295443
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.
Gast #2295498
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren