2010-12-19 2 views
0

Hallo Ich schreibe eine Bibliothek für die Kommunikation mit einem externen Gerät über RS232-serielle Verbindung.So garantieren Sie Bits von Zeichen und Kurzschluss für die Kommunikation mit externen Gerät

Oft muss ich einen Befehl mitteilen, der ein 8 Bit = 1 Byte Zeichen oder eine 16 Bit = 2 Byte Zahl enthält. Wie mache ich das auf eine tragbare Weise?

Hauptproblem

Aus anderen Fragen zu lesen scheint es, dass der Standard nicht 1byte = 8bits garantiert, (definiert in der Norm $ 1,7/1)

Der grundlegende Speichereinheit in dem C + + Speichermodell ist das Byte. Ein Byte zumindest groß genug ist, jedes Mitglied des Grundausführung Zeichensatzes enthalten, und ist aus einer zusammenhängenden Folge von Bits zusammengesetzt, die Nummer der Implementierung definiert.

Wie kann ich die Anzahl der Charts garantieren? Mein Gerät erwartet 8 Bit genau und nicht mindestens 8 Bit.

Ich realisiere, dass fast alle Implementierungen 1byte = 8 Bits haben, aber ich bin neugierig, wie man es garantiert.

Short-> 2-Byte-Check

ich Ihnen nichts ausmacht hoffen, würde ich auch meine vorgeschlagene Lösung für die kurze ausführen möchten - von Ihnen> 2-Byte-Konvertierung. Ich bin neu bei Byte-Konvertierungen und plattformübergreifender Portabilität.

Um die die Anzahl der Bytes der kurzen garantiere ich denke, ich

  1. ein sizeof (kurz) tun zu müssen brauchen werde. Wenn sizeof (kurz) = 2 Umrechnen in Bytes und die Byte-Reihenfolge überprüfen (wie here)

  2. wenn sizeof (kurz)> 2 dann die kurz Bytes umwandeln, die Byte-Reihenfolge überprüfen (wie here), dann überprüfen Sie die höchstwertige Bytes sind leer und entfernen sie?

    Ist dies das Richtige? Gibt es einen besseren Weg?

Vielen Dank

Antwort

2

AFAIK, die Kommunikation mit der seriellen Schnittstelle ist irgendwie Plattform/OS abhängig, so dass, wenn Sie den niedrigen Pegel ein Teil davon zu schreiben, wissen Sie sehr gut die Plattform, ihre endianness und CHAR_BIT. Auf diese Weise hat die Frage keinen Sinn.

Vergessen Sie auch nicht, dass die UART-Hardware in der Lage ist, 7- oder 8-Bit-Wörter zu übertragen, so dass es nicht von der Systemarchitektur abhängt.

EDIT: ich, dass das Wort fixiert ist die UART erwähnt (sie Modus 3 mit 8 Bits betrachten, als der Standard), die Hardware selbst nicht mehr als 8 Bit senden, so durch einen send Befehl geben Es sendet genau 8 Bit, unabhängig vom CHAR_BIT der Maschine. Auf diese Weise durch einen einzigen send für byte und

unsigned short i; 
send(i); 
send(i>>8); 

verwenden, können Sie sicher sein, es wird das Richtige tun.
Auch wäre eine gute Idee zu sehen, was genau boost.asio tut.

+0

Ja, ich denke, dein Recht. Ich benutze die boost.asio-Bibliothek, um die Low-Level-Kommunikation zu machen, so dass mir das nicht einfällt. Wäre es wahr, dass ein Benutzer auf einem System mit char = 16 Bits die Bibliothek nicht benutzen könnte? Wenn ich es anforderte, den Buchstaben "a" zu senden, wäre das die doppelte Anzahl von Bits, wie mein Gerät erwartet. – Tom

+0

@Tom: Ich habe meine Antwort aktualisiert. – ruslik

+0

Danke, ich bin trotzdem ein bisschen verwirrt (sorry). Also aus einer char = 16 Bit Implementierung: char c = 'a'; sende (c); würde die Hälfte des Charakters senden? Ist es möglich, das 16-Bit-Zeichen in 8 Bits umzuwandeln, um die Bits zu senden, die mein Gerät erwartet? – Tom

1

This thread scheint zu empfehlen, dass Sie CHAR_BIT von <climits> verwenden können. This page sogar schlägt vor, 8 ist die minimale Menge an Bits in einer char ... Weiß nicht, wie das Zitat aus dem Standard bezieht sich darauf.

Für feste Größe Integer-Typen, bei Verwendung von MSVC2010 oder GCC, können Sie verlassen sich auf C99 des <stdint.h> (auch in C++) (u)int8_t und (u)int16_t zu definieren, die garantiert werden, genau 8 und 16 Bit breit bzw. sein.

1

CHAR_BIT aus der <climits> Header sagt Ihnen die Anzahl der Bits in einem char. Dies ist mindestens 8. Auch ein short int verwendet mindestens 16 Bits für seine Wertdarstellung. Dies wird durch den Minimalwert Bereiche garantiert:

type    can at least represent 
--------------------------------------- 
unsigned char    0...255 
signed char   -127...127 
unsigned short   0...65535 
signed short   -32767...32767 
unsigned int    0...65535 
signed int   -32767...32767 

here siehe

In Bezug auf Portabilität, wenn ich Code schreiben, 8 auf CHAR_BIT == beruht ich dies einfach schreiben:

#include <climits> 

#if CHAR_BIT != 8 
#error "I expect CHAR_BIT==8" 
#endif 

Wie Sie sagte, dies gilt für fast alle Plattformen und wenn es nicht in einem bestimmten Fall ist, wird es nicht kompilieren. Das ist genug Portabilität für mich. :-)

+0

Ja, ich mag Ihre Überprüfung der Größe. Ich werde das benutzen, danke. – Tom

Verwandte Themen