0

3 つの USB シリアル コンバーター (FTDI USB-RS232) に 3 つの異なるシリアル デバイスを接続しています。それらを接続すると、期待どおりに一般的なデバイス名 /dev/ttyUSBx が取得されます。いくつかの udev ルールを記述しようとすると、udevadm は、一部のデバイス シリアル ID 属性を除いて、3 つのデバイスに対して同じ出力を表示します。

これらのシリアル ID はすべてのデバイスで変更されるため、別の USB シリアル コンバーターを使用すると、ルールが機能しなくなります。そのため、シリアル コンバーターに接続されている特定のデバイスと通信し、その応答によってデバイスを識別する方法が必要です。

"Writing udev rules" HOWTOでは、PROGRAM 機能を使用して外部プログラムを呼び出してデバイスに名前を付ける方法について次のように述べています。

PROGRAM は、デバイス名を生成するプログラムを実行するために使用されます (それ以外のことはすべきではありません)。それらのプログラムが実行されているとき、デバイスノードはまだ作成されていないため、デバイスに対して何らかの操作を行うことはできません。

ルールの例: SUBSYSTEM=="usb", PROGRAM="/bin/device_namer %k", SYMLINK+="%c"

そのため、デバイスを識別するためにそこから /dev/ttyUSBx に書き込むことはできません。次に、RUN機能がありますが、udevがRUNの出力を取得しないため、新しいSYMLINKを作成できないようです。

ルールの例: SUBSYSTEM=="usb", RUN="/bin/program"

その RUN スクリプトから udev にシンボリック リンクを作成するように指示できますか? または、そこから手動でそのシンボリックリンクを作成できますか?

ありがとう

4

2 に答える 2

1

シリアル ポートがコンピュータに接続された瞬間に自動的に盲目的にチャットするのは、非常に恐ろしいことです。これを実行してもよろしいですか?udev がデバイスノードを作成する前に結果を待たなければならない場合、デバイスノードの表示が遅れます。デバイスの電源が切られたり、シリアル ポートが切断されたりした場合、適切な名前を付けることができません (これを検出するにはタイムアウトが必要です)。最後に、予期したデバイス以外の別のデバイスが接続されている場合、意図しない結果をもたらすゴミを送信している可能性があります。

アダプターのシリアル番号に頼ってそれらを区別し、各アダプターを一貫した方法で外部デバイスに関連付けることを検討してください。アダプタに 00000000 のようなプレースホルダ文字列の代わりに実際のシリアル番号さえあれば、あなたはすでに幸運です!

それにもかかわらず、これはあなたがそれを行う方法です。

RUNご想像のとおり、デバイス ノードは既に作成されているため、使用できません。を使用する必要がありますPROGRAMmknodプログラムでは、udev がまだ作成していないため、自分でデバイス ノードを作成する必要があります。一時的な場所に一時的なノードを作成し、プログラムが終了する前に破棄する必要があります。

### Create the temporary device node in /tmp
device="/tmp/udev_device_guesser.$$"
# Note: mknod does not appear to be vulnerable to a symlink attack
mknod "$device" c "$MAJOR" "$MINOR"

### Use this device node to query what's attached to the serial port
insert your code here

### Get rid of the temporary node
rm -f "$device"
exit 0
于 2011-12-28T06:50:02.043 に答える
1

PROGRAMドキュメントに記載されているにもかかわらず、を使用して、デバイスの応答に基づいてデバイスのシンボリックリンクを作成することは実際には可能です。デバイス名ではなく、シンボリックリンク専用であること。

AFTER yours に一致し、SYMLINK, を指定するすべてのルールは、次のようにする必要があることに注意してください。

SYMLINK+=

そのため、SIMLINK 仕様は新しい仕様と連結されます。それ以外の場合、シンボリックリンクは消去されます。

で何が起こっているかを知る最善の方法udevは、ログ レベルを debug に設定することです。

sudo udevadm control --log-priority=debug

これらのログは、ディストリビューションに応じて/var/log/messagesまたはにあります。/var/log/syslog

于 2012-07-27T12:46:17.787 に答える