Hallo, ich hab folgendes Problem: Und zwar möchte ich gerne einen String (über UART) auf bestimmte Zeichen untersuchen. Stelle 20 und 21 stellen Zustände bzw. Parameter dar: Zustand 1) 1 Zustand 2) 0 Zustand 3) 0 Zustand 4) 0 Zustand 5) 1 Zustand 6) 0 Zustand 7) 0 Zustand 8) 0 Bei dieser Konfiguration würde Stelle 20 und 21 durch B dargestellt werden. Nun möchte ich gerne ein Programm schreiben (in C), dass bei der Detektion eines B also 0x42 die einzelnen Zustände angibt. In diesem Bsp: 0x42 --> Zustand 1 und Zustand 5. Ich hab hier null Erfahrung und vor allem Ahnung, wie ich das am besten realisieren könnte. Ich möchte die einzelnen Kombinationen ungern von Hand eintippen. Wäre für jede Hilfe dankbar. Grüße
Ok, bei 1 ist der Zustand aktiviert, bei 0 nicht. Ich habe nun diese 8 Zustände, die in einem String (ca. 100 Zeichen) codiert sind.Und zwar an der Stelle 20 und 21. Bei der folgenden Konfiguration der Zustände wird im String an den besagten Stellen B angezeigt: Zustand 1) 1 Zustand 2) 0 Zustand 3) 0 Zustand 4) 0 Zustand 5) 1 Zustand 6) 0 Zustand 7) 0 Zustand 8) 0 --> 0001 0001 Es handelt sich hierbei um ASCII-Zeichen die Hex-Zahlen darstellen, also B (ASCII)--> 0x42 (Hex). Bei dieser Konfig., wäre es 03: Zustand 1) 1 Zustand 2) 1 Zustand 3) 0 Zustand 4) 0 Zustand 5) 0 Zustand 6) 0 Zustand 7) 0 Zustand 8) 0 --> 0000 0011 Also würde 0x30 an Stelle 20 und 0x33 an Stelle 21 stehen. Ich möchte nun ein Programm in C schreiben das weiß, wenn 0x41 über die UART flitzt, das Zustand 1 und 5 aktiv sind. Ich greife die Daten an einem Gerät ab. Ich lese beim UART ja Zeichen bzw. Byte für Byte ein. Wie muss ich beim Programmieren vor gehen, dass ich beim Lesen des Bytes 0x42 weiß, das meine Zustände 1 und 5 aktiv sind. Durch hinterlegen einer Tabelle die die einzelnen Kombinationen und deren entsprechendes Byte darstellt? Ich hoffe es ist jetzt etwas verständlicher:-)
Martin schrieb: > Ich hoffe es ist jetzt etwas verständlicher:-) Häh? > --> 0001 0001 > Es handelt sich hierbei um ASCII-Zeichen die Hex-Zahlen darstellen, also > B (ASCII)--> 0x42 (Hex). > : > --> 0000 0011 > Also würde 0x30 an Stelle 20 und 0x33 an Stelle 21 stehen. Mal kommt 1 (einziges) ASCII-Zeichen B heraus und mal die ASCII-Zeichenfolge 0 3 Irgendwie inkonsistent... Was würde denn im ersten Fall an Stelle 20 und 21 übertragen?
Martin schrieb: > Bei der folgenden Konfiguration der Zustände wird im String an den > besagten Stellen B angezeigt: > > Zustand 1) 1 > Zustand 2) 0 > Zustand 3) 0 > Zustand 4) 0 > > Zustand 5) 1 > Zustand 6) 0 > Zustand 7) 0 > Zustand 8) 0 > > --> 0001 0001 > > Es handelt sich hierbei um ASCII-Zeichen die Hex-Zahlen darstellen, also > B (ASCII)--> 0x42 (Hex). irgendwie ergibt das keinen Sinn. 0x42, also der ASCII Code von 'B', sieht binär so aus: 0100 0010 mit deinen Binärziffern 0001 0001 korreliert da gar nichts. Ergo: Die Zuordnung muss etwas anders funktionieren als du dir das momentan vorstellst. Wenn du eine Vorschrift angeben kannst, wie du aus 0100 0010 deine 001 001 erhalten kannst, dann hast du was du suchst. Das hier > Zustand 1) 1 > Zustand 2) 1 > Zustand 3) 0 > Zustand 4) 0 > > Zustand 5) 0 > Zustand 6) 0 > Zustand 7) 0 > Zustand 8) 0 > > --> 0000 0011 > > Also würde 0x30 an Stelle 20 und 0x33 an Stelle 21 stehen. legt die Vermutung nahe, dass man von jedem Zeichen (position 20 und 21) einfach das High-Nibble auf 0 setzt, und die Zustandsbits bleibt übrig (in dem einen Fall noch +5). Aber dieses Schema passt wieder nicht zu deinem 'B' und den entsprechenden Zuständen. Sieh zu, dass du noch mehr über die Codierung lernst. Da ist so noch kein System erkennbar (oder du kannst es nicht richtig erklären oder die online-Forenteilnehmer sind zu blöd es zu erkennen). PS: Soll man deinen Erguss eigentlich so lesen, dass in deinem ersten Beispiel zweimal 'B' hintereinander kommt? Wenn ja, dann sag das bitte auch ganz klar. Geh davon aus, dass du 1 Byte empfängst (an Position 20) und daraus ergibt sich Zustand 1 bis 4. Und du empfängst ein Byte an Position 21 und daraus ergeben sich die Zustände 5 bis 8. Das du zufällig an 20 und 21 jeweils ein 'B' vorfindest, ist 'Zufall' hat aber ansonsten nicht viel zu bedeuten. Und genau so solltest du das dann auch behandeln. In deinen Ausführungen kommt es zum Großteil so rüber als ob ein einzelnes 'B' für deine Zustände 5 und 1 zuständig ist. Ich hab aber den Verdacht, dass dem nicht so ist. Nur erklärt das alles nicht, was ein 'B' (Code 0100 0010) mit den Zuständen 1 und 5 zu tun haben soll. Und warum in anderen Fällen dann da plötzlich ASCII Codes von 'Ziffern' auftauchen sollen.
Hallo Männer, danke für die Antworten. Also zunächst einmal sorry was ich da fürn Sch… gepostet hab. Ich bin mit den Stellen durcheinander gekommen. Habs jetzt nochmal angeschaut und das was K.-H. gesagt hat, passt natürlich.Stelle 20 wird durch Zustand 1-4 präsentiert, Stelle 21 durch Zustand 5 bis 8. Für... > Zustand 1) 1 > Zustand 2) 1 > Zustand 3) 0 > Zustand 4) 0 > > Zustand 5) 0 > Zustand 6) 0 > Zustand 7) 0 > Zustand 8) 0 wäre das also 0000 0011 --> also 03 bei B bzw B0 wären das dann... > Zustand 1) 0 > Zustand 2) 0 > Zustand 3) 0 > Zustand 4) 0 > > Zustand 5) 1 > Zustand 6) 1 > Zustand 7) 0 > Zustand 8) 1 1011 0000 --> also B0 OK, nun zum eigentlichen Teil meiner Frage: Wie kann ich das nun programmiertechnisch so umsetzen, dass wenn bspw. das B über den UART flitzt, mein C-Programm erkennt, dass Zustand 5,6 und 8 beim Gerät aktiviert sind. Muss ich für jedes Zeichen bzw. für jede zustandskombination ne Art Tabelle anlegen? Sprich Zeichen B wird detektiert, bzw. 0x42, gehe in Tabelle und schau, welche Zustände durch 0x42 repräsentiert werden? VG und nochmals Danke für die Antworten...
Ich verstehe nicht mal annährend was du vorhast, vielleicht ist ja http://www.mikrocontroller.net/articles/Bitmanipulation passend.
Martin schrieb: > 1011 0000 --> also B0 Schön langsam kommt Licht in die Sache. Du hast ganz einfach 2 Hex-Digits vorliegen. Beide zusammen ergeben einen 8-Bit Wert und in diesem 8 Bit Wert hat jedes Bit eine spezielle Bedeutung. > Wie kann ich das nun programmiertechnisch so umsetzen, dass wenn bspw. > das B über den UART flitzt, mein C-Programm erkennt, dass Zustand 5,6 > und 8 beim Gerät aktiviert sind. Indem es aus der ASCII 'B' erst mal eine binäre 0x0B macht und dann zb bei der Abfrage eines Zustandes nachgesehen wird, ob das entsprechende Bit dafür gesetzt ist. Der erste Teil ist eine ganz stink normale ASCII-Hex Wandlung, wie sie jede Woche 20 mal hier im Forum gezeigt wird uint8_t toBin( char c ) { if( c >= '0' && c <= '9' ) return c - '0' return c - 'A' + 10; } Damit kannst du von jeder der einzelnen Stellen die binäre Version bekommen, die zum jeweiligen Hex-Digit gehört. Und Einzelbit-Abfragen, nun ja, das ist sozusagen Handwerkszeug in der µC Welt. Bitmanipulationen Wenn es dir nur um die Anzeige auf einem LCD geht uint8_t Value; char Buffer[20]; Value = toBin( Werte[21] ) << 4 + toBin( Werte[20] ); itoa( Value, Buffer, 2 ); lcd_put_string( Buffer ); Wenn du einfach nur 8 Leds damit leuchten/nicht leuchten lassen willst uint8_t Value; Value = toBin( Werte[21] ) << 4 + toBin( Werte[20] ); PORTB = Value;
Hallo Karl-Heinz, danke für die Antwort! im Grunde könnte man ja auch die 15 möglichen Zustände in das jeweilige Hex-Byte umrechnen und dann eben mit If-Anweisungen vgl. Ein Vgl. welcher bzw. Welche Zustände aktiviert sind, brauche ich ja so oder so, auch bei der binären Version. VG Martin
Hallo Martin, darf ich mal Fragen mit welchem Gerät Du per PC kommunizieren willst ?
Hallo, ein uC soll die seriellen Daten und eben diese Zustände untersuchen. Die Kommunikation erfolgt über den UART und die RS-232 des Geräts. Setzt du dich derzeit mit der selben Thematik auseinander?
Nein. Ich dachte nur aufgrund Deines Namens und der RS232-Frage, Du würdest eventuell versuchen mit einer Heizungssteuerung zu kommunizieren.
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.