LINUX.ORG.RU

Программирование последовательных портов

 ,


0

3

Добрый вечер.

Необходимо разработать две программы, взаимодействующие с последовательным портом:

  1. как с файловым дескриптором;
  2. непосредственно через регистры последовательного порта.

Для первого используется <termios.h>, для второго - <sys/io.h>.

Однако проверить работоспособность в двух случаях оказалось невозможно: в первом случае /dev/ttyS* и /dev/ttyUSB* попросту не открываются, а во втором всякое чтение из регистра по адресу 0x3F8 возвращает байт 255.

После такого открытия решил посмотреть доступные мне порты с помощью утилиты setserial и получил следующий результат:

❯ sudo setserial -g /dev/ttyS[0123]
/dev/ttyS0, UART: unknown, Port: 0x03f8, IRQ: 4
/dev/ttyS1, UART: unknown, Port: 0x02f8, IRQ: 3
/dev/ttyS2, UART: unknown, Port: 0x03e8, IRQ: 4
/dev/ttyS3, UART: unknown, Port: 0x02e8, IRQ: 3

~
❯ sudo setserial -g /dev/ttyUSB[01]
zsh: no matches found: /dev/ttyUSB[01]

Вследствие этого возникает вопрос: связано ли такое поведение с отсутствием физических последовательных портов, и можно ли проверить работоспособность программ не в виртуальной машине?

Ответ на: комментарий от Inqognitoo
  1. Железные порты это ttySx
  2. Чтоб открыть как файл - нужно добавить пользователя в группу dialout (или аналогичную, зависит от дистрибутива). Ну, или открывать как root.
  3. Насчет доступа к регистрам напрямую, не уверен что это можно вообще из userspace, в обход драйвера. Хотя, может от root есть такая возможность.
  4. Нужна старая материнка с распаянными портами, они могут быть выведены на разьемы/колодки со штырьками на самой материнке, проверь даташит на свою материнку. Сейчас их даже не распаивают вообще. Если у тебя они есть, то проводками соедини пины Rx и Tx прямо на колодке на мамке.

А вообще, я в шоке, что дают такие задания в 2023 году, с разморозкой.

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

Хотя, можешь какую нить Raspberry Pi и иже с ними приобрести , чтобы имелась внешняя м/схема последовательного порта, чтобы адреса регистров совпадали. Т.к. иначе у АРМ процессоров порты уже встроены внутрь, и имеют другой набор регистров и т.п.

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

я в шоке, что дают такие задания в 2023 году, с разморозкой

На самом деле, задание обыкновенное для предмета, который я изучаю.

Правда, с его выполнением под Линуксом у меня по прежнему беда.

По сути, нужно поставить перемычку между COM1 и COM2 на VirtualBox, для чего я запускаю socat -d -d pty,raw,echo=0 pty,raw,echo=0, а в настройках виртуальной машины COM1 и COM2 привязываю к файлам /dev/pts/1 и /dev/pts/2.

В результате такого нехитрого действия на гостевой системе живут /dev/ttyS0 и /dev/ttyS1 с определенными UART-контроллерами.

Однако попытка получить с одного порта то, что было записано в другой порт, не увенчалась даже намеком не успех.

Получилось записать в гостевого /dev/ttyS1 и считать из хостового /dev/pts/1, с парой гостевой /dev/ttyS0 и хостового /dev/pts/2 приключилась такая же история.

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

А с чего ты взял что что то будет, если физически Rx и Tx не подключены.

Сокат это шляпа, лучше поставить виртуальный драйвер tty0tty который создает /dev/tntX устройства. Но тут уж только как файлы открывать.

Тебе нужна мамка с распаяными портами, иначе это все шляпа.

kuzulis ★★
()