[解決済み] Linuxですべてのシリアルデバイス(ttyS, ttyUSB, ...)を開かずに見つけるには?
質問
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/
関連
-
LinuxでSteamをダウンロードしインストールする方法
-
Linux 5.10.10 正式版リリース:NULLポインタの不具合修正など。
-
deepin20ターミナルでサーバーをリモート管理する方法
-
apache startup error (98) Address already in use: make_sock: could not bind to...
-
[解決済み] ディレクトリInodeと通常ファイルInodeの比較
-
[解決済み] Linuxで特定のテキストを含むすべてのファイルを検索するにはどうすればよいですか?
-
[解決済み] ワイルドカードマッチングに基づいて、現在のフォルダとサブフォルダ内のすべてのファイルを再帰的に検索するにはどうすればよいですか?
-
[解決済み] ls を使用してディレクトリとその合計サイズを一覧表示する
-
[解決済み] 特定のファイル/フォルダを除外してディレクトリをtarするシェルコマンド
-
[解決済み] C言語でシリアルポートを開き、読み取り、書き込みを行うには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Manjaro linuxでマウスの速度を設定する方法は?Manjaroのマウスのカーソル速度を設定する方法に関するヒント
-
deepinシステムのバージョン番号を見るには?deepinシステムのバージョン情報を見るコツ
-
中国版「浮世」を含むUbuntu 20.04.2リリース
-
Kali Linuxのデスクトップの外観スタイルを変更するには? KALIの外観の最適化のヒント
-
エラーの解決方法 お客様のバージョンは /bin/bash: java: コマンドが見つかりませんでした。
-
Process.waitFor()の戻り値の意味するところ
-
[解決済み] WindowsからLinuxへのscpにputtyを使用する
-
[解決済み] 標準エラー出力を /dev/null にリダイレクトする。
-
[解決済み] Linuxでファイルをシンボリックリンクするには?[クローズド]
-
[解決済み] LinuxのシェルスクリプトでYes/No/Cancelの入力を促すにはどうしたらいいですか?