Find serial port linux

Кунг-фу стиля Linux: разбираемся с последовательными портами

Раньше последовательные порты были буквально повсюду. И они, в каком-то смысле, никуда и не делись, так как многое, что подключается к компьютеру по USB, на самом деле, выглядит для системы как последовательный порт. Проблема тут заключается в том, что в наши дни всё в мире завязано на компьютерные сети. Конечно, можно купить терминальный сервер, который преобразует последовательный порт в интерфейс Ethernet. Но это совсем не интересно. Здесь я хочу рассказать о том, как пробрасывать последовательные порты по сети с использованием существующих Linux-инструментов. Решение это не идеальное, оно оказывается работоспособным далеко не всегда, но если оно работает, то работает оно хорошо.

Всё — это файл — до тех пор, пока это не так

Когда-то в прошлом ОС Unix — прародитель Linux — практически всё считала файлом. Все файлы были созданы более или менее равными. Программы не заботило то, с чем именно им приходилось работать: с локальными файлами, с файлами, доступными по сети, с файлами, считанными с ленточного накопителя, или с файлами, прибывшими по именованному каналу.

Но ситуация начала меняться. Несмотря на то, что в Linux последовательный порт — это просто файл, у него имеются некоторые особые атрибуты, которые позволяют, например, задать скорость порта в бодах. И, что ещё хуже, некоторые программы слишком много «знали» о файлах и настоятельно требовали придерживаться определённых соглашений по их именованию. Поэтому, в теории, у пользователя должна была быть возможность создать сетевой сокет и подключить один из его концов к последовательному порту, а другой — к программе. После этого всё должно было нормально работать. Но это — в теории.

Переходник USB/последовательный порт

Практика, конечно, отличается от теории. В некоторых случаях, очень простых, это может и сработать. Для настройки вышеописанной схемы работы с последовательными портами можно воспользоваться утилитой socat (это — нечто вроде cat для сокетов). Но если программа, которую мы пытаемся таким образом обмануть, попробует, например, задать скорость порта в бодах, то у неё, вероятно, ничего не получится. А некоторые программы даже не распознают такой вот ненастоящий последовательный порт.

Подробности о socat

Программа socat напоминает волшебный кабель-переходник, который просто передаёт на выход всё, что поступает на его вход, и, кроме того, поддерживает передачу данных в обратном направлении. Программа может читать данные из файлов, из каналов, с различных устройств, из сокетов и из некоторых других мест. Например, может понадобиться создать простой TCP-прокси для перенаправления соединений с одного локального хоста на другой хост. С помощью socat решить эту задачу очень просто:

То, что получится в результате выполнения этой команды, поддерживает лишь одно соединение. Но socat можно настроить так, чтобы для новых соединений создавались бы форки, что позволяет обрабатывать множество запросов.

Проблема

Правда, если попытаться применить socat для работы с последовательным портом, то получившаяся конструкция вряд ли будет работать без множества дополнительных настроек. Но нужно это так часто, что существует несколько программ, способных нам в этом помочь. В большинстве Linux-дистрибутивов заработает программа ser2net , которая умеет преобразовывать последовательный порт в сокет. Если ser2net кому-то не подойдёт — можно воспользоваться Python-кодом, который имеется среди примеров использования библиотеки pyserial . Правда, та версия pyserial , которая установлена в используемом дистрибутиве, может оказаться слишком старой для поддержки этого кода. Если это так и есть — нужно установить эту библиотеку в обход системного менеджера пакетов, например, воспользовавшись pip .

Далее я исхожу из предположения о том, что для работы с последовательным портом используется ser2net .

Эта утилита обычно устанавливается в виде системной службы, для её настройки можно прибегнуть к редактированию файла /etc/ser2net.conf . Я убрал из этого файла всё, что там было, и добавил туда описания двух нужных мне последовательных портов, указав, кроме прочего, их желаемую скорость в бодах:

После редактирования этого файла сервис надо перезапустить (вероятно, тут подойдёт команда systemctl restart ser2net ; а если она не сработает в первый раз — её стоит попробовать выполнить ещё раз, так как иногда она пытается запустить новую копию сервиса ещё до того, как предыдущая копия полностью завершила работу).

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

