Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Binary umrechnen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
01.02.2006, 21:51 Uhr
Antialc



Hi

also ich führe zur Zeit gerade ein Projekt in der Schule durch. Dabei habe ich einen Temperatursensor und einen Empfänger an der seriellen Schnittstelle.

Wie ich die Daten auslese weiss ich mitlerweile. Das Problem ist das Auswerten.

Es wird ein fester Rahmen gesendet :
<STX> <Typ> <W1> <W2> <W3> <W4> <W5> <ETX>
<STX> = 02h = Startzeichen
<ETX> = 03h = Endzeichen
bei <Typ>, <W1> .. <W5> ist Bit 7 immer gesetzt

0x48 – 0x4f Innensensor V1.2 Adresse 0 bis 7
- W1 (b0-b6) :obere 7 Bit der Temperatur
- W2 (b0-b6) :untere 7 Bit der Temperatur
- W3 (b0-b6) :Feuchte (binär)
- W4 (b0-b6) :obere 7 Bit des Luftdrucks
- W5 (b0-b6) :untere 7 Bit des Luftdrucks
Aus W1 und W2 ergibt sich ein vorzeichenbehafteter 14-Bit-Binär-Wert
Aus W4 und W5 ergibt sich ein 14-Bit-Binär-Wert des Luftdrucks in hPa

Mein Problem ist schon mal, dass wenn ich bei readFile in ein char Array speichern will, ich negative und immer unterschiedliche Werte bekomme. Wenn ich stattdessen ein BYTE Array nehme habe ich immer konstante Werte. Jedenfalls da wo sie konstant sein sollen.

Jetzt bekomme ich z.B. 129 für W1 und 239 für W2 rauß (Umgerechnet wird mit .Format("%d", wert)).
Hat Jemand von euch ne Idee wie ich diese beiden Dezimalwerte jetzt in eine sinnvolle Temperatur umrechnen kann? Müssten wohl so etwa 22,0° rauskommen (Die Temperatur hat eine Dezimalstelle).
--
Microsoft Visual C++.NET Version 7
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.02.2006, 22:55 Uhr
mmc20
puss in boots



Zitat von Antialc:

Jetzt bekomme ich z.B. 129 für W1 und 239 für W2 rauß (Umgerechnet wird mit .Format("%d", wert)).
Hat Jemand von euch ne Idee wie ich diese beiden Dezimalwerte jetzt in eine sinnvolle Temperatur umrechnen kann? Müssten wohl so etwa 22,0° rauskommen (Die Temperatur hat eine Dezimalstelle).


naja, du musst nur das bit7 bei beiden werten ausblenden und dann richtig addieren , also...
wert = ((w1 & 127)*128)+(w2 & 127)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.02.2006, 01:09 Uhr
~berti
Gast



Zitat von mmc20:
[quote Antialc]
Jetzt bekomme ich z.B. 129 für W1 und 239 für W2 rauß (Umgerechnet wird mit .Format("%d", wert)).
Hat Jemand von euch ne Idee wie ich diese beiden Dezimalwerte jetzt in eine sinnvolle Temperatur umrechnen kann? Müssten wohl so etwa 22,0° rauskommen (Die Temperatur hat eine Dezimalstelle).


naja, du musst nur das bit7 bei beiden werten ausblenden und dann richtig addieren , also...
wert = ((w1 & 127)*128)+(w2 & 127)[/quote]


......aus einem 16Bit Wert bekommst du noch keinen float Wert(22,0). Daher aus dem wert noch das 2er Komplement bilden (wie bei A/D Wandlern üblich).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.02.2006, 07:01 Uhr
Antialc



Ok. Da stellt sich mir doch die Frage...Was ist ein "2er Komplement". Und wieso komm ich auf keinen float wert?

Mit 8Bit komm ich auf max 256 Möglichkeiten. Wenn ich die einfach durch 10 teilen würd könnt ich schon mal Temperaturen bis 25,6° angeben.
--
Microsoft Visual C++.NET Version 7
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.02.2006, 09:23 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Ok. Da stellt sich mir doch die Frage...Was ist ein "2er Komplement". Und wieso komm ich auf keinen float wert?


Das MSB (höchstwertigste Bit) wird negativ interpretiert.... Du verschiebst damit den Zahlenbereich auf -2^(n-1) bis 2 ^(n-1) -1... sonst würdest du von 0 bis 2 ^n -1 arbeiten...


Zitat:

Mit 8Bit komm ich auf max 256 Möglichkeiten. Wenn ich die einfach durch 10 teilen würd könnt ich schon mal Temperaturen bis 25,6° angeben.


Ja kannst du prinzipiell so machen... allerdings geht dann nichts kleiner 0 Grad... Musst dir halt überlegen innerhalb welchen Zahlenbereichs du arbeiten willst und wie genau es sein soll dann weisst du wieviel bit du brauchst...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.02.2006, 09:50 Uhr
~Antialc
Gast


Ich musses mir ja gar net überlegen. Ich musses nur verstehn.

Im Moment hab ich einfach nur des Problem, dass ich mehr Datensätze empfange als ich eigentlich sollte.

Also es sieht so aus. Ich hab ein Prog "commspy" das ich im Inet gefunden hab. Sogar mit Quellcode.
Und bei diesem Prog wird immer das vorgegebene Protokoll
<STX> <Typ> <W1> <W2> <W3> <W4> <W5> <ETX>
erfüllt.
Sogar mit der 2 als Start- und der 3 als Endzeichen.

Und so viel ich den Quellcode von dem Teil auch studier. Ich weiss net wo der Trick dabei ist. Wenn ich die Readmethoden einfach per copy, paste bei mir einfüge habe ich immer noch 11 Datensätze oder so. Also viel zu viele.

Der einzigste Unterschied den ich erkennen kann liegt darin, dass er beim CreateFile ein OVERLAPPED benutzt.
Könnt es daran liegen? Ich denk mal net aber mittlerweile bin ich so verzweifelt...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: