LINUX.ORG.RU

Установка mark parity


0

0

Для связи с удаленным оборудованием необходимо устанавливать и снимать бит parity (т.е. сначала установить, передать байт, затем снять). Как это сделать под linux? man ioctl и man ioctl_list не дают полную информацию, там нет описаний возвращаемых структур.

поищите на qnx.org.ru/forum - там это не так давно обсасывалось в подробностях. общичй вывод - это жопа :)

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

Спасибо, но в данном случае это не подходит. В qnx есть параметр parstk, с ним можно поиграться. В linuxe такого параметра нет. Говорят, можно сделать через программирование регистра UART (16550). Вот только где посмотреть как это делается?

volodja
() автор топика
Ответ на: комментарий от volodja

> Спасибо, но в данном случае это не подходит. В qnx есть параметр parstk, с ним можно поиграться. В linuxe такого параметра нет. Говорят, можно сделать через программирование регистра UART (16550). Вот только где посмотреть как это делается?

например зайти на http://ianzag.megasignal.com/ftp/pub/doc/std/comm/serial/ и покопаться в описаниях на UART 8250 и выше. после поковырять драйвер tty на предмет добавления желаемой функциональности.

ps: хотя я практически уверен, что для Linux должно быть уже готовое решение - проблема то достаточно распространённая.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

>там этого нет. по крайней мере в POSIX точно.

плохо читал позикс. я на текущий момент этим пользуюсь.

cvv ★★★★★
()
Ответ на: комментарий от cvv

>плохо читал позикс. я на текущий момент этим пользуюсь.

Именно mark parity, а не odd или even? Если установить флаг PARENB - будет установлена EVEN PARITY и все. Кстати, какой дистрибутив используете? Я работаю под Gentoo, но это не принципиально.

volodja
() автор топика
Ответ на: комментарий от cvv

>>Вот только где посмотреть как это делается?

>в исходниках миником-а

Там сделано довольно хитро. Жестко устанавливается 8-й бит, а мне нужен 9-й.

volodja
() автор топика

Проблему удалось решить. Есть два способа: первый описан на http://www.lothosoft.ch/thomas/libmip/markspaceparity.php posixoобразный. Существует недокументированный флаг CMSPAR (описан в файле /usr/include/asm/termbits.h). Если установить termios.c_cflag |= PARENB | PARODD | CMSPAR - то устанавливается mark parity. Если установить termios.c_cflag |= PARENB | CMSPAR и termios.c_cflag &= ~PARODD - то устанавливается space parity. Второй способ - через Line Control Register UARTa. Я использовал устройство /dev/port, т.к. плата Advantech PCI-1612. port=open("/dev/port",O_RDWR | O_NOCTTY); lseek(port,IOBase+3,SEEK_SET); /*IOBase - базовый адрес порта, 3 - смещение регистра относительно адреса порта*/ read(port,lcr,1); /*unsignet char lcr */ Далее регистр устанавливается в соответствии с описанием и потребностями (см. описание UART) lseek(port,IOBase+3,SEEK_SET); write(port,lcr,1); close(port);

volodja
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.