Как гарантировать биты char и short для связи с внешним устройством - PullRequest
0 голосов
/ 19 декабря 2010

Здравствуйте. Я пишу библиотеку для связи с внешним устройством через последовательное соединение RS-232.

Часто мне приходится сообщать команду, которая содержит 8-битный = 1-байтовый символ или 16-битный = 2-байтовый номер. Как мне сделать это портативным способом?

Основная проблема

Из прочтения других вопросов кажется, что стандарт не гарантирует 1 байт = 8 бит, (определено в Стандарте $ 1,7 / 1)

Основная единица хранения в С + + модель памяти это байт. Байт по крайней мере достаточно большой, чтобы содержать любой участник основного исполнения набор символов и состоит из непрерывная последовательность битов номер которого от реализации .

Как я могу гарантировать количество битов символа? Мое устройство ожидает именно 8 бит, а не как минимум 8 бит.

Я понимаю, что почти все реализации имеют 1 байт = 8 бит, но мне любопытно, как это гарантировать.

Short-> 2-байтовая проверка

Надеюсь, вы не возражаете, я также хотел бы запустить предложенное вами решение для преобразования коротких -> 2 байтов вами. Я новичок в байтовых преобразованиях и кроссплатформенности.

Чтобы гарантировать количество коротких байтов, я думаю, мне понадобится

  1. сделать размер (короткий). Если sizeof (short) = 2 Преобразовать в байты и проверить порядок байтов (как здесь )

  2. если sizeof (short)> 2, затем преобразовать short в байты, проверить порядок байтов (как здесь ), затем проверить, что старшие значащие байты пусты и удалить их?

    Правильно ли это делать ? Есть ли лучший способ?

Большое спасибо

Ответы [ 3 ]

2 голосов
/ 19 декабря 2010

AFAIK, связь с последовательным портом каким-то образом зависит от платформы / ОС, поэтому, когда вы пишете ее низкоуровневую часть, вы очень хорошо знаете платформу, ее порядковый номер и CHAR_BIT.Таким образом, вопрос не имеет никакого смысла.

Кроме того, не забывайте, что оборудование UART может передавать 7 или 8-битные слова, поэтому оно не зависит от архитектуры системы.

РЕДАКТИРОВАТЬ: Iупомянул, что слово UART является фиксированным (давайте рассмотрим режим 3 с 8 битами, как самый стандартный), само оборудование не отправит более 8 бит, поэтому, дав ему одну команду send, оно отправит ровно 8 битнезависимо от CHAR_BIT машины.Таким образом, используя один send для byte и

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

, вы можете быть уверены, что он будет работать правильно.
Кроме того, хорошей идеей будет узнать, что именноboost.asio делает.

1 голос
/ 19 декабря 2010

CHAR_BIT из заголовка <climits> сообщает количество бит в символе.Это по крайней мере 8. Кроме того, short int использует по крайней мере 16 бит для своего представления значения.Это гарантируется минимальными диапазонами значений:

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

см. здесь

Что касается переносимости, всякий раз, когда я пишу код, основанный на CHAR_BIT == 8, я просто пишу это:

#include <climits>

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

Как вы сказали, это верно почти для всех платформ и, если это не так, в конкретном случае не скомпилируется.Это достаточно мобильности для меня.: -)

1 голос
/ 19 декабря 2010

Эта тема , кажется, предлагает использовать CHAR_BIT из <climits>. Эта страница даже предлагает 8 - это минимальное количество бит в char ... Не знаю, как к этому относится цитата из стандарта.

Для целого числа фиксированного размератипы, при использовании MSVC2010 или GCC, вы можете положиться на <stdint.h> (даже в C ++) C99 для определения (u)int8_t и (u)int16_t, которые гарантированно будут иметь ширину 8 и 16 бит соответственно.

...