私たちのLinuxボックスには常に
/dev/ttyACM0
。しかし、突然(たとえば、リモートプレゼンテーション中...)デバイスが動作を停止しました。迅速に調査した結果、接続がに変更されたことがわかりました/dev/ttyACM1
。これは少し奇妙ですが、今問題が発生しました。自分のデバイスを明確に識別するにはどうすればよいですか?たとえば、UUIDが/dev/sd**
変更された場合でも、UUIDを使用してストレージドライブを初期化できます。シリアルデバイスに対してこれを行う方法はありますか?
今私は愚かな解決策を使用します。
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);
}
これ協会私たちが使用する機器に。
答え1
私たちは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"
答え2
UDEVルールは良い考えですが、多くのデバイスにシリアルがないか、同じシリアルがあり、ttyACM0からttyACM1までの問題は解決されません。
努力する
systemctl stop ModemManager systemctlの無効化 ModemManager
PS私は魔術師ではありません。ただ学んでいます。しかし、友情は私たちが真の奇跡を作るのに役立ちます。