5

Я обычно использую screen(1), чтобы открыть последовательный порт командой:

sudo screen /dev/ttyUSB2 115200

Я попытался установить Parenb (и ряд других вещей) с помощью следующей команды:

sudo screen /dev/ttyUSB2 115200,cs8,parenb,-parodd,-cstopb

Однако система, похоже, не уважает это. Вот настройки, о которых сообщает stty, пока я на экране с помощью приведенной выше команды:

$ sudo stty -F /dev/ttyUSB2 -a
speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^H; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 100; time = 2;
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

Обратите внимание на -parenb несмотря на то, что я включил его в командной строке.

Если я внесу изменение вручную в ttyUSB2, оно не будет соблюдено после (или пока) рабочего экрана.

Установить паренб:

$ sudo stty -F /dev/ttyUSB2 parenb

Проверьте его значение:

$ sudo stty -F /dev/ttyUSB2 -a
speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^H; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 100; time = 2;
parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

Вы можете видеть, что паренб настроен правильно.

Запустить экран:

$ sudo screen /dev/ttyUSB2 115200,cs8,parenb,-parodd,-cstopb

Проверьте Parenb снова:

$ sudo stty -F /dev/ttyUSB2 -a
speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^H; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 100; time = 2;
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

Ой, это опять -parenb .

В чем дело?

Как бы я изменил эту команду, чтобы использовать четную четность (в частности, 8e1 вместо 8n1 по умолчанию)?

Операционная система - Ubuntu 12.04.5 LTS с последней версией HWE.

2 ответа2

5

Попробуйте sudo screen /dev/ttyUSB2 115200,cs8,parenb,-parodd,-cstopb

Со страницы руководства для stty:

  • csN - установить размер символа в N бит, N в [5..8]
  • [-] parenb - генерировать бит четности на выходе и ожидать бит четности на входе
  • [-] parodd - установить нечётную четность (даже с '-')
  • [-] cstopb - использовать два стоп-бита на символ (один с '-')
3

Короче говоря, похоже, что screen не поддерживает установку этих флагов. Альтернативой может быть запуск stty для установки флагов, когда экран подключен к порту, как вы уже сделали. Кроме того, вы можете запустить kermit или другую программу эмулятора терминала в обычном сеансе командной строки экрана, вместо того, чтобы экран подключался напрямую к последовательному порту.

Исходный код screen находится по адресу http://git.savannah.gnu.org/cgit/screen.git. Похоже, что файл интереса tty.sh. Это сценарий оболочки, который запускается в процессе сборки для создания "tty.c". tty.c содержит код для доступа к последовательным портам.

Кажется, что функция SttyMode() анализирует параметры tty и устанавливает режим tty. Мне кажется, что он обрабатывает небольшой фиксированный набор опций. "Паренб" и "Пародд" не входят в их число.

Похоже, что для разработчика, имеющего опыт работы с C, было бы просто добавить поддержку этих параметров, если это вариант для вас.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .