Which tty is my serial port linux

Как узнать какой /dev /ttyS * мой последовательный порт?

У меня есть ноутбук, который имеет только один последовательный порт.

Как мне узнать, какой из этих «ttyS» относится к моему последовательному порту?

5 ответов 5

Запуск этого на моем собственном Linux-боксе (который имеет только 1 последовательный порт) выдает одну строку вывода ttyS0. Попробуйте сами, вы поймете, что я имею в виду.

Посмотрите, какие UART были обнаружены в /proc/tty/driver/serial . Строка с uart:unknown означает, что ничего не обнаружено (и, вероятно, не существует).

# 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 

Если что-то подключено и управляет линиями CTS, DSR или CD (это входные линии), вы даже можете быть уверены, что на самом деле что-то есть . То же самое верно для счетчика rx-byte-count.

Если вам нужно сделать это программно, чтение вывода из dmesg может быть проблематичным, вместо этого папка /dev /serial /by-id имеет ссылки на символы, которые названы в честь идентифицируемых данных вашего устройства и указывают на конкретные /dev /tty * они связаны с.

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

ttyS0 по 3 соответствуют COM1 до 4 соответственно. Они обычно имеют одинаковые аппаратные ресурсы и не всегда обнаруживаются, поэтому они всегда существуют.

Существует также команда setserial которая использует /proc/tty/driver/serial для получения своих данных.

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

Источник

Check what serial port i’m using in linux

I have a plugged usb-serial device plugged to my windows and serial mapped it using virtualbox e.g COM1 -> /dev/ttyS0.. Now how will i know which serial port my device is using.. I know right now im using /dev/ttyS0. but what if i don’t know. Linux Debian is creating this permanent serial port devices on boot time /dev/ttyS0-S3. How can i make a test that /dev/ttyS0 is the real port im using in c. Here’s my way of testing if it’s the right port or not.

devfd=open("/dev/ttyS0",O_WRONLY | O_NOCTTY | O_NDELAY); if(s_fd<0) exit(1); printf("open\n"); //It will always return true printing open because this device is created on boot time and is always available. so i made another check and that is to write to the port(Assuming i have set the permission to have full access to the serial port). if i can write to the port then it means it is really the port im using. test=write(devfd,"ATZ",4); if(test<0) printf("Can't write to port: Maybe not the serial port ur using\n"); printf("Device is avaialable\n"); // returns true because we can write to the port 

Can you show me other samples in c of how can Check serial port if there's a device plugged to that serial port? Or a test in c to the following serial port /dev/ttyS0 - /dev/ttyS3 if the following have devices plugged on them. Thanks.

Читайте также:  Advanced port scanner linux

If only this serial port is actively transmitting (or receiving) and all other ports are quiescent, then that activity should show up in the "tx:" transmitted byte counts for each serial port in the /proc/tty/driver/serial file.

2 Answers 2

The Standard Serial ports are mapped as /ttyS0,/ttyS1. as you correctly stated. Generic USB Serial Ports as well as most G3 modems are accessible as /dev/ttyUSB0 through /dev/ttyUSB255

The better way to distinguish if a serial port 'connected' with a modem is to send ATIx commands to the serial port. These are Identity commands that you may use to detect the model name of the device and many other details.

