С++ последовательная связь Linux 9 бит данныхC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 С++ последовательная связь Linux 9 бит данных

Сообщение Anonymous »

Я программирую на C++ в Ubuntu 10, и мне нужно написать протокол mdb (многоточечная шина), который использует 9 бит данных при последовательной связи.
Некоторые драйверы поддерживают 9 бит данных на некоторых чипах UART, но в большинстве случаев это не так.
Коротко объясню:
mdb использует 8 бит данных для данных и 9-й бит данных для установки режима.
Итак, когда мастер отправляет первый БАЙТ, он устанавливает mode=9thbit в 1, что означает, что все устройства на шине прерываются и ищут этот первый байт, содержащий адрес устройства.
Если прослушивающее устройство (одно из многих) находит свой адрес в этом первом байте, оно знает, что следующие байты будут для него байтами данных. байты данных имеют бит 9 = бит режима установлен в 0.
пример в битах: 000001011 000000010 000000100 000000110 (1-й байт адреса и 3 байта данных)
Ситуация возврата от ведомого -> бит режима ведущего используется для завершения передачи.

Таким образом, ведущий читает из последовательного порта до тех пор, пока он не найдет 9-битный пакет с 9-м битом = 1, обычно последняя 9-битная последовательность представляет собой контрольный байт + режим = 1.
Я знаю, как использовать флаг CMPAR в termios, чтобы использовать бит четности для бита режима, например. установив для него значение MARK(1) или SPACE(0)
Сначала проверьте, определен ли CMSPAR. Если нет, то, вероятно, нет поддержки в termios:

Код: Выделить всё

# define CMSPAR   010000000000      /* mark or space (stick) parity */
И код для отправки с четностью меток или пробелов, например. имитация 9-го бита данных

Код: Выделить всё

struct termios tio;
bzero(&tio, sizeof(tio));
tcgetattr(portFileDescriptor, &tio);

if(useMarkParity)
{
// Send with mark parity
tio.c_cflag |= PARENB | CMSPAR | PARODD;
tcsetattr(portFileDescriptor, TCSADRAIN, &tio);
}
else
{
// Send  with space parity
tio.c_cflag |= PARENB | CMSPAR;
tio.c_cflag &= ~PARODD;
tcsetattr(portFileDescriptor, TCSADRAIN, &tio);
}
write(portFileDescriptor,DATA, DATALEN);
Теперь я не знаю, КАК установить проверку четности при получении. Я перепробовал почти все комбинации и не могу получить эту последовательность байтов проверки четности.
Может ли кто-нибудь помочь мне, как настроить проверку четности при получении, чтобы она не игнорировала четность и не удаляла байты, но добавляла DEL перед «плохим» полученным байтом?
Как сказано в справке по последовательному интерфейсу POSIX:

INPCK и PARMRK, если IGNPAR включен, символ NUL (000 восьмеричный)
отправляется в вашу программу перед каждым символом с ошибкой четности.
В противном случае символы DEL (177 восьмеричный) и NUL отправляются вместе с
плохим символом.


Как правильно установить PARMRK И INPCK, чтобы он обнаружил бит режима = 1 как ошибку бита четности и вставить восьмеричное число DEL 177 в обратный поток?

Подробнее здесь: https://stackoverflow.com/questions/790 ... 9data-bits
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»