Но, в любом случае, после того, как сервер заработает, указанные порты (7777 и 7778 в моём конфигурационном файле) будут работать как соответствующие последовательные порты.

Хочу сделать тут несколько замечаний. Если вы пытаетесь проделать это с 3D-принтером, и если у вас запущено нечто вроде Octoprint, то вам понадобится или закрыть программу, или найти другой способ «отвязать» её от принтерного порта до выполнения вышеописанных настроек. Это применимо к любой программе, удерживающей последовательный порт, который нам нужно открыть. В случае с некоторыми стандартными портами нужно удостовериться в том, что механизм входа в систему не удерживает порт открытым, ожидая пользователя. То, как именно это всё заработает, зависит от конкретной системы. То же самое относится и к файрволу. Если прослушивается порт 7777 и при этом используется файрвол, нужно настроить его так, чтобы он разрешал бы подключения к этому порту. При этом надо помнить о том, что для открытия портов с небольшими номерами обычно нужны root-права.

Читайте также:  Delete directory linux terminal

Клиент

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

Кое-какие программы, правда, ищут устройства лишь в папке /dev . Если это именно так — понадобится запустить socat с root-правами (воспользовавшись sudo ), а затем нужно будет настроить /dev/ttyNET0 , дав разрешения на чтение и запись (например — sudo chmod 666 /dev/ttyNET0 ).

Тестирование

Если созданный механизм выглядит работоспособным, я, всё равно, не рекомендую сразу же пробовать пользоваться им в программе, для которой он создавался. Советую сначала протестировать его, воспользовавшись чем-то вроде picocom . После запуска socat , например, на клиентской машине должна нормально отработать такая команда:

Утилита picocom может обмениваться данными по сети с использованием виртуального последовательного порта

Если вы попробуете сделать нечто подобное, то вам, понятно, нужно будет указать актуальные для вашей системы имя и скорость порта. У вас, в результате, должна появиться возможность обмениваться данными с удалённым устройством. Если это не получится — нужно разобраться с причинами неполадки до того, как виртуальный порт можно будет использовать в обычной программе. Если в основе вашего последовательного устройства не лежит передача текста, то, возможно, вам больше повезёт с cutecom. Но, к сожалению, эта программа знает о том, что виртуальный последовательный порт — это порт поддельный, и не позволит его выбрать. Правда, программа это опенсорсная, поэтому не слишком сложно будет создать её собственную версию, которая примет любое нужное имя устройства. Конечно, есть и другие варианты. Например — выбрать ненастоящий последовательный порт позволит gtkterm .

Если в ходе тестирования возникнет ошибка протокола, может оказаться так, что последовательный порт перемещён (например — был /dev/ttyUSB0 , а потом стал /dev/ttyUSB1 ), или окажется, что неправильно настроена скорость порта. Сообщения об ошибках не особенно информативны, но при поиске проблем стоит помнить об опции -d программы ser2net .

Документация программы ttynvt устроена просто, но отличается точностью

Когда же дело дойдёт до использования виртуального последовательного порта в обычной программе, всё может заработать как надо. Но может появиться ошибка, или, в некоторых случаях, программа может не позволить выбрать соответствующий файл, так как он не ассоциирован с настоящим последовательным портом. Иногда бывает так, что в чём-то просто не везёт. Правда, тут может пригодиться более интеллектуальный клиент, который знает толк в последовательных портах. Например — ttynvt. Программу, возможно, придётся собрать из исходников, но сделать это очень просто. Она зависит от libfuse , но больше ей ничего особенного не нужно.

После того, как программа будет готова к работе — попробуйте нечто вроде такой команды:

Будет создано устройство /dev/ttyNET0 (отсюда — и потребность в root-правах). В моей системе у нового устройства были права на чтение и запись root-уровня, оно входило в группу dialout . Если вы воспользуетесь этой программой, то вам, возможно, нужно будет проверить и настроить под себя её разрешения.

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

