Forum: Mikrocontroller und Digitale Elektronik Aus Zeichen die Hex-Kombinationen bestimmen


von Martin (Gast)


Lesenswert?

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

von Annika (Gast)


Lesenswert?

Häh?

von Martin (Gast)


Lesenswert?

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:-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

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...

von nicht Gast (Gast)


Lesenswert?

Ich verstehe nicht mal annährend was du vorhast, vielleicht ist ja 
http://www.mikrocontroller.net/articles/Bitmanipulation passend.

von Karl H. (kbuchegg)


Lesenswert?

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;

von Martin (Gast)


Lesenswert?

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

von MitLeser (Gast)


Lesenswert?

Hallo Martin,
darf ich mal Fragen mit welchem Gerät Du per PC kommunizieren willst ?

von Martin (Gast)


Lesenswert?

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?

von MitLeser (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.