
Ubuntu日本語フォーラム

ログインしていません。
いつもお世話になっております。
Ubuntu9.04およびgcc4.5.1で組み込み用のプログラム開発を行っております。
開発言語はC言語になります。
シリアル通信についてですが
たとえばCOMポート1の場合は/dev/ttyS0を介して
データの送受信をすることになると思います。
USBシリアル変換機にてUSBポートをシリアルポートに変換してシリアル通信を
行うときについて質問がございます。
実際にUSBシリアル変換機をUSBコネクタに挿すと
/dev/ttyUSB0や/dev/ttyUSB1といったデバイスファイルが現れます。
USBポートが4つあるとした場合
USBポート1に変換機を挿した時、USBポート1に対応するデバイスファイルは/dev/ttyUSB0である
ですとか
USBポート2に変換機を挿した時、USBポート2に対応するデバイスファイルは/dev/ttyUSB1である
とかの判断はどのようにすればよろしいのでしょうか?
実際に4つのUSBポートに変換機を抜き差ししたところ
挿した順番で/dev/ttyUSB0、/dev/ttyUSB1となっておりました。
USBポート2のみに挿した時でも/dev/ttyUSB0
その状態でUSBポート2から3に挿しなおした状態でも/dev/ttyUSB0
となっておりました。
たびたびの質問で恐縮ですが
何卒ご教授お願いいたします。
オフライン
USBポート1に挿した時は、常に /dev/ttyUSB0 に、USBポート2に挿した時は、常に/dev/ttyUSB1になるというので良いのであれば、udevのルールを書くことにより実現できるのではないでしょうか?
udevinfo -q path -n /dev/tttyUSB0 や lsusb などを実行してみて、udevルールを書くのに使えそうなものはないでしょうか?
オフライン
nimuさん、ご回答ありがとうございます。
ご教授いただいた「USBポート1に挿した時は、常に /dev/ttyUSB0 に、USBポート2に挿した時は、常に/dev/ttyUSB1になる」が
できるのでしたら大変ありがたく思います。
まだudevルールが何者なのかもわかっておりませんが、
どのようなudevルールを記述しないといけないのかを調査してみます。
早速udevルールというものを調査してみます。
#私も同様に播磨之国です。
オフライン
今更で大変恐縮ですが、udevルールについて調査いたしました。
$udevadm info -a -n /dev/ttyUSB0の実行結果ですが以下のようになりました。
少し長くなりますが記載します。
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/devices/pci0000:00/0000:00:1f.2/usb1/1-2/1-2:1.0/ttyUSB0/tty/ttyUSB0':
KERNEL=="ttyUSB0"
SUBSYSTEM=="tty"
DRIVER==""
looking at parent device '/devices/pci0000:00/0000:00:1f.2/usb1/1-2/1-2:1.0/ttyUSB0':
KERNELS=="ttyUSB0"
SUBSYSTEMS=="usb-serial"
DRIVERS=="pl2303"
ATTRS{port_number}=="0"
looking at parent device '/devices/pci0000:00/0000:00:1f.2/usb1/1-2/1-2:1.0':
KERNELS=="1-2:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="pl2303"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bNumEndpoints}=="03"
ATTRS{bInterfaceClass}=="ff"
ATTRS{bInterfaceSubClass}=="00"
ATTRS{bInterfaceProtocol}=="00"
ATTRS{modalias}=="usb:v067Bp2303d0300dc00dsc00dp00icFFisc00ip00"
ATTRS{supports_autosuspend}=="1"
looking at parent device '/devices/pci0000:00/0000:00:1f.2/usb1/1-2':
KERNELS=="1-2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bMaxPower}=="100mA"
ATTRS{urbnum}=="20"
ATTRS{idVendor}=="067b"
ATTRS{idProduct}=="2303"
ATTRS{bcdDevice}=="0300"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="12"
ATTRS{busnum}=="1"
ATTRS{devnum}=="9"
ATTRS{version}==" 1.10"
ATTRS{maxchild}=="0"
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Prolific Technology Inc."
ATTRS{product}=="USB-Serial Controller"
looking at parent device '/devices/pci0000:00/0000:00:1f.2/usb1':
KERNELS=="usb1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bMaxPower}==" 0mA"
ATTRS{urbnum}=="169"
ATTRS{idVendor}=="1d6b"
ATTRS{idProduct}=="0001"
ATTRS{bcdDevice}=="0206"
ATTRS{bDeviceClass}=="09"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="12"
ATTRS{busnum}=="1"
ATTRS{devnum}=="1"
ATTRS{version}==" 1.10"
ATTRS{maxchild}=="2"
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Linux 2.6.28-19-generic uhci_hcd"
ATTRS{product}=="UHCI Host Controller"
ATTRS{serial}=="0000:00:1f.2"
ATTRS{authorized_default}=="1"
looking at parent device '/devices/pci0000:00/0000:00:1f.2':
KERNELS=="0000:00:1f.2"
SUBSYSTEMS=="pci"
DRIVERS=="uhci_hcd"
ATTRS{vendor}=="0x8086"
ATTRS{device}=="0x2442"
ATTRS{subsystem_vendor}=="0x0e11"
ATTRS{subsystem_device}=="0x2411"
ATTRS{class}=="0x0c0300"
ATTRS{irq}=="19"
ATTRS{local_cpus}=="ffffffff,ffffffff"
ATTRS{local_cpulist}=="0-63"
ATTRS{modalias}=="pci:v00008086d00002442sv00000E11sd00002411bc0Csc03i00"
ATTRS{broken_parity_status}=="0"
ATTRS{msi_bus}==""
looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""
なお、lsusbの結果は以下の通りです。
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 009: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
現在漠然とですが理解しているところは
上記の結果から、以下の特徴を見つけてudevルールを追加するという流れだと思っておりますが問題ないでしょうか?
・USBポート1にさされている・・・「ATTRS{busnum}=="1"」、「ATTRS{devnum}=="9"」あたり?
・USBシリアル変換器である・・・「SUBSYSTEMS=="usb-serial"」、「SUBSYSTEM=="tty"」あたり? 「SUBSYSTEM」が2つありますがどちらで判断するべきかもわかっておりません。
udevルールの判断条件および記述方法などアドバイスやご指摘などございましたら何卒ご教授お願いいたします。
オフライン
いつもお世話になっております。
fatcatです。
ご提示いただいたヒント(ご回答)を元に自己解決いたしました。ありがとうございます。
udevルールにルールを追加し、USB物理ポートごとにそれぞれシンボリックリンクを作成する方法を採りました。
以下に解決方法を記載いたします。
/etc/udev/rules.d/に90-fatcat-usb.rulesを作成し、以下のコードを記述しました。
SUBSYSTEM=="tty",KERNELS=="2-1",SUBSYSTEMS=="usb",SYMLINK+="fatcatttyUSB1"
SUBSYSTEM=="tty",KERNELS=="2-2",SUBSYSTEMS=="usb",SYMLINK+="fatcatttyUSB2"
SUBSYSTEM=="tty",KERNELS=="3-1",SUBSYSTEMS=="usb",SYMLINK+="fatcatttyUSB3"
SUBSYSTEM=="tty",KERNELS=="3-2",SUBSYSTEMS=="usb",SYMLINK+="fatcatttyUSB4"
USB-SERIALデバイスかどうかはSUBSYSTEM=="tty"とSUBSYSTEMS=="usb"で判定しております。
物理ポートの場所はKERNELS=="N-n"(Nおよびnは物理ポート番号)で判定しております。
その場合、/dev/以下にfatcatttyUSB?というシンボリックリンクを作成しております。
以上です。
オフライン