Linux check serial port

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.

Источник

How to list all serial ports on Linux

Feature image for the article about how to list all serial ports on Linux

Linux comes with serial communication functionality built-in. Before you can communicate with a device, connected to your PC’s serial port, you just need to know the name of the serial port. On Windows it is typically COM1 , COM2 , etc. On Linux it is essentially a filename in the format of /dev/ttyS0 , /dev/ttyUSB0 or /dev/ttyACM0 . This article explains how to list all serial ports on a Linux based system.

Background

Especially when developing software for or interacting with microcontroller based systems, you often communicate using RS232 serial communication. Typically by means of an RS232-to-USB adapter. To communicate with an RS232 device, you need to know the name of the PC’s serial port to connect to. On Windows, you open up the device manager and look up the COM-port number. Listing the available serial ports on Linux is a bit different and desktop environments do not offer a graphical user interface to quickly identify the available serial ports. This article presents two methods for listing the serial ports on Linux. One with the help of a graphical user interface program and another one for working directly in the terminal.

Читайте также:  Astra linux перестал загружаться

What do you need

To complete the steps to list the available serial ports on Linux, you just need two things:

  • A Linux based PC. It can be a desktop, server, virtual machine or a single board computer such as a Raspberry PI.
  • A serial device connected to the PC. For example an RS232-to-USB adapter, an Arduino or a Raspberry Pico.

For this article I’ll be using my main openSUSE Tumbleweed system. It’s a Lenovo ThinkCentre with one actual physical serial port. Additionally, I connected two serial devices: An RS232-to-USB adapter and an Arduino Uno.

Listing the serial ports using a Linux GUI application

Unfortunately, Linux desktop environments do not offer a GUI program to quickly and conveniently show all the available serial ports. However we can simply install one that does. Chances are you want a GUI program for monitoring the serial port in Linux anyway. My recommendation: CuteCom. Installation instructions for CuteCom on popular Linux distributions:

  • Debian and Ubuntu: sudo apt install cutecom
  • Fedora: sudo dnf install cutecom
  • openSUSE: sudo zypper install cutecom

Once installed, open up the CuteCom program. It shows a Device drop-down list on the top of the main window. And voilà, it lists all serial ports on your Linux system:

CuteCom screenshot highlighting how you can use it to list the Linux serial port devices.

As you can see in the screenshot, CuteCom lists all three serial ports currently connected to my Linux system:

  • /dev/ttyS0 → The physical serial port on my PC.
  • /dev/ttyUSB0 → The RS232-to-USB adapter.
  • /dev/ttyACM0 → The Arduino Uno board connected via USB cable.

Listing the serial ports using the Linux terminal

The past section showed that Linux assigns a file name to serial devices with the acronym TTY in it. TTY stands for teletypewriter. With these historical devices you could send typed text messages to a remote location, using serial communication. Eventually leading to the invention of the fax machine. Hardly anyone still uses these devices. Nevertheless, the term TTY stuck around.

When it comes to using the terminal to list the serial ports, I prefer the approach that looks for TTY devices that the Linux kernel detected. Basically those that it found and managed to assign a driver to. The following command lists all of these:

Terminal screenshot that show you how to list all serial devices detected by the Linux kernel.

  • ls -l /sys/class/tty/*/device/driver

That’s a long list. I expected just three devices. The command output includes all so-called virtual and pseudo terminals. We just want to list the actual hardware serial ports. We can filter out the ones we don’t want by removing all lines that contain platform/drivers/serial8250 . The command then becomes:

Terminal screenshot that shows you how to list all serial devices detected by the Linux kernel, exluding the virtual and pseudo terminals.

  • ls -l /sys/class/tty/*/device/driver | grep -v «platform/drivers/serial8250»

Alright, that looks a lot better. The output lists the three TTY devices that I expected: ttyACM0 , ttyS0 and ttyUSB0 . Ideally, the output shows just the actual device filename, needed to connect to the serial port. With a little akw magic, we can clean the output up for this:

Final terminal output of listing the serial port devices on Linux. This time it outputs the correct device names, needed to connect to the serial port device.

  • ls -l /sys/class/tty/*/device/driver | grep -v «platform/drivers/serial8250″ | awk » | awk -F’/’ »

Bash alias for listing the serial ports

I enjoy making one-liners for the terminal to get stuff done. However, the length of this one is such that I will never remember it. And I bet that’s the thought that crossed your mind too. Two options to solve this:

  1. Bookmark this page in your web browser and visit it whenever you need to list the serial ports from the terminal.
  2. Create a Bash alias.
Читайте также:  Using cmake on linux

With a Bash alias you essentially add a new command to your user’s shell with a name of your choice. Aliases are stored in the .bashrc file inside your home directory. You can edit it with whatever text editor you prefer. I’ll just use good old Nano:

Once in the text editor, add the following line. Note that escape characters were added where needed, to make it work. That’s before every double-quote and dollar sign:

Editing .bashrc to add the

  • alias lsserial=»ls -l /sys/class/tty/*/device/driver | grep -v \»platform/drivers/serial8250\» | awk » | awk -F’/’ »»

Once done, save your .bashrc file and type this command to reload it:

Alternatively, you can just close and reopen your terminal program.

From now on you can list the available serial ports on your Linux PC, by simply typing this command in the terminal:

Terminal screenshot showing the output of the newly added

  • lsserial

Wrap up

This article presented you with two different methods for listing the available serial ports on your Linux PC.

  1. Using the CuteCom GUI application.
  2. Piping several commands together for a terminal one-liner.

Going with method two, this article explained how you can add a Bash alias for the constructed terminal one-liner. Afterwards you can list the serial devices by simply typing the lsserial command in the terminal.

If you work with serial ports in Linux, you might be interested in one of the other serial port related articles:

Источник

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.

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.

Читайте также:  Oracle linux package manager

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 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