私はRaspianを実行しているRaspberry Piを使用して、いくつかのホームオートメーションハードウェアを制御しています。ハードウェアの1つはRS232を介して通信するため、USB-RS232アダプタを使用してRPiに接続します。もう一つはUSB経由で接続されますが、シリアルポートをエミュレートします。
ハードウェアを1つだけ使用すると、すべてが大丈夫です。ソフトウェアにハードウェアを使用するように指示すると、/dev/ttyUSB0
すべてが問題ありません。
問題は、2つを同時に接続するときです。 1つのデバイスはとマークされ、もう1つのデバイスttyUSB0
はと表示されます。ttyUSB1
これは問題ありませんが、RPiからプラグを抜いていないにもかかわらず、再起動するたびにどのハードウェアデバイスがどのデバイスファイルに割り当てられるかは基本的にランダムです。
再起動後、制御ソフトウェアが誤ったデバイスと通信していて混乱することがよくあります。デバイスをデバイスファイルに「ハードコード」する方法はありますか?
答え1
シリアルデバイスの場合は、Topologyの下でトポロジごとに名前付きデバイスを見つける必要があるため、/dev/serial/by-path/
同じUSBハブとポートを使用する場合は同じままにする必要があります。たとえば、
ls -l /dev/serial/by-path/pci-0000:04:00.0-usb-0:2.1.1:1.0-port0
... /dev/serial/by-path/pci-0000:04:00.0-usb-0:2.1.1:1.0-port0 -> ../../ttyUSB0
/dev/serial/by-id/
同様に、次のように名前(シリアル番号を含む)でデバイスを見つける必要があります。
ls -l /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A5771WOA-if00-port0
... /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A5771WOA-if00-port0 -> ../../ttyUSB0
答え2
これにはudevルールを使用できます。 udevルールはUSBデバイスをシリアル番号に一致させます/dev
。
/dev
このようなudevルールは、実際のデバイスノードへのシンボリックリンクを作成するのに十分です。
SUBSYSTEM=="usb", ATTRS{serial}=="<serial number>", SYMLINK+="USBserial1"
バラよりudevルールの作成ダニエルドレイクの詳細。