1. ホーム
  2. linux

[解決済み] Linuxですべてのシリアルデバイス(ttyS, ttyUSB, ...)を開かずに見つけるには?

2022-09-05 15:10:28

質問

Linux システムで利用可能なすべてのシリアルポート/デバイスのリストを取得する適切な方法は何ですか?

言い換えれば、私が /dev/ にあるすべてのデバイスを順に並べたとき、どれが古典的な方法でシリアルポートなのか、つまり、通常ボーレートと RTS/CTS フロー制御をサポートしているものです。

解決策はC言語でコーディングされるでしょう。

私が質問するのは、これを明らかに間違って行うサードパーティのライブラリを使用しているためです。 /dev/ttyS* . 問題は、たとえば、USB 上のシリアルポート (USB-RS232 アダプタによって提供される) があり、それらは /dev/ttyUSB* の下にリストされていることです。そして Linux.org の Serial-HOWTO を読むと、時が来れば他の名前空間も存在するのだろうということがわかります。

そこで、シリアル デバイスを検出するための公式の方法を見つける必要があります。問題は、どれも文書化されていない、あるいは、見つけられないということです。

私は、1 つの方法として、すべてのファイルを /dev/tty* からすべてのファイルを開き、特定の ioctl() を呼び出すことができます。それは良い解決策になるでしょうか?

アップデート

ヒッカーズ のソースを見るよう提案されました。 そのコードは私が考えていたこととまったく同じことをします。

最初に、それはデバイスを開きます。

fd = open (path, O_RDWR | O_NONBLOCK)

そして、起動します。

ioctl (fd, TIOCGSERIAL, &serinfo)

その呼び出しがエラーを返さないなら、それはシリアルデバイスらしい。

で似たようなコードを見つけたのですが シリアルプログラミング/用語集 を追加することを提案しました。 O_NOCTTY オプションの追加を提案しました。

しかし、この方法には一つ問題があります。

このコードをBSD Unix (つまりMac OS X)でテストしたところ、同様に動きました。 しかし , Bluetoothで提供されているシリアルデバイスは、システム(ドライバ)がBluetoothデバイスに接続しようとするため、タイムアウトエラーで戻ってくるまでに時間がかかる。これは、デバイスを開いただけで発生するものです。Linuxでも同じようなことが起きると想像できます。理想を言えば、デバイスの種類を把握するために、デバイスを開く必要はないはずなんです。理想を言えば、デバイスのタイプを知るためにデバイスを開く必要はないはずなのですが。 ioctl 関数を呼び出したり、接続を行わない方法でデバイスを開いたりする方法もあるのでしょうか?

どうすればよいでしょうか?

どのように解決するのですか?

この /sys ファイルシステムには、あなたの探求のための十分な情報が含まれているはずです。私のシステム (2.6.32-40-generic #87-Ubuntu) は示唆しています。

/sys/class/tty

これは、システムで知られているすべてのTTYデバイスの説明を与えます。切り詰めた例です。

# ll /sys/class/tty/ttyUSB*
lrwxrwxrwx 1 root root 0 2012-03-28 20:43 /sys/class/tty/ttyUSB0 -> ../../devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.4/2-1.4:1.0/ttyUSB0/tty/ttyUSB0/
lrwxrwxrwx 1 root root 0 2012-03-28 20:44 /sys/class/tty/ttyUSB1 -> ../../devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/ttyUSB1/tty/ttyUSB1/

これらのリンクのいずれかをたどる。

# ll /sys/class/tty/ttyUSB0/
insgesamt 0
drwxr-xr-x 3 root root    0 2012-03-28 20:43 ./
drwxr-xr-x 3 root root    0 2012-03-28 20:43 ../
-r--r--r-- 1 root root 4096 2012-03-28 20:49 dev
lrwxrwxrwx 1 root root    0 2012-03-28 20:43 device -> ../../../ttyUSB0/
drwxr-xr-x 2 root root    0 2012-03-28 20:49 power/
lrwxrwxrwx 1 root root    0 2012-03-28 20:43 subsystem -> ../../../../../../../../../../class/tty/
-rw-r--r-- 1 root root 4096 2012-03-28 20:43 uevent

ここでは dev ファイルにはこの情報が含まれています。

# cat /sys/class/tty/ttyUSB0/dev
188:0

これはメジャー/マイナーノードです。これらを検索するには /dev ディレクトリで検索して、ユーザーフレンドリーな名前を得ることができます。

# ll -R /dev |grep "188, *0"
crw-rw----   1 root dialout 188,   0 2012-03-28 20:44 ttyUSB0

/sys/class/tty ディレクトリにはすべての TTY デバイスが含まれていますが、厄介な仮想端末や疑似端末は除外したいかもしれません。私は device/driver のエントリがあるものだけを調べることをお勧めします。

# ll /sys/class/tty/*/device/driver
lrwxrwxrwx 1 root root 0 2012-03-28 19:07 /sys/class/tty/ttyS0/device/driver -> ../../../bus/pnp/drivers/serial/
lrwxrwxrwx 1 root root 0 2012-03-28 19:07 /sys/class/tty/ttyS1/device/driver -> ../../../bus/pnp/drivers/serial/
lrwxrwxrwx 1 root root 0 2012-03-28 19:07 /sys/class/tty/ttyS2/device/driver -> ../../../bus/platform/drivers/serial8250/
lrwxrwxrwx 1 root root 0 2012-03-28 19:07 /sys/class/tty/ttyS3/device/driver -> ../../../bus/platform/drivers/serial8250/
lrwxrwxrwx 1 root root 0 2012-03-28 20:43 /sys/class/tty/ttyUSB0/device/driver -> ../../../../../../../../bus/usb-serial/drivers/ftdi_sio/
lrwxrwxrwx 1 root root 0 2012-03-28 21:15 /sys/class/tty/ttyUSB1/device/driver -> ../../../../../../../../bus/usb-serial/drivers/ftdi_sio/