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]

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

Ответ на: комментарий от firkax

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

проверить работоспособность программ

Суть самого задания заключается в том, чтобы записать один байт данных в порт №1, скажем, COM1, и считать его из порта №2, опять же, скажем, COM2.

Большая часть того, что я видел, выполнялась в среде MS DOS под VirtualBox, порты гостевой системы связывались с соответствующими портами хостовой системы (хоть я и не понимаю, как это устроено), которые в свою очередь ставились в «петлю» с помощью com2com (windows-тема).

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

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

Чтобы что-то считать из (настоящего, не виртуального) порта, это «что-то» в него кто-то должен прислать, по проводам. Других вариантов нет. Записывать можно что угодно, только никто не увидит и работоспособность ты не проверишь.

Хотя нет, у контроллера com-порта есть настрока loopback-режима, бит 4 в регистре MCR (base+4 например 0x3FC). Можешь через него попробовать, если контроллер порта есть (и включён в биосе).

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

Да, все так. Предполагалось, что имеются варианты, подобные подобному на «окнах» (https://pasteboard.co/PIxtle4DFy7G.jpg), однако найти чего-то аналогичного, что позволило бы взаимодействовать с UART регистрами без UART’а, не удалось.

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

Я бы с радостью это проверил, будь такая возможность, но ключевой момент здесь в том, что в системе это отображается как устройство последовательного порта (результат выполнения тулза pyserial)

Inqognitoo
() автор топика
Ответ на: комментарий от 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 ★★
()