Statserialを使用してPL2303 USB2RS232コンバーターの単一のステータス行(txd、dtr、...)を読み取りたい。 PL2303をすでにttyUSB0ポートに接続しました。ただし、データを読み取るには、ttyS *を受け入れるコマンドstatserialが必要です(ttyUSB *で使用しようとすると、 "permission denied" apperars)。 ttyUSB *をttyS *の「アドレス」に変更するにはどうすればよいですか?
lsusb:
gernot@gernot-Lenovo-G505s:~$ lsusb
Bus 002 Device 002: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 004: ID 174f:147b Syntek
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 004: ID 0cf3:3004 Atheros Communications, Inc.
Bus 003 Device 002: ID 062a:4101 Creative Labs
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 002: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
dmesg:
...
[ 53.186869] ISO 9660 Extensions: Microsoft Joliet Level 3
[ 54.986337] ISOFS: changing to secondary root
[ 76.485704] usb 5-1: new full-speed USB device number 2 using xhci_hcd
[ 76.522777] usb 5-1: New USB device found, idVendor=067b, idProduct=2303
[ 76.522786] usb 5-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 76.522791] usb 5-1: Product: USB-Serial Controller
[ 76.522795] usb 5-1: Manufacturer: Prolific Technology Inc.
[ 76.557641] usbcore: registered new interface driver usbserial
[ 76.557658] usbcore: registered new interface driver usbserial_generic
[ 76.557668] usbserial: USB Serial support registered for generic
[ 76.559702] usbcore: registered new interface driver pl2303
[ 76.559719] usbserial: USB Serial support registered for pl2303
[ 76.560192] pl2303 5-1:1.0: pl2303 converter detected
[ 76.588044] usb 5-1: pl2303 converter now attached to ttyUSB0
...
助けてくれてありがとう!
更新:私はダイヤルアウトグループのメンバーではなかったようです。 Sudo usermod -a -G dialout <username>
を使用してユーザーをそのグループに追加しました
その後、USBポートとシリアルポートにアクセスする許可を得ました。現在、moserialのような端末プログラムが機能します。ただし、statserial
を使用してステータス行にアクセスすることはできません。代わりに、私はそのメッセージを受け取ります:
gernot@gernot-Lenovo-G505s:~$ statserial ttyUSB0
statserial: can't open device `ttyUSB0': No such file or directory
更新2:statserialを動作させることができました(このスレッドの意味は崩れます):最初にポートをリセットしてから、標準ポートの数よりも大きいttyS *ポートへのハードリンクを確立する必要があります次のとおりです。
Sudo rm /dev/ttyS40
Sudo ln /dev/ttyUSB0 /dev/ttyS40
しかし、端末に表示されたデータを、自分で作成したコードで読み取ることができるオブジェクトにコピーするにはどうすればよいですか?また、変更されたステイタスラインに対するstatserial-toolの反応が遅いのはなぜですか?
ユーザーを正しいグループに追加することで、最初の問題(デバイスのアクセス許可)が修正されました。
2番目の問題(デバイスパス)は、完全なデバイスパスを使用していないようです。 man statserial
から:
オプションのdevice-nameパラメータは、問題のシリアルポートのデバイスファイルの完全な名前です。指定されていない場合、デフォルトは環境変数MODEMから取得され、設定されていない場合は/ dev/cua1から取得されます。
だからあなたはstatserial /dev/ttyUSB0
をする必要があります
(ソースが正しいことを確認するためにソースをチェックしました。文字通りfd = open(device,...)
を行います。ここで、deviceはargv [x]です)
シリアルポートのプログラミングに関する一般的な情報については、 Serial Programming HOWTO を参照してください。 apt-get source statserial
でstatserialのソースを見ることができます(これは、195行の単一ファイルstatserial.c
からコンパイルされた非常に単純なプログラムです)。
Statserialは毎秒シリアルポートのみをポーリングするため、更新は遅くなります。メインループは次のとおりです。
for (;;) {
/* get modem status info */
status = ioctl(fd, TIOCMGET, &arg);
if (status != 0) {
perror("statserial: TIOCMGET failed");
exit(1);
}
...
printw("Device: %s\n\n", device);
printw("Signal Pin Pin Direction Status Full\n");
printw("Name (25) (9) (computer) Name\n");
printw("----- --- --- --------- ------ -----\n");
printw("FG 1 - - - Frame Ground\n");
printw("TxD 2 3 out - Transmit Data\n");
printw("RxD 3 2 in - Receive Data\n");
printw("RTS 4 7 out %1d Request To Send\n", !!(arg & TIOCM_RTS));
printw("CTS 5 8 in %1d Clear To Send\n", !!(arg & TIOCM_CTS));
printw("DSR 6 6 in %1d Data Set Ready\n", !!(arg & TIOCM_DSR));
printw("GND 7 5 - - Signal Ground\n");
printw("DCD 8 1 in %1d Data Carrier Detect\n", !!(arg & TIOCM_CAR));
printw("DTR 20 4 out %1d Data Terminal Ready\n", !!(arg & TIOCM_DTR));
printw("RI 22 9 in %1d Ring Indicator\n", !!(arg & TIOCM_RNG));
refresh();
/* break out if -n option was used */
if (n_option)
exit(0);
/* delay 1 second between loops */
sleep(1);
}
シリアルポートで深刻な作業をしている場合、実際のシリアルポートカード(RS232コントローラを搭載したPCIカード)を入手することを強くお勧めします。特に古いハードウェアにリンクしている場合は、USBアダプターの信頼性が十分ではないため、信号のタイミングが正確に再現されず、一部のデバイスで問題が発生することがあります。もう1つの一般的な問題は、USBシリアルポートがハードウェアRTS/CTSハンドシェイクを実装していない(または不適切に実装している)ため、古いシリアルポートデバイスと互換性がなくなることです。そうは言っても、PL2303は優れたチップの1つであり、ほとんどのデバイスで動作するはずです。
statserial
については知りません(これは古い質問です)が、カスタムデバイス名が必要な場合は、/etc/udev/rules.d/
にファイルをドロップできます(私の場合は98-devicename.rules
)という名前:
SUBSYSTEM=="tty" ATTRS{idVendor}=="067b" ATTRS{idProduct}=="2303" SYMLINK+="devicename%n" MODE:="0666"
これはUSB ID /ベンダーと一致し、すべてのユーザーがdialout
グループ(MODE
)に属すことなくアクセスできます。また、両方の最初のシンボリックリンク/dev/devicename0
-> /dev/ttyUSB0
を作成します。別のUSBチップセット(例:サイプレスのもの)が既に差し込まれている別のデバイスがある場合は、最初のthisチップセットである可能性があるため、/dev/devicename0
-> /dev/ttyUSB1
。 udev
にシンボリックリンクを処理させることにより、別のポートなどにプラグインされることを心配する必要がなくなります-devicename0
はalwaysを使用する最初のデバイスになりますチップセット。
一致するものをさらに見つけるには、udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
を参照してください。
カスタムコードをシリアルポートに接続する方法については、私は通常Pythonを使用するため、pySerialライブラリをチェックアウトすることをお勧めします https://wiki.python.org/moin/PySerial