web-dev-qa-db-ja.com

PL2303をttyUSB0に接続-> ttyS *に変更しますか?

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の反応が遅いのはなぜですか?

3
user285079

ユーザーを正しいグループに追加することで、最初の問題(デバイスのアクセス許可)が修正されました。

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つであり、ほとんどのデバイスで動作するはずです。

4
bain

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/ttyUSB1udevにシンボリックリンクを処理させることにより、別のポートなどにプラグインされることを心配する必要がなくなります-devicename0alwaysを使用する最初のデバイスになりますチップセット。

一致するものをさらに見つけるには、udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)を参照してください。

1

カスタムコードをシリアルポートに接続する方法については、私は通常Pythonを使用するため、pySerialライブラリをチェックアウトすることをお勧めします https://wiki.python.org/moin/PySerial

0
nmz787