Почему всё так нескладно?

Я, когда связался с последовательными портами, хотел сделать так, чтобы программа Lightburn для лазерного резака работала бы на мощной машине с использованием удалённого рабочего стола. Мне хотелось, чтобы резак был бы подключён к USB-порту на простом локальном компьютере, и чтобы программа взаимодействовала бы с поддельным портом в более серьёзной системе.

Но, к сожалению, сейчас ситуация такова, что Lightburn — программа слишком умная, которая не ведётся на мои хитрости и не хочет показывать мне виртуальные последовательные порты. И нет известного мне способа заставить её использовать имя файла, выбранное мной. Поэтому я даже не могу проверить то, как она работает с виртуальным портом. Правда, мне удалось протестировать подобные порты с некоторыми другими G-Code-программами. И всё это работало хорошо. Я сообщил о моей проблеме разработчикам Lightburn. Возможно, в тот момент, когда вы это читаете, проблема уже решена.

Парадигма «всё — это файл» чрезвычайно мощна. Но, к сожалению, с каждым годом она всё меньше соответствует реальному положению дел. Это создаёт всё больше препятствий тем, кто хочет сделать в Linux что-то интересное и не совсем обычное. Но, как это обычно бывает в Linux, желаемого, всё равно, как-то можно достичь. Я не сомневаюсь в том, что смог бы отследить вызовы, которые выполняет Lightburn для открытия порта, а после этого смог бы найти способ обмануть программу и подсунуть ей последовательный клиент. Но я надеюсь, что делать этого мне не придётся.

Возникала ли у вас необходимость в работе с виртуальными последовательными портами в Linux?

Источник

How To Check and Use Serial Ports Under Linux

Display Detected System’s Serial Support Under Linux

Simple run the dmesg command:
$ dmesg | grep tty

A note about USB based serial ports

USB to RS232 adapter cable connects from the USB port of a computer to a device. Such serial to USB adapter connects to devices for configuration or programming under Linux. Here is what the dmesg command displays when you enter USB adapter:
$ dmesg
## use grep command/egrep command to filter out USB devices ##
$ dmesg | grep -i serial
$ dmesg | grep -i FTDI

Listing and using USB serial ports on Linux

Here is how it looks when I attached USB device:
$ sudo dmesg | more

Use the setserial command to check and use serial ports

The setserial is a program designed to set and/or report the configuration information associated with a serial port. This information includes what I/O port and IRQ a particular serial port is using, and whether or not the break key should be interpreted as the Secure Attention Key, and so on.

Читайте также:  Предустановленная windows 10 что это значит

Debian/Ubuntu Linux install setserial using the apt-get command/apt command

$ sudo apt install setserial

CentOS/RHEL/Oracle Linux install setserial using the yum command

$ sudo yum install setserial
Fedora Linux user try the dnf command:
$ sudo dnf install setserial

Using setserial to list serial ports and devices

Now we installed required package. Open the termial and then type the following setserial command:
$ setserial -g /dev/ttyS[0123]
If you get an error/warning that reads as “Permission denied,” try running the command as the root user. For example, I am running it using the sudo command/su command:
$ sudo setserial -g /dev/ttyS[0123]

The setserial with -g option help to find out what physical serial ports your Linux box has.

Listing or displaying USB serial ports on Linux

Try:
$ sudo setserial -g /dev/ttyUSB[01]

  • No ads and tracking
  • In-depth guides for developers and sysadmins at Opensourceflare✨
  • Join my Patreon to support independent content creators and start reading latest guides:
    • How to set up Redis sentinel cluster on Ubuntu or Debian Linux
    • How To Set Up SSH Keys With YubiKey as two-factor authentication (U2F/FIDO2)
    • How to set up Mariadb Galera cluster on Ubuntu or Debian Linux
    • A podman tutorial for beginners – part I (run Linux containers without Docker and in daemonless mode)
    • How to protect Linux against rogue USB devices using USBGuard

Join Patreon

Linux serial console programs