First you try to send ATIx command not changing the baud rate. If you do not receive any valid response ( ASCII multi-line text followed by OK ERROR. then you may alter the baud rate and retry. It is better to first set the maximum supported by port speed and then decrease it until you find a modem or you end up with 110 baud or other reasonable limit.

There is a way to detect if most likely there is nothing connected to the serial port. The idea behind is to detect the frame error that persists during some reasonable time (tens times to receive a byte at selected baud rate), say 2-3sec. To see how enable/disable frame errors detection look at man termios . Howeever, I am not absolutely sure that in the setup you described this will be possible (from within VM), so you have to try.

Источник

How to find which serial port is in use?

The Question: I plugged in a device (i.e. GSM modem) through a serial port (a.k.a. RS-232), and I need to see with which file in /dev/ filesystem this device was tied up, to be able to communicate with it. Unfortunately there is no newly created file in /dev/ nor can be seen anything in dmesg output. So this seems to be a hard question. Background: I had never worked with a serial device, so yesterday, when there appeared a need, I tried to Google it but couldn't find anything helpful. I spent a few hours in seek, and I want to share a found answer as it could be helpful for someone.

I like using those bits to detect a device - I'll probably use that, although I've many devices that only use the Tx/Rx pins, I could probably hack them to hold the CTS line high for that.

2 Answers 2

Unfortunately serial ports are non-PlugNPlay, so kernel doesn't know which device was plugged in. After reading a HowTo tutorial I've got the working idea.

The /dev/ directory of unix like OSes contains files named as ttySn (with n being a number). Most of them doesn't correspond to existing devices. To find which ones do, issue a command:

$ dmesg | grep ttyS [ 0.872181] 00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A [ 0.892626] 00:07: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A [ 0.915797] 0000:01:01.0: ttyS4 at I/O 0x9800 (irq = 19) is a ST16650V2 [ 0.936942] 0000:01:01.1: ttyS5 at I/O 0x9c00 (irq = 18) is a ST16650V2 

Above is an example output of my PC. You can see the initialization of a few serial ports:

Читайте также:  What is linux 2015

ttyS0 , ttyS1 , ttyS4 , ttyS5 .

One of them is going to have a positive voltage upon a device plugged in. So by comparing the content of the file /proc/tty/driver/serial with and without the device plugged in we can easily find the ttyS related to our device. So, now do:

$ sudo cat /proc/tty/driver/serial> /tmp/1 
$ sudo cat /proc/tty/driver/serial> /tmp/2 

Next check the difference between the two files. Below is an output of my PC:

$ diff /tmp/1 /tmp/2 2c2 < 0: uart:16550A port:000003F8 irq:4 tx:6 rx:0 --- >0: uart:16550A port:000003F8 irq:4 tx:6 rx:0 CTS|DSR 

By comparing the three numbers with the dmesg output we can determine which one is the port:

[ 0.872181] 00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A

Hence, our device is /dev/ttyS0 , mission accomplished!

@user3019105 sorry, I've never faced such issue. From what I understand, dmesg should have a message about assigning irq to a serial device. And if it didn't, I'd assume some hardware problem. That's just an assumption, and might be wrong, but if I'd debug such a problem, I'd start research with the idea in mind that serial port should've been initialized.

Since I move from machine to machine I have defined an alias to show me the serial ports on this machine. It works on Ubuntu family systems with systemd. alias ports='udevadm info --export-db |grep -i "^n: ttyu"'

You can also use setserial to get and set serial port information, in addition to dmesg .

setserial

# install it sudo apt update sudo apt install setserial # Display (and sort) serial information for all /dev/ttyS* devices setserial -g /dev/ttyS* | sort -V # Display (and sort) serial information for all /dev/ttyUSB* devices setserial -g /dev/ttyUSB* | sort -V # To see extra info. such as the baud rate too, add `-G`: setserial -g -G /dev/ttyS* | sort -V setserial -g -G /dev/ttyUSB* | sort -V 

Sample run and output. Notice that /dev/ttyS4 is the only port that appears to be alive and not "unknown" (whatever that means). (This /dev/ttyS4 device also shows up in the Arduino IDE even though it's not an Arduino and I don't know what it is.):

$ setserial -g -G /dev/ttyS* | sort -V /dev/ttyS0 uart unknown port 0x03f8 irq 4 baud_base 115200 spd_normal skip_test /dev/ttyS1 uart unknown port 0x02f8 irq 3 baud_base 115200 spd_normal skip_test /dev/ttyS2 uart unknown port 0x03e8 irq 4 baud_base 115200 spd_normal skip_test /dev/ttyS3 uart unknown port 0x02e8 irq 3 baud_base 115200 spd_normal /dev/ttyS4 uart 16550A port 0x3060 irq 19 baud_base 115200 spd_normal skip_test /dev/ttyS5 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS6 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS7 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS8 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS9 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS10 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS11 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS12 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS13 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS14 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS15 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS16 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS17 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS18 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS19 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS20 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS21 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS22 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS23 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS24 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS25 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS26 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS27 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS28 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS29 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS30 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal /dev/ttyS31 uart unknown port 0x0000 irq 0 baud_base 0 spd_normal 

dmesg

Use dmesg to also see some of this information:

# Show UART information, incl. baudrate, for /dev/ttyS* devices. dmesg | grep ttyS # Show UART information, incl. baudrate, for /dev/ttyUSB* devices. dmesg | grep ttyUSB 
$ dmesg | grep ttyS [ 1.624447] 0000:00:16.3: ttyS4 at I/O 0x3060 (irq = 19, base_baud = 115200) is a 16550A 

Even better, watch the dmesg kernel ring buffer output live with the -w option:

Читайте также:  Текущий путь linux команда

Now, unplug your USB device you're trying to identify and plug it back in to see which device it is, based on the messages that show up in the dmesg output, live.

Источник

How do I know which serial port to use on Linux?

I'm going to be writing a program in C which is going to open a connection over serial port, and "listen" for incoming commands, then it will take some action and report back a status. The connection is going to be over RS232 (Serial port) and I'm trying to understand how to know which port to open. When using windows, if I hook up my usb-serial device I see "Prolific USB-to-Serial Comm Port (COM4)" show up in the device manager. but on the Linux side I don't see any changes in the /sys/class/tty or /dev area, I see ttyS0 through ttyS7 present all the time (I'm assuming the S stands for serial based on what I've read). So how do I know which one to connect to? EDIT
While I'm developing this on a OpenSUSE 12.1 box (3.1 kernel), the final program will be run on uCLinux on a board running a 2.4Linux kernel, so I'm looking for pure C solutions which will work on older kernels FYI: the /sys file system as noted in the answer to this post didn't exist until the 2.6 kernel and my constraints force me to stick to things available in the 2.4 kernel.

Chances are that your USB serial port adapter will show up as /dev/ttyUSB0 . Also check this question if you need a way to enumerate the serial ports.

@PhilippeGauthier - That would be very unfortunate considering I won't know if the user is going to use a usb->serial cable, or a straight serial cable. 🙁

@goldenparrot - The target platform for this program will most likely not have python support. (uCLinux)

@PhilippeGauthier - Checked out that link, it's a good idea, but using /sys file system which I need to stay away from. /sys didn't show up until 2.6 and since I need to keep compatibility in mind with our 2.4 system, I can't use that. Thanks though!

Источник

Оцените статью
Adblock
detector