一貫性のあるLinuxデバイスの列挙


13

LinuxボックスにはUSB->シリアルデバイスがあり、常にとして識別され /dev/ttyACM0ます。それで、私はアプリケーションを書きました、そして、昨日まで、すべてはうまく働きました。しかし、突然(そう、リモートプレゼンテーション中に...)デバイスの動作が停止しました。簡単な調査の結果、接続がに変わったことがわかりました/dev/ttyACM1。それは少し時期尚早でしたが、今私は問題を抱えています-私のデバイスを明確に識別する方法は?たとえば、ストレージドライブはUUIDを使用して初期化できますが、/dev/sd**変更されています。シリアルデバイスでそれを行う方法はありますか?

今、私は愚かな回避策を使用します:

for(int i = 0; i < 10; i ++)
{
    m_port = std::string("/dev/ttyACM") + (char)('0' + i);
    m_fd = open(m_port.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
}

使用するデバイスへのリンク

回答:


19

私たちはUSBデバイスについて話しているので、udevがあると仮定しているので、いくつかのudevルールを設定できます。

私は推測しますが、これは単なる推測であり、誰かまたは何かがデバイスのプラグを抜いて/取り外し、デバイスを再びプラグイン/追加して、数を増やします。

さて、最初にベンダーと製品IDが必要です:

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 011: ID 0403:6001 FTDI FT232 USB-Serial (UART) IC

次に、シリアル番号が必要です(複数ある場合):

# udevadm info -a -n /dev/ttyUSB1 | grep '{serial}' | head -n1
    ATTRS{serial}=="A6008isP"

次に、udevルールを作成します。

UDEVルールは通常、の多くのファイルに散在しています/etc/udev/rules.d。という新しいファイルを作成し、99-usb-serial.rulesそこに次の行を追加します。3つのデバイスがあり、それぞれが異なるシリアル番号を持っています。

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A6008isP", SYMLINK+="MySerialDevice"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A7004IXj", SYMLINK+="MyOtherSerialDevice"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTDIF46B", SYMLINK+="YetAnotherSerialDevice"

ls -l /dev/MySerialDevice
lrwxrwxrwx 1 root root 7 Nov 25 22:12 /dev/MySerialDevice -> ttyUSB1

シリアル番号が必要ない場合、同じチップを持つベンダーのデバイスは同じシンボリックリンクを取得します。一度に接続できるのは1つだけです。

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="MySerialDevice"

ここから撮影


3
最新のLinuxディストリビューションを使用している場合、ほとんどの場合、デバイスはとして自動的に作成され/dev/serial/by-id/usb-XXXX_USB2.0-Serial-if00-port0ます。カスタムudevルールがなければ、これで十分かもしれません。
ジョセフは、モニカを復活させる

1
残念ながら、多くの名前のないデバイスはすべてシリアル番号「0123456789abcdef」を持っています。それが面白いところです。
mosvy

@mosvyシリアル番号は変更できませんか?
OganM

@OganMは、デバイスをルート化できる場合は変更される可能性があります。
モスビー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.