Once serial ports identified you can configure Linux box and use serial ports using various utilities:

  1. minicom– The best friendly serial communication program for controlling modems and connecting to dump devices
  2. wvidial or other GUI dial up networking program – a PPP dialer with built-in intelligence.
  3. Screen Command: Set Baud Rate [ Terminal Communication ]
  4. getty / agetty – agetty opens a tty port, prompts for a login name and invokes the /bin/login command.
  5. grub / lilo configuration – To configure serial port as the system console

Cocnlusion

You learned how to list or check serial ports including USB based adptor on Linux.

🐧 Get the latest tutorials on Linux, Open Source & DevOps via

Category List of Unix and Linux commands
Documentation help • mandb • man • pinfo
Disk space analyzers df • duf • ncdu • pydf
File Management cat • cp • less • mkdir • more • tree
Firewall Alpine Awall • CentOS 8 • OpenSUSE • RHEL 8 • Ubuntu 16.04 • Ubuntu 18.04 • Ubuntu 20.04
Linux Desktop Apps Skype • Spotify • VLC 3
Modern utilities bat • exa
Network Utilities NetHogs • dig • host • ip • nmap
OpenVPN CentOS 7 • CentOS 8 • Debian 10 • Debian 8/9 • Ubuntu 18.04 • Ubuntu 20.04
Package Manager apk • apt
Processes Management bg • chroot • cron • disown • fg • glances • gtop • jobs • killall • kill • pidof • pstree • pwdx • time • vtop
Searching ag • grep • whereis • which
Shell builtins compgen • echo • printf
Text processing cut • rev
User Information groups • id • lastcomm • last • lid/libuser-lid • logname • members • users • whoami • who • w
WireGuard VPN Alpine • CentOS 8 • Debian 10 • Firewall • Ubuntu 20.04

Comments on this entry are closed.

I don’t know if this is the place, but I’m looking for information that is similar. I have 2 machines setup through a null modem. I want to read through the com port from one machine to the other. The sending machine is running Windows sending through COM1: and the receiving computer is Linux Red Hat. Any help on this would be appreciated.

You can use pyserial ,its a python package,can be used to read and write in serial ports

another simple serial console program not mentioned is gtkterm.

I want to advise you that probably there is an error in the last sentence “seserial with -g option help to find out what physical serial ports your Linux box has.”; isn’t it setserial?

I have 4 standard serial ports defined, /dev/ttyS0-4, but I added a PCI-E 16 port serial adapter, and I have not found a way to connect anything to the upper 16 ports.
How do you create the virtual links? what options do you give setserial to define the new ports?

it dosn’t work 🙁 I can’t connect to my ASA using debian.

Daemon is a program called getty used by UNIX/Linux systems. There are many different versions of getty. The first modem detected is /dev/ttys0 or /dev/ttys1. To create a link to the devices file so that you can view modem information. Type ln -s /dev/ttys1 /dev/modem.
It is essential to set the modem to AUTO ANSWER using getty.

download minicom from alioth.debian.org/projects/minicom.

create a modem config file by entering minicom -s from the root command line
select the options you want to configure using AT commands
connect to the modem by typing in minicom

Thanks very useful..save my time 🙂

Hi,everybody
I have a serial PCI card with two ports but neither of them is working, on Linux fedora 16. I have tried using “gtkterm” and “minicom” but unfortunately I can’t make a serial connection to my Cisco lab. Here is my output when I issue the command: “setserial -g /dev/ttyS[0123]”.

/dev/ttyS0, UART: 16550A, Port: 0xec00, IRQ: 16
/dev/ttyS1, UART: 16550A, Port: 0xe880, IRQ: 16
/dev/ttyS2, UART: unknown, Port: 0x03e8, IRQ: 4
/dev/ttyS3, UART: unknown, Port: 0x02e8, IRQ: 3

also I want to mention that when I try to connet throught the terminal it generates a message like so: ” Cannot open /dev/ttyS0: Permission denied”.
any help please.
abdel

