PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Darstellung der Null in BCD



malthy
03.01.2015, 21:34
Moin!

Ich fummel gerade das RS232 Protokoll von einem älteren Thermometer auseinander. Praktisch funktioniert auch alles, allerdings habe ich ein Verständnisproblem, das mir irgendwie gerade keine Ruhe lässt. Die Sache ist eigentlich ziemlich simpel.

In dem Datenstrom ist der für mich relevante Temperaturwert in der Form ###.# °C in zwei Bytes BCD codiert repräsentiert. D. h. das untere (low) Nibble vom zweiten Byte gibt die Zehntelstellen an, das obere (high) Nibble gibt die Einerstellen an, das untere Nibble vom ersten Byte gibt die Zehnerstellen an, das obere Nibble des zweiten Bytes gibt die Hunderterstellen an. Das Vorzeichen wird in einem Bit eines anderes Bytes angezeigt. Nun das "Problem":

Dezimale Nullen im ersten Byte - dasjenige für Zehner- und Hunderterstelle - werden nicht etwa durch eine binäre Null (&b0000) sondern durch eine binäre 11 (&b1011) repräsentiert. Im zweiten Byte - dasjenige für die Einer- und Zehntelstelle - hingegen, so wie man es erwarten würde, durch eine binäre Null (&b0000). Im Auslesecode kann ich das natürlich ohne weiteres berücksichtigen und eine 11 als 0 lesen, das tue ich im Moment, und so funktioniert auch alles wunderbar. Aber verstehen würde ich es gerne noch ... Eine 10 für eine 0 hätte ich ja irgendwie noch einsehen können, aber eine 11? Hat jemand eine Idee dazu?

Dank&Gruß
Malte

P.S.: das Thema hätte man evnt auch bei "Software, Algorithmen und KI" einsortieren können, ich fand's hier wie dort nicht 100%ig passend ...

Peter(TOO)
03.01.2015, 22:33
Hallo Malte,

Norm was das nie!

Aber mit der 10 (0xA) kann es die Kombination 0x0A geben, welches das Steuerzeichen für LF ist.
0x0D (CR) kann ja nicht vorkommen.
0x00 wird als NUL, interpretiert, welches einfach unterschalgen wird.

Die einfachsten Betriebssystem-Treiber für ASCII interpretieren aber NUK, CR und LF und im Binärmode wollte der Programmierer den Kanal wohl nicht öffnen ()oder es wusste nicht wie) ...

MfG Peter(TOO)

malthy
03.01.2015, 22:48
Hallo Peter,

vielen Dank! Aber ich kann Dir nicht ganz folgen. Das Protokoll von dem Thermometer ist für meinen Geschmack insgesamt etwas seltsam - wobei mir zugegebenermaßen die reichhaltige Erfahrung fehlt, was solche Protokolle angeht.

Es kommen in der Steuerung des Thermometers grundsätzlich keine "klassischen" Steuerzeichen vor. Die Übertragung eines o.g. Datums wird mit ASCII 65 ('A') initiiert - ohne jede/s weitere/n Steuerzeichen. Das Antwortpaket des Thermometers darauf besteht aus 8 Bytes. Zwei von den Bytes enthalten in o.g. Weise die Daten. Und es sind ja wie gesagt auch Null-Bytes enthalten, zB für 20.0°C wäre des zweite Byte 0 (&b00000000). Das Datenpaket wird wiederrum nicht von irgendwelchen klassischen Steuerzeichen terminiert, es ist eingerahmt von einer '2' am Beginn des Paketes und einer '3' am Ende ...

Gruß
Malte

i_make_it
03.01.2015, 22:52
Ich denke nicht das es wegen ASCII Steuerzeichen ist. könnte eher sein um sowohl in Intel als auch in Motorola Darstellung das höherwertige Byte identifizieren zu können.
http://de.wikipedia.org/wiki/Byte-Reihenfolge

Klebwax
03.01.2015, 22:53
Ich hätte da eine andere Idee: 0b1011 steht für ein Blank, die ganze Message ist direkt für ein mäßig intelligentes Display zur Unterdrückung führender Nullen gedacht. Man könnte das testen, indem man einen Wert größer 100 versucht darzustellen. Der Code müsste dann 0b00010000 lauten.

MfG Klebwax

malthy
03.01.2015, 22:56
0b1011 steht für ein Blank

Ha! Das ist eine sehr gute Idee! Das macht wirklich Sinn, und so verhält sich das Display auf dem Gerät auch: die führenden Nullen werden da nämlich nicht dargestellt. Das überzeugt mich!

Danke sehr!
Malte

i_make_it
03.01.2015, 23:08
Ich hatte einen Denkfehler

Könnte aber eventuell mit der Signalcodierung bei RS232 zu tun haben.
Bei einer und zehntel stellen ändert sich doch eher mal der Wert.
Bei zehner und Hunderter Stellen nicht unbedingt so oft.
Wenn man die "0" mit einer Bitfolge ungleich "00000000" codiert wird der Gleichspannungsanteil in der Übertragung bei temperaturen unter 10° kleiner.

Peter(TOO)
04.01.2015, 18:25
Hallo Malte,

Es kommen in der Steuerung des Thermometers grundsätzlich keine "klassischen" Steuerzeichen vor. Die Übertragung eines o.g. Datums wird mit ASCII 65 ('A') initiiert - ohne jede/s weitere/n Steuerzeichen. Das Antwortpaket des Thermometers darauf besteht aus 8 Bytes. Zwei von den Bytes enthalten in o.g. Weise die Daten. Und es sind ja wie gesagt auch Null-Bytes enthalten, zB für 20.0°C wäre des zweite Byte 0 (&b00000000). Das Datenpaket wird wiederrum nicht von irgendwelchen klassischen Steuerzeichen terminiert, es ist eingerahmt von einer '2' am Beginn des Paketes und einer '3' am Ende ...

Wie sieht so ein ganzes 8-Byte Telegramm aus?

Manchmal ist es nicht nachvollziehbar, was in den Köpfen von Programmierern abgelaufen ist ...
Möglich ist auch, dass es da um Kompatibilität mit einem Vorgänger-Gerät geht. Je nach Alter kann das auch noch ohne µC gebaut gewesen sein.

MfG Peter(TOO)