Вопрос или проблема
Я использую Ubuntu Server 18.04.1 LTS. Это небольшой промышленный ПК с 6 COM-портами.
Я подключил свое устройство к тому, что на корпусе обозначено как COM1. Но в результате исследований я обнаружил, что Ubuntu распознает его как COM4.
Когда я выполняю setserial -g /dev/ttyS[0-6]
Я получаю следующее:
/dev/ttyS0, UART: unknown, Port: 0x03f8, IRQ: 4
/dev/ttyS1, UART: 16550A, Port: 0x02f8, IRQ: 3
/dev/ttyS2, UART: 16550A, Port: 0x03e8, IRQ: 7
/dev/ttyS3, UART: 16550A, Port: 0x02e8, IRQ: 7
/dev/ttyS4, UART: 16550A, Port: 0x03e0, IRQ: 4
/dev/ttyS5, UART: 16550A, Port: 0x02f0, IRQ: 7
/dev/ttyS6, UART: 16550A, Port: 0x02e0, IRQ: 7
Мое устройство COM1 на самом деле:
/dev/ttyS4, UART: 16550A, Port: 0x03e0, IRQ: 4
Как мне изменить адреса, чтобы они соответствовали обозначениям портов на передней панели корпуса? Заранее спасибо за вашу помощь.
В общем, ttyS0, ttyS1, ttyS2, ttyS3 зарезервированы для фиксированных последовательных портов, которые находятся на материнской плате ПК или на карте, вставленной в слот ISA (а слоты ISA не существовали на ПК уже как минимум два десятка лет). См.: https://en.wikipedia.org/wiki/Industry_Standard_Architecture. Эти последовательные порты будут иметь фиксированные I/O адреса 0x3F8, 0x2F8, 0x3E8, 0x2E8 соответственно.
Фиксированные последовательные порты на других типах вставленных карт (PCI и т. д.) часто получают назначенные I/O адреса гораздо выше, такие как 0xE000, 0xE008, и эти последовательные порты обычно назначаются на ttyS4, ttyS5 и т. д.
Таким образом, есть две группы: ttyS0..3 сегодня находятся на материнской плате; ttyS4 и выше расположены на вставленных картах PCI. Вот почему вы можете увидеть разрыв в диапазонах. Например, компьютер, на котором я это пишу, имеет ttyS0, ttyS4 и ttyS5. ttyS0 (COM1 в DOS/Windows) находится на материнской плате, в то время как ttyS4 и ttyS5 находятся на PCI-карте. Кроме того, I/O адреса составляют 0x3F8, 0xE000, 0xE008 соответственно.
Обратите внимание, что это всего лишь в общем то, что происходит. Назначение I/O адресов часто можно настраивать вручную в «настройках BIOS», и ядро Linux может быть настроено для назначения имен устройств (ttyS0 и т. д.) в другом порядке. Я подозреваю, что именно это произошло с вашей установкой Ubuntu Server 18.04.1 LTS.
К счастью, съемные (USB) последовательные порты немного проще определить: ttyUSB0, ttyUSB1 и т. д., а также ttyACM0, ttyACM1 и т. д. Поскольку они отключаемые, вы можете увидеть, как порты добавляются, запустив dmesg -w в окне терминала и наблюдая за сообщениями, генерируемыми при подключении и отключении устройств. Когда дело доходит до определения последовательных портов, dmesg -w и dmesg | grep “tty” станут вашими друзьями!
Ответ или решение
Проблема с назначением COM-портов в Ubuntu
Работая на Ubuntu Server 18.04.1 LTS на вашем малом промышленном ПК с 6 последовательными портами, вы столкнулись с проблемой, когда метки на корпусе порта не соответствуют адресам, назначенным операционной системой. Ваша конкретная ситуация, когда устройство, подключенное к порту, помеченному как COM1, идентифицируется как /dev/ttyS4
, требует тщательного анализа.
Причины возникновения проблемы
В современных системах операционные системы могут назначать последовательные порты, исходя из конфигурации материнской платы или установленных расширяющих карт. Как вы уже заметили, последовательные порты /dev/ttyS0
до /dev/ttyS3
обычно являются встроенными в материнскую плату и имеют фиксированные адреса ввода-вывода. В вашем случае /dev/ttyS4
, вероятно, связан с картой расширения или другим аппаратным обеспечением.
Эта ассоциация была установлена в BIOS или в процессе инициализации системы. Вам стоит обратить внимание на следующие моменты:
- BIOS/UEFI: Возможно, в настройках BIOS/UEFI ваша плата имеет возможность задавать адреса для последовательных портов. Убедитесь, что используемая карта или устройство правильно настроены.
- Интерфейс ядра Linux: Ядро Linux может по умолчанию назначать порты в определенном порядке, выводя номера портов на основе найденных устройств.
Решения проблемы
1. Настройка BIOS
Первый шаг — перейдите в настройки BIOS вашего ПК. Проверьте раздел, связанный с настройкой портов. Возможно, вы сможете изменить порядок назначения последовательных портов, чтобы они соответствовали физическим меткам на корпусе.
2. Изменение конфигурации системы
Если исправление BIOS невозможно или не дало результатов, можно попробовать изменить конфигурацию системы с помощью создания или редактирования файлов конфигурации на уровне ядра:
- Используйте команду для редактирования модуля
setserial
.
sudo setserial /dev/ttyS4 port 0x03e0 irq 4
Таким образом, вы сможете вручную переопределить назначение порта, что позволит сделать адреса более понятными.
3. Создание символических ссылок
В качестве альтернативного варианта вы можете создать символические ссылки, которые будут указывать на нужные устройства в /dev
, так чтобы в вашей системе было проще ориентироваться. Например:
sudo ln -s /dev/ttyS4 /dev/serial/COM1
Это создаст символическую ссылку, позволяющую вашему программному обеспечению обращаться к /dev/serial/COM1
, что может упростить вашу работу.
4. Мониторинг устройства
Используйте команды dmesg
для диагностики при подключении и отключении устройств:
dmesg -w
Эта команда позволит вам наблюдать за выводом, который будет содержать информацию о том, какие порты подключаются и какие настройки применяются, когда вы взаимодействуете с устройством.
Заключение
Обращение к COM-портам на Ubuntu может быть запутанным из-за различных конфигураций аппаратного обеспечения и настроек BIOS. Однако, следуя рекомендациям, приведенным выше, вы сможете добиться правильного соответствия между физическими метками и адресами, присвоенными в системе. Чтобы процесс был более удобным, подумайте о создании символических ссылок и регулярно проверяйте вывод dmesg
для диагностики проблем с подключением устройств.
Если у вас возникнут вопросы или вам потребуется дополнительная помощь, не стесняйтесь обращаться за поддержкой в профессиональные сообщества или к специалистам, работающим с системами Linux.