Check the permissions on /dev/ttyS0… Likely problem is it’s owned by root, and is part of the uucp group. Add yourself to the uucp group, and all should be better. I’m curious to know if this is enough for you as I am having problems communicating with a serial port on Linux as well. I got past the permissions stuff, but it is still not working.

Thanks Tom,
I actually I tried but it’s does not work, still says “permission denied”. I would appreciate if you explain to me step by step the procedure how to do it, I’m knew to Linux.
Best Regards
Abdel

1) ls -la /dev/ttyS0 — This will report the permissions on the port. Typically, this will say crw-rw—- 1 root uucp. The “c” in the string indicates that it’s a “character device” the first “rw” indicates that the owner has read/write permission. The second “rw” means that the group has read/write permissions. The “—” indicates that the rest of the world has no permissions. After the “—-“, “root” indicates that the owner of the device is root, and that the group id is “uucp”. So, you either need to be root, or a member of the uucp group to have read/write access to the port.

2) To add yourself to the uucp group (to get read/write access), you need to edit the file /etc/group, and add your user name to the line that begins with “uucp:” User names are separated by commas, so add a comma, then your user name to the end of the line. You will need root permissions to edit this file.

3) log out, and log back in because group associations are made at login time, and are not queried on each request.

Thanks Tom,
here is my output from the group file I have added my username to it but does not work.

I will just give up.Thanks a lot for your help I relay appreciate it.

Your entry in /etc/group is incorrect. If you read my previous post, I said to add your user id to the line that _begins_ with uucp. You added uucp to the group of users that can access your account. You want an entry in the /etc/group file that looks something like:

The critical element is that it’s the line that begins with uucp

It works. I just add my username to ” dialout ” and it worked fine. Iwould like to thank you for you time and support.

Best Regards
Abdel

hi,
I have connected the SIM300(gsm model) to my pc running ubuntu. I need a code to send a AT command to the GSM module and it should read and display the reply.
Please let me know steps.
I tried so many methods and codes, but no use…

i need C code(program).

all my ttyS* shows unknown, earlier it was working fine, now it doesnt recognise

setserial -g /dev/ttyS*
/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

#cat /etc/redhat-release
CentOS Linux release 6.0 (Final)

#dmesg | grep tty
console [tty0] enabled

can u pls help me

tried spending time in google two days, still no success, tried connecting a brand new device too, still no success.

Sorry, but that second sentence is not necessarily true. I have a PC with two dual com port adapters. Windows sees them as COM1 -> COM4 (there is no built in COM port). Linux sees them as /dev/ttyS4->/dev/ttyS7.

/dev/ttyS0-/devttyS3 are apparently reserved, exist whether or not a physical port exists, and /dev/ttyS0 for certain is “special” in that it is used by the default terminal window:

I think minicom still superior to other console utility.

Hi All tried all of the above and still get permission denied . HELP
Kevin

/bpq$ setserial -g /dev/ttyS[012345657

/bpq$ setserial -g /dev/ttyS[012345657]

sudo setserial -g /dev/ttyS1

Hiiiiiiiii
Please help me
i am install minicom and use serial modem sim300 v7.03 but there is problem to type AT cmd on minicom console…….

Edgeports are very easy to use the firmware is on Ubuntu they are from 2 ports to 16+ I bought my last two of them on ebay.
Jim

Hi all..
I got problem to connect with my USB serial port,
i already create
ln -s /dev/ttyUS0

and check dmesg | grep tty
[ 0.000000] console [tty0] enabled
[ 7.722004] systemd[1]: Created slice system-getty.slice.
[ 3659.524452] usb 1-1.1: FTDI USB Serial Device converter now attached to ttyUSB0
[ 4850.183339] ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0
[ 4857.907567] usb 1-1.1: FTDI USB Serial Device converter now attached to ttyUSB0
when running SDNC program and select com1 will shown “port is already in use”

hi, have are you\
i have a problem with machine xnc . old version sistem operating linux,
pc removed battery cmos . but change battery do it so machine different data serial port linux dont recognized machine.
how can you slove this problem
your help wil be welcome

Источник

Читайте также:  Free alarm clock windows
Оцените статью