シリアルインタフェースとsysfs。各シリアルポートの一意の識別子を取得する方法

シリアルインタフェースとsysfs。各シリアルポートの一意の識別子を取得する方法

Linuxシステムのシリアルポートを列挙し、一意で信頼性の高い(再起動時に)識別子を取得したいと思います。信頼性は、シリアルUSBデバイス(同じUSBポート)を接続して取り出すときに同じ識別子を取得したいという意味です。さらに、システムを再起動するときは、同じシリアルポートに同じ識別子が必要です。これはデバイスに拘束されるべきではないので、接続するすべてのデバイスに特定のudevルールを設定する必要はありません。一般的な方法で動作する必要があります。

最初はカーネルdevpathをこのような用途に使えると思っていましたが、それは簡単ではありません(下記参照)。

利用可能なシリアルインタフェースのdevpathを一覧表示するには

realpath /sys/class/tty/*/device

私のシステムではこれが生成されます。

/sys/devices/pnp0/00:02
/sys/devices/pnp0/00:03
/sys/devices/platform/serial8250
/sys/devices/platform/serial8250

(もちろん「serial8250」の項目は本当ではないかもしれませんしかし、ここではそれは問題ではありません)

重複した項目があることがわかります。これは、カーネル devpath が実際のシリアルポートの一意の識別子ではないことを意味します。

その場合、問題はシリアルポートの一意で信頼性の高い(再起動時に)識別子を取得する方法です。

一方、tty/「line」エントリを含む実際のポート情報を含むように見えるエントリのリストでエントリを探します。

/sys/devices/pnp0/00:02/tty/ttyS0/line
/sys/devices/pnp0/00:03/tty/ttyS1/line
/sys/devices/platform/serial8250/tty/ttyS2/line
/sys/devices/platform/serial8250/tty/ttyS3/line

番号が含まれています。 (この場合は0〜4)

これの意味は何ですか/<devpath>/tty/<id>/line?どんな数字?問題は、USBシリアルポートに「ライン」エントリがないことです。

また、以下の項目は/<devpath>/tty/互いに依存しているように見えるため、いくつかのグローバル番号が関連しています。そのため、複数のシリアルUSBデバイスを接続するとどうなるかわかりません。挿入された順序によって異なる名前を受け取りますか、それともすべて1<devpath1>/tty/ttyUSB0つの名前を持ちますか?前者の場合は、番号が挿入された順番によって番号が変わるので(または再起動時にランダムに指定されるので)良くありません。<devpath2>/tty/ttyUSB1<devpath>/tty/ttyUSB0

関連情報