web-dev-qa-db-fra.com

PL2303 attaché à ttyUSB0 -> changez-le en ttyS *?

Je souhaite lire les lignes d'état simples (txd, dtr, ...) d'un convertisseur PL2303 USB2RS232 avec statserial. J'ai déjà connecté mon PL2303 au port ttyUSB0. Mais pour lire les données, j'ai besoin de la commande statserial, qui n'accepte que ttyS * (si j'essaie de l'utiliser avec ttyUSB *, "autorisation refusée".) Comment pouvez-vous changer le ttyUSB * en un "adresse" 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

...

Merci pour l'aide!

Mise à jour: Il semble que je n'étais pas membre du groupe de numérotation. J'ai ajouté mon utilisateur à ce groupe en utilisant Sudo usermod -a -G dialout <username>

Après cela, j'ai eu la permission d'accéder aux ports USB et série. Maintenant, les programmes terminaux comme le travail moserial. Mais je ne peux toujours pas accéder aux lignes d'état avec statserial. Au lieu de cela, je reçois ce message:

gernot@gernot-Lenovo-G505s:~$ statserial ttyUSB0
statserial: can't open device `ttyUSB0': No such file or directory

Mise à jour 2: J'ai réussi à faire fonctionner les statistiques (le sens de ce fil va s'effondrer, je suppose): vous devez d'abord réinitialiser le port, puis établir un lien physique vers un port ttyS * avec un nombre supérieur au nombre de ports standard sont:

Sudo rm /dev/ttyS40
Sudo ln /dev/ttyUSB0 /dev/ttyS40 

Mais comment puis-je copier les données affichées dans le terminal dans un objet que je peux lire avec du code créé par l'utilisateur? Et pourquoi l’outil statserial réagit-il si lentement aux lignes d’arrêt modifiées?

3
user285079

Votre premier problème (autorisations de périphérique) a été résolu en ajoutant votre utilisateur au groupe correct.

Votre deuxième problème (chemin de périphérique) semble être que vous n'utilisez pas le chemin de périphérique complet. De man statserial:

Le paramètre optionnel nom-périphérique est le nom complet du fichier de périphérique pour le port série en question. Si non spécifié, la valeur par défaut est extraite de la variable d'environnement MODEM si elle est définie, sinon,/dev/cua1.

Donc, vous devez faire statserial /dev/ttyUSB0

(J'ai vérifié la source pour vérifier si elle est correcte, elle utilise littéralement fd = open(device,...) où device est votre argv [x])

Pour des informations génériques sur la programmation du port série, voir Serial Programming HOWTO . Vous pouvez regarder la source de statserial avec apt-get source statserial (c'est un programme très simple compilé à partir d'un seul fichier statserial.c qui compte 195 lignes).

La mise à jour est lente car statserial interroge uniquement le port série toutes les secondes. La boucle principale est:

  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);
  }

Si vous faites un travail sérieux avec les ports série, je vous recommande fortement d’obtenir une vraie carte de port série (carte PCI avec contrôleur RS232). Les adaptateurs USB ne sont pas assez fiables, en particulier si vous vous connectez à un ancien matériel, vous constaterez qu'ils ne reproduisent pas correctement les synchronisations du signal, ce qui entraînera des problèmes avec certains périphériques. Un autre problème courant est que les ports série USB n'implémentent pas (ou mal implémentent) le protocole de transfert matériel RTS/CTS, et finissent donc par être incompatibles avec les anciens périphériques à port série. Cela dit, la PL2303 est l’une des meilleures puces et devrait fonctionner avec la plupart des appareils.

4
bain

Je ne connais pas statserial (et je sais que c'est une vieille question), mais si vous voulez avoir un nom de périphérique personnalisé, vous pouvez déposer un fichier dans /etc/udev/rules.d/ comme celui-ci (le mien s'appelle 98-devicename.rules):

SUBSYSTEM=="tty" ATTRS{idVendor}=="067b" ATTRS{idProduct}=="2303" SYMLINK+="devicename%n" MODE:="0666"

Cela correspond à l'ID USB/au fournisseur et permet à tous les utilisateurs d'accéder sans être dans le groupe dialout (MODE). Il créera également un lien symbolique /dev/devicename0 -> /dev/ttyUSB0 en supposant qu'il s'agit du premier des deux. Si vous avez déjà branché un autre périphérique avec un autre chipset USB (par exemple, un Cypress), il peut s'agir du premier de this chipset, donc /dev/devicename0 -> /dev/ttyUSB1. Si udev gère les liens symboliques, vous n'avez pas à vous inquiéter de le brancher sur un port différent, etc. - devicename0 devrait toujours être le premier périphérique qui utilise ce chipset.

Pour rechercher d'autres éléments pouvant être comparés, voir udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0).

1
Aaron D. Marasco

Pour ce qui est de connecter un code personnalisé à des ports série, étant donné que j’utilise couramment Python, je vous conseillerais de consulter la bibliothèque pySerial https://wiki.python.org/moin/PySerial

0
nmz787