16Bit Integer über RS232 empfangen
-
Hi
Ich habe ein Problem. Ich schliesse einen Compass an den Serialport an.
Dieser liefert mir die Werte über RS232.
Im Hyperterminal werden jedoch keine Zahlen sondern nur komische Zeichen angezeigt.In der Dokumentation habe ich gemerkt, dass der Kompass, einen 16Bit signed Integer ausgibt. (Siehe Link)
http://www.xbow.com/Support/Support_pdf_files/IMU_Users_Manual.pdf
Seite 19, Data Packet Format. Ich benutze den scaled and angle mode.Kann mir jemand sagen, wie ich einen solchen Wert (16Bit Integer) über RS232 empfangen und dann in einen CString umwandeln kann?
Ein Beispiel wäre sehr nett.Vielen Dank!
-
Über die serielle Schnittstelle werden id.R. immer nur bytes (7-8 Bit) übertragen... deshalb musst Du die Bytes dann entsprechend der Spezifikation zusammensetzen...
Für die serielle Kommunikation würde ich Dir zu einer fertigen Klasse raten:
CSerialPort v1.03 - Serial Port Wrapper
http://www.codeproject.com/system/cserialport.aspSerial library for C++
http://www.codeproject.com/system/serial.asp
-
Ich habe bereits eine eigene Serialklasse geschrieben.
Ich bekomme in meiner Funktion einen CString zurück.
In diesem CString sind jedoch nur komische Zeichen.
Kann ich nun diesen CString wieder in einen 16Bit Integer umwandeln??
Wenn ja, wie funktioniert das?
-
Was meinst du mit 'komische Zeichen'? Sind das die Zeichen, welche du auch beim HyperTerminal siehst?
Das sind nämlich die ASCII Zeichen deiner Werte.
Eine 40 dezimal = 28 hex = (
Überprüfe mal, ob deine Daten nicht doch richtig sind, und du die nur falsch formatiert hast.
-
Das Problem ist, dass es 16 Bit Integer Werte sind, welche einfach in den String geschrieben werden und wohl aus diesem Grund nicht richtig umgewandelt werden. Gibt es eine Möglichkeit, die Daten im String wieder in 16 Bit Integer werte umzuwandeln, damit ich richtige Zahlen erhalte???
-
Dazu mußt du wissen, in welcher Reihenfolge die Bytes übertragen worden sind:
char* data=...; int wert=data[0]<<8+data[1];//MSB zuerst //oder: int wert=data[1]<<8+data[0];//LSB zuerst
-
Bei der RS-232 Schnittstelle wird normalerweise immer erst das LSB übertragen (Startbit, etc, jetzt mal nicht mitgezählt).
Wenn ich das nun richtig verstehe, hat addict in seinem String bspw.
"¥µ¡" stehen.
Das entspricht :
Element[0] = '¥' = 165 = 0xA5
Element[1] = 'µ' = 181 = 0xB5
Element[2] = '¡' = 161 = 0xA1Also solltest du in der Lage sein mit den Methoden CString::GetAt() und atoi() diese Werte zurückzuwandeln.
Bsp.
CString strData = "¥µ¡"; int data[3]; for (int i = 0; i < strData.GetLength(); i++) { data[i] = atoi(strData.GetAt(i)); }
Müsste so funktionieren, wenn ich mich nicht irre.
EDIT: Sehe gerade, das CStoll sogar schon eine Lösung parat hat. Die ist sogar auch elegant (intelligent).