Forum Linux.debian/ubuntu Utilisation de socat, udev pour lire/érire dans un périphérique usb

Posté par  .
Étiquettes :
1
22
fév.
2012

Bonjour,

J'ai un petit problème pour lire/érire dans un périphérique usb.
Ce périphérique est reconu via le device /dev/ttyACM0

Quand j'essaye de lire et écrire en même temps via mon programme ça plante car la ressource est déjà utilisé par une des 2 méthodes (lecture ou écriture).

Je cherche donc à créer un port série virtuel via socat ou créer des devices différents via udev. Mais sans résultat d'où ce post...

Ce que j'ai fait:

J'ai testé en créant des devices de type char et bloc en respectant bien la disponibilité des minors et majors. Je me suis dit qu'il fallait bien que les device existent pour faire du socat ou de l'udev

mknod /dev/ttyrx char 4 64
mknod /dev/ttytx char 4 65

ou

mknod -m 0666 /dev/rfxrx b 166 1
mknod -m 0666 /dev/rfxtx b 166 2

En essayant avec socat voilà les messages d'erreurs :

  # socat -d -d /dev/ttyACM0,raw,echo=0 /dev/ttytx,raw,echo=0 
    2012/02/21 11:53:23 socat[25188] N opening character device "/dev/ttyACM0" for reading and writing
    2012/02/21 11:53:23 socat[25188] N opening directory "/dev/ttytx" for reading and writing
    2012/02/21 11:53:24 socat[25188] E open("/dev/ttytx", 02002, 0666): No such device or address
    2012/02/21 11:53:24 socat[25188] N exit(1)  

J'ai essayé avec udev en identifiant l'ID de mon périphérique usb via lsusb et j'ai rajouté les lignes adéquats dans /etc/udev/rules.d/50-udev.rules :

KERNEL=="ttyUSB*", SYSFS{idProduct}=="00df", MODE=="666", SYMLINK="ttyrx"
KERNEL=="ttyUSB*", SYSFS{idProduct}=="00df", MODE=="666", SYMLINK="ttytx"

Mais pareil ca marche pas :

stty: /dev/ttytx: Input/output error

