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.