- How do I know which /dev/ttyS* is my serial port?
- Difference between `/dev/ttyS0` and `/dev/ttys0`?
- 3 Answers 3
- What is ttys0 linux
- 9.2 Шина PCI
- 9.3 Наименования и номера последовательных портов
- 9.4 Подробнее о названиях последовательных портов
- 9.5 Последовательные порты USB
- 9.6 Ссылка /dev/modem на ttySN
- 9.7 Devfs (улучшенная, но тем не менее устаревшая файловая система устройств)
- 9.8 Устройства cua (устаревшие)
How do I know which /dev/ttyS* is my serial port?
Running that on my own Linux box (which only has 1 Serial port) produces a single ttyS0 output line. Try it on your own, you will see what I mean.
Does that mean that after running that command, if the response is . console [tty0] enabled. and no other, any device is connected to /dev/tty0 (sorry for the apparent silliness of the question)?
The only problem is that dmesg output can be cleared — so if you run this too late, you’re out of luck. Looking at /proc/tty/driver/serial seems the more robust answer and then check for rx interrupts increasing in count as you write data to that port
if you’re currently in a terminal over said serial line, you can just type tty to get the name of your tty. I assume that’s what OP meant since they did not pose the question as «which serial port(s) have getty running?»
See which UARTs where detected in /proc/tty/driver/serial . A line with uart:unknown means: nothing detected (and likely not existent).
# cat /proc/tty/driver/serial serinfo:1.0 driver revision: 0: uart:16550A port:000003F8 irq:4 tx:0 rx:0 1: uart:16550A port:000002F8 irq:3 tx:111780 rx:1321 RTS|DTR|DSR 2: uart:unknown port:000003E8 irq:4 3: uart:unknown port:000002E8 irq:3
If you see any of the CTS, DSR, (D)CD or RI flags (these are input signals), like on UART no. 1 above, you can even be pretty sure that there actually is something connected and driving these lines. Same is true for the rx-byte-count.
Seeing a positive tx-byte-count, RTS and/or DTR only reveals that some software accessed the device and ordered it to set those signals or send bytes here, but not if something was listening.
Note: you might see more ports available in hardware than ports reaching the outside of your computer in form of a connector.
Difference between `/dev/ttyS0` and `/dev/ttys0`?
In Linux, what is the difference between /dev/ttyS0 and /dev/ttys0 ? I know that the first is a serial port, but what about the second, with the small s ?
3 Answers 3
For a pseudo terminal pair such as ptyp3 and ttyp3, the pty. is the master or controlling terminal and the tty. is the slave. There are only 16 ttyp’s: ttyp0-ttypf (f is a hexadecimal digit). To get more pairs, the 3 letters q, r, s may be used instead of p. For example the pair ttys8, ptys8 is a pseudo terminal pair. The master and slave are really the same «port» but the slave is used by the application program and the master is used by a network program (or the like) which supplies (and gets) data to/from the slave port.
In the Linux devices.txt file in the kernel docs it says:
3 char Pseudo-TTY slaves 0 = /dev/ttyp0 First PTY slave 1 = /dev/ttyp1 Second PTY slave . 255 = /dev/ttyef 256th PTY slave These are the old-style (BSD) PTY devices; Unix98 devices are on major 136 and above.
4 char TTY devices 0 = /dev/tty0 Current virtual console 1 = /dev/tty1 First virtual console . 63 = /dev/tty63 63rd virtual console 64 = /dev/ttyS0 First UART serial port . 255 = /dev/ttyS191 192nd UART serial port UART serial ports refer to 8250/16450/16550 series devices. Older versions of the Linux kernel used this major number for BSD PTY devices. As of Linux 2.1.115, this is no longer supported. Use major numbers 2 and 3.
I don’t know how much this helps you, but should get you started in the right direction.
What is ttys0 linux
Раньше последовательные порты за исключением нескольких многопортовых карт назывались просто: /dev/ttyS0, /dev/ttyS1 и т.д. С появлением в 2000-м году шины USB добавились названия вроде /dev/ttyUSB0 и /dev/ttyACM1 (для модемов ACM, подключаемых к шине USB).
9.2 Шина PCI
Поскольку DOS предусматривала 4 последовательных порта на старой шине ISA: COM1-COM4, ttyS0-ttyS3, в обозначениях последовательных портов более новой шины PCI использовались числа, начиная с 4-го (ttyS4) или 14-го (ttyS14, до ядра версии 2.6.13). Но т.к. большое количество ПК поставляется только с одним или двумя последовательными портами, ttyS0 и возможно ttyS1 (второй порт), то с версии ядра 2.6.15 шине PCI позволили использовать ttyS2. Все это позволяет иметь на одном ПК последовательные порты и шины ISA, и шины PCI без противоречий в наименованиях: 0-1 (или 0-3) предназначены для старой шины ISA (или более новой шины LPC), а числа от 2-х (4-х или 14-ти) и выше — для шины PCI. В редких случаях из этого правила могут быть исключения. Последовательные порты материнских плат в основном либо по-прежнему остаются ISA-портами (может использоваться внутренняя шина ISA), либо подключаются к шине LPC, специально предназначенной для существующих медленных устройств ввода/вывода: последовательных/параллельных портов и флоппи-дисководов.
9.3 Наименования и номера последовательных портов
Устройства в Linux имеют старшие и младшие (major и minor) номера. У последовательного порта ttySx (x=0,1,2 и т.д.) старший номер равняется 4. Убедиться в этом (а также увидеть младшие номера) можно, выполнив команду «ls -l ttyS*» в каталоге /dev. Наименования для различных устройств можно найти в документации ядра, в файле «devices».
Раньше для каждого последовательного порта существовали устройства с названием «cua», работающие немного иначе. Так, cua2 соответствовало ttyS2. Старшим номером устройств cua была 5, а младшие номера начинались с 64. Файлы устройств cua и сейчас могут присутствовать в каталоге /dev. В настоящее время они исключены из употребления. См. ниже раздел «Устройство cua, устаревшее».
Создание файлов в каталоге устройств рассмотрено в разделе Serial-HOWTO «Creating Devices In the /dev directory» («Создание устройств в каталоге /dev»).
9.4 Подробнее о названиях последовательных портов
В Dos/Windows названия последовательных портов начинаются с COM, драйвер последовательного порта Linux использует ttyS00, ttyS01 и т.д. Более ранние версии драйвера (2001 ?) использовали просто tty00, tty01 и т.д.
В приведенной таблице показаны примеры названий последовательных устройств. Адреса IO — значения по умолчанию для старой шины ISA (для более новых шин PCI и USB значения другие).
название название номера адреса || USB-шина ( ACM => модем ACM )
DOS Linux старший младший IO ||
COM1 /dev/ttyS0 4, 64; 3F8 || /dev/ttyUSB0 | /dev/ttyACM0
COM2 /dev/ttyS1 4, 65; 2F8 || /dev/ttyUSB1 | /dev/ttyACM1
COM3 /dev/ttyS2 4, 66; 3E8 || /dev/ttyUSB2 | /dev/ttyACM2
COM4 /dev/ttyS3 4, 67; 2E8 || /dev/ttyUSB3 | /dev/ttyACM3
— /dev/ttyS4 4, 68; различные
9.5 Последовательные порты USB
См. файлы usb-serial, acm и т.д. в подкаталоге usb каталога с документацией ядра.
9.6 Ссылка /dev/modem на ttySN
При установке некоторых дистрибутивов создается два дополнительных устройства: /dev/modem для Вашего модема и /dev/mouse для мышки. Оба представляют собой символические ссылки на соответствующие устройства в /dev .
Историческая справка: ранее (в 1990-х) использование /dev/modem (как ссылки на последовательный порт модема) вызывало проблемы, поскольку система блокировки файлов не могла распознать за ним /dev/ttyS2 , к примеру. Новая система блокировки с этим справляется, поэтому на сегодняшний день ничто не мешает использованию таких ссылок.
9.7 Devfs (улучшенная, но тем не менее устаревшая файловая система устройств)
Одним из нововведений, пришедших с ядром 2.4, стала теперь уже устаревшая «файловая система устройств» (devfs) с целым набором новых названий для всего. В 2003-4 было заявлено, что devfs имеет неразрешимые проблемы, и с выходом ядра 2.6.12 она была заменена «udev» (ядра до версии 2.6.12 также могли работать с udev, но имелись некоторые проблемы).Хотя udev не предоставляет всей функциональности devfs, горячее подключение он поддерживает. Linux может работать и без udev, поэтому некоторые пользователи обходятся без нее. Тем не менее, она входит в состав большого числа дистрибутивов.
Devfs представляла собой хорошую идею и по заявлениям являлась более эффективной, нежели udev. К сожалению, автор ее не поддерживал длительное время, забросил, и к настоящему — хорошо это или плохо — ее место заняла udev. Но дискуссии вокруг devfs и udev продолжаются. Подробное описание devfs представлено на странице: http://www.atnf.csiro.au/~rgooch/linux/docs/devfs.html . Информация о ней есть и в документации ядра: filesystems/devfs.
Названия devfs для устройств могут использоваться и в udev, но настройка этой возможности может показаться непростой, поэтому обычно ею не пользуются. Примеры названий devfs для последовательных устройств: ttyS1 соответствует tts/1, ttyUSB1 — /usb/tts/1, а ttyACM1 — /usb/acm/1. Цифра 1 в указанных примерах может быть заменена на 0, 2, 3, 4 и т.д. В udev названия следующие: ttyS2 соответствует tts/2 (последовательный порт), tty3 — vc/3 (Virtual Console — виртуальная консоль), ttyp1 — pty/m1 (PTY master — псевдотерминал, ведущий), ttyp2 — pty/s2 (PTY slave — псевдотерминал, ведомый). «tts» выглядит как каталог, содержащий «файлы» устройств: 0, 1, 2 и т.д. Все эти каталоги с новыми именами тоже располагаются в каталоге /dev, но по желанию их можно перенести куда-нибудь.
В devfs устройства в каталоге /dev создаются автоматически драйверами. Т.е., если поддержка последовательных устройств осуществляется модулем ядра и он еще не загружен, то в каталоге /dev не будет ни одного последовательного устройства. Это может показаться странным: последовательные порты физически есть, а в каталоге /dev их не видно. Так и задумано: если программа обращается по заданному ей названию к устройству, а модуль его поддержки не загружен, то предполагается, что ядро попытается найти драйвер для него и создать в каталоге /dev его «файл».
Если драйвер находится, то все работает замечательно. А если нет. К примеру, если Вы захотите настроить через setserial порт, который драйвер не смог обнаружить, то система сообщит, что такого порта нет. Как в этом случае создать в devfs порт?
Что касается многопортовых устройств, то /dev/ttyF9, к примеру, соответствует /dev/ttf/9, в более поздних версиях /dev/tts/F9. Вместо F (или f) могут быть другие буквы в зависимости от того, какая у Вас карта. Драйвер многопортовой карты должен создать в каталоге /dev «файлы» с названиями devfs, подобными приведенному.
9.8 Устройства cua (устаревшие)
Для каждого устройства ttyS есть соответствующее устройство cua. Но использовать cua надо только в случае необходимости (поскольку в настоящее время они исключены из использования). Между cua и ttyS есть различие, но смышленный (savvy) программист может заставить порт ttyS работать как порт cua, так что надобность в cua вообще отпадает. За исключением некоторых старых программ, которым требуется именно cua-устройство.
Основное различие между cua и ttyS проявляется при открытии порта обычной командой «open» Си-программы: порт cua откроется независимо от состояния сигнала CD. Добавлением нескольких строк в программу можно и ttyS-порт заставить открываться без оглядки на CD. Из-за того, что открытие порта cua программируется проще, то cua использовались раньшедля передачи данных через модем, а ttyS — для приема данных.
Начиная с версии ядра 2.2, при обращении к cua в лог ядра пишется предупреждение. Это свидетельствует о том, что устройства cua считаются «вымершими».