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
Ch Sp schrieb: > Momentan realisiere ich das über eine If-Schleife. das ist nicht gut, versuch mal eine while-Schleife
Hallo Walter S., warum ist eine If-Schleife nicht gut?
Alles Schrott. Das Mittel der Wahl heisst Zustandsmaschine. (Statemachine)
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...
if ist keine Schleife sondern ne Verzweigung ... Dein Codeschnipsel ist Müll ...
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.