Raspianを実行しているRaspberryPiを使用して、ホームオートメーションハードウェアを制御しています。 1つのハードウェアがRS232を介して通信するため、USB-RS232アダプターを使用してRPiに接続します。もう1つはUSB経由で接続しますが、シリアルポートをエミュレートします。
ハードウェアを1つだけ使用している場合は、すべて問題ありません。ソフトウェアに/dev/ttyUSB0
を使用するように指示するだけで、すべて問題ありません。
問題は、両方を同時に接続する場合です。 1つのデバイスはttyUSB0
として表示され、もう1つはttyUSB1
として表示されます。これは問題ありませんが、RPiからプラグを抜かなくても、再起動するたびに、どのハードウェアデバイスがどのデバイスファイルに割り当てられるかは基本的にランダムです。
再起動後、間違ったデバイスと通信しているために制御ソフトウェアが混乱することがよくあります。デバイスをデバイスファイルに「ハードコーディング」する方法はありますか?
シリアルデバイスの場合、トポロジによって/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
これにはudevルールを使用できます。 udevルールはシリアル番号でUSBデバイスと一致させることができ、/dev
でデバイスの代替名を作成できます。
/dev
に実際のデバイスノードを指すシンボリックリンクを作成するには、次のようなudevルールで十分です。
SUBSYSTEM=="usb", ATTRS{serial}=="<serial number>", SYMLINK+="USBserial1"
詳細については、Daniel Drakeによる devルールの記述 を参照してください。