Auriez vous la syntaxe exacte de socat que je dois utiliser ? Les types de devices que je dois utiliser ? La méthodologie à suivre (car là je suis parti dans tous les sens pour essayer de faire marcher mon truc, tout via udev ? ou tout via socat ? ou les 2 ?)?? Je voudrais que ces devices soient créés quand je branche ma carte USB (en mode udev) et je voudrais que les devices virtuels soient créés dans la foulée (via socat j'imagine)

Merci d'avance pour toute l'aide que vous pourrez m'apporter
Cordialement

  • # ttyACM

    Posté par  . Évalué à 2.

    je crois que la reponse se trouve dans le ttyACM

    si je ne m'abuse c'est un modem ou un telephone/modem branché en USB.

    ca se comporte donc comme un port Serie, tu fais soit une lecture, soit une ecriture
    mais pas les deux en meme temps.

    du coup, meme avec socat, je ne suis pas sur que le peripherique derriere ttyACM accepte de gerer une lecture/ecriture en meme temps.

    • [^] # Re: ttyACM

      Posté par  (site web personnel) . Évalué à 4.

      ca se comporte donc comme un port Serie, tu fais soit une lecture, soit une ecriture
      mais pas les deux en meme temps.

      Référence ? Le série, c'est bidirectionnel il me semble, et socat permet justement cela, contrairement à cat.

      • [^] # Re: ttyACM

        Posté par  . Évalué à 4. Dernière modification le 22 février 2012 à 14:02.

        bi-directionnel veut dire "dans les deux sens", tu peux donc lire OU ecrire
        je suis d'accord avec toi.

        seulement ca ne dit pas qu'on peut faire les deux en meme temps (lire ET ecrire).

        Pour les cartes reseaux (il a quelques années deja), ou certaines cartes son.
        On precisait alors le mode de "duplex" :
        - half duplex : on alterne envoie et reception
        - full duplex : on peut recevoir en meme temps qu'on envoie

        il faut donc deja verifier qu'un port serie soit full-duplex
        pour le coup, je dirais que ca depend des controleurs de chaque coté du cable.

        ensuite voir comment ttyACM est censé se comporter (half ou full duplex)

    • [^] # Re: ttyACM

      Posté par  . Évalué à 0.

      Est-ce qu'un lsusb -v sur le périphérique te permettrait de m'en dire plus (bidirectionnel) ??

      Bus 001 Device 020: ID 04d8:00df Microchip Technology, Inc.
      Device Descriptor:
        bLength                18
        bDescriptorType         1
        bcdUSB               2.00
        bDeviceClass          239 Miscellaneous Device
        bDeviceSubClass         2 ?
        bDeviceProtocol         1 Interface Association
        bMaxPacketSize0         8
        idVendor           0x04d8 Microchip Technology, Inc.
        idProduct          0x00df
        bcdDevice            1.01
        iManufacturer           1 Microchip Technology Inc.
        iProduct                2 USB 433.92MHz transceiver
        iSerial                 3 0000156698
        bNumConfigurations      1
        Configuration Descriptor:
          bLength                 9
          bDescriptorType         2
          wTotalLength          107
          bNumInterfaces          3
          bConfigurationValue     1
          iConfiguration          0
          bmAttributes         0x80
            (Bus Powered)
          MaxPower              100mA
          Interface Association:
            bLength                 8
            bDescriptorType        11
            bFirstInterface         0
            bInterfaceCount         2
            bFunctionClass          2 Communications
            bFunctionSubClass       2 Abstract (modem)
            bFunctionProtocol       1 AT-commands (v.25ter)
            iFunction               0
          Interface Descriptor:
            bLength                 9
            bDescriptorType         4
            bInterfaceNumber        0
            bAlternateSetting       0
            bNumEndpoints           1
            bInterfaceClass         2 Communications
            bInterfaceSubClass      2 Abstract (modem)
      
            bInterfaceProtocol      1 AT-commands (v.25ter)
            iInterface              0
            CDC Header:
              bcdCDC               1.10
            CDC ACM:
              bmCapabilities       0x06
                sends break
                line coding and serial state
            CDC Union:
              bMasterInterface        0
              bSlaveInterface         1
            CDC Call Management:
              bmCapabilities       0x00
              bDataInterface          1
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x82  EP 2 IN
              bmAttributes            3
                Transfer Type            Interrupt
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0008  1x 8 bytes
              bInterval               2
          Interface Descriptor:
            bLength                 9
            bDescriptorType         4
            bInterfaceNumber        1
            bAlternateSetting       0
            bNumEndpoints           2
            bInterfaceClass        10 CDC Data
            bInterfaceSubClass      0 Unused
            bInterfaceProtocol      0
            iInterface              0
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x03  EP 3 OUT
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0020  1x 32 bytes
              bInterval               0
      
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x83  EP 3 IN
              bmAttributes            2
                Transfer Type            Bulk
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0040  1x 64 bytes
              bInterval               0
          Interface Descriptor:
            bLength                 9
            bDescriptorType         4
            bInterfaceNumber        2
            bAlternateSetting       0
            bNumEndpoints           2
            bInterfaceClass         3 Human Interface Device
            bInterfaceSubClass      0 No Subclass
            bInterfaceProtocol      0 None
            iInterface              0
              HID Device Descriptor:
                bLength                 9
                bDescriptorType        33
                bcdHID               1.11
                bCountryCode            0 Not supported
                bNumDescriptors         1
                bDescriptorType        34 Report
                wDescriptorLength      29
               Report Descriptors:
                 ** UNAVAILABLE **
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x81  EP 1 IN
              bmAttributes            3
                Transfer Type            Interrupt
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0010  1x 16 bytes
              bInterval               1
            Endpoint Descriptor:
              bLength                 7
              bDescriptorType         5
              bEndpointAddress     0x01  EP 1 OUT
      
              bmAttributes            3
                Transfer Type            Interrupt
                Synch Type               None
                Usage Type               Data
              wMaxPacketSize     0x0010  1x 16 bytes
              bInterval               1
      Device Status:     0x0000
        (Bus Powered)
      
      
      • [^] # Re: ttyACM

        Posté par  . Évalué à 2.

        des pistes :

        Interface Association:
        bFunctionClass 2 Communications
        bFunctionSubClass 2 Abstract (modem)
        bFunctionProtocol 1 AT-commands (v.25ter)
        [...]
        bInterfaceClass 2 Communications
        bInterfaceSubClass 2 Abstract (modem)
        bInterfaceProtocol 1 AT-commands (v.25ter)

        tu es donc censé parler le langage AT (typique des modems) pour causer sur ce peripherique.

        il ne te reste plus qu'à voir si le protocole AT-commands permet le full-duplex (lire ET ecrire en meme temps)

        • [^] # Re: ttyACM

          Posté par  . Évalué à 0.

          Ceci correspond il à ta remarque ?
          Port redirector correspond il a ce mode full-duplex ?

          The USB interface is using a COM Port Redirector with 38400 baud, 8 bits, No parity, 1 stop bit
          
          
          • [^] # Re: ttyACM

            Posté par  . Évalué à 2. Dernière modification le 22 février 2012 à 18:14.

            ca te dit juste que ca te fait un port Serie 38400bps/8bits/no parity/1 stop
            m'est avis qu'il faut que tu programmes comme si tu avais un port serie à ta disposition.

  • # [CLOSED] trouvé !!

    Posté par  . Évalué à 1.

    Salut !
    Grâce à l'aide d'un pote qui est passé par là, on a trouvé comment faire en utilisant socat :

    socat TCP4-LISTEN:25555,reuseaddr,fork /dev/ttyACM0,b38400,raw,echo=0
    
    

    Via mon programme je suis capable de lire sans que ça plante... J'utilise plus un device mais un port en local. Je ne suis pas encore expert dans l'utilisation de socat, mais ça a l'air méchamment puissant !!
    Maintenant faut que je décode ce que je lis et bien sur il faudra que j'écrive dans ce tube...

    La suite au prochain numéro, merci à tous pour votre aide et à bientôt pour de nouvelle aventure sous linux ;-)

    Webextension

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.