[USB] Problème d'envoi de données

blackswords

Membre confirmé
18 Janvier 2009
31
0
Bonjour à tous!

Je viens à vous car j'essaie de faire communiquer mon mac avec une carte électronique programmable et j'ai un petit soucis de communication que je n'arrive pas à résoudre. J'ai configuré ma carte en périphérique HID avec en gros 8 octets en entrée et 8 octets en sortie. (si je ne me suis pas trompé quelque part, ce qui n'est certainement pas à écarter :D)

J'utilise HIDAPI côté mac pour la comm. Lorsque j'envoie mes 8 octets de ma carte vers le mac tout est ok, je les reçois comme il faut. Par contre, quand c'est l'inverse et que j'envoie des données du mac vers la carte l'écriture plante (code -1 renvoyé par hid_write() )

Je ne sais pas d'où vient le problème, certainement dans la déclaration de mes différents rapports USB mais je ne vois pas où.

Je vous met le rapport de USB Prober ainsi que le code qui est exécuté côté mac en espérant que quelqu'un y trouve quelque chose.

Je débute complètement avec l'USB donc soyez indulgents ;)

Bloc de code:
Full Speed device @ 2 (0x1D100000): .............................................   Composite device: "USB HID Testing Device"
    Port Information:   0x001a
           Not Captive
           Attached to Root Hub
           External Device
           Connected
           Enabled
    Device Descriptor   
        Descriptor Version Number:   0x0200
        Device Class:   0   (Composite)
        Device Subclass:   0
        Device Protocol:   0
        Device MaxPacketSize:   64
        Device VendorID/ProductID:   0x0483/0x5710   (STMicroelectronics)
        Device Version Number:   0x0200
        Number of Configurations:   1
        Manufacturer String:   1 "Benel Electronics"
        Product String:   2 "USB HID Testing Device"
        Serial Number String:   3 "8C31645A35"
    Configuration Descriptor   
        Length (and contents):   41
            Raw Descriptor (hex)    0000: 09 02 29 00 01 01 00 E0  32 09 04 00 00 02 03 00  
            Raw Descriptor (hex)    0010: 00 00 09 21 00 01 00 01  22 31 00 07 05 81 03 08  
            Raw Descriptor (hex)    0020: 00 20 07 05 01 03 08 00  20 
        Number of Interfaces:   1
        Configuration Value:   1
        Attributes:   0xE0 (self-powered, remote wakeup)
        MaxPower:   100 ma
        Interface #0 - HID   
            Alternate Setting   0
            Number of Endpoints   2
            Interface Class:   3   (HID)
            Interface Subclass;   0
            Interface Protocol:   0
            HID Descriptor   
                Descriptor Version Number:   0x0100
                Country Code:   0
                Descriptor Count:   1
                Descriptor 1   
                    Type:   0x22  (Report Descriptor)
                    Length (and contents):   49
                        Raw Descriptor (hex)    0000: 05 FF 09 F0 A1 01 05 FF  09 F1 A1 02 05 FF 09 F2  
                        Raw Descriptor (hex)    0010: 15 00 25 FF 95 08 75 08  81 02 C0 05 FF 09 F2 A1  
                        Raw Descriptor (hex)    0020: 02 05 FF 09 FF 15 00 25  FF 95 08 75 08 B1 02 C0  
                        Raw Descriptor (hex)    0030: C0 
                    Parsed Report Descriptor:   
                          Usage Page    (Vendor Defined) 
                          Usage 240 (0xf0)    
                              Collection (Application)    
                                Usage Page    (Vendor Defined) 
                                Usage 241 (0xf1)    
                                    Collection (Logical)    
                                      Usage Page    (Vendor Defined) 
                                      Usage 242 (0xf2)    
                                      Logical Minimum.........    (0)  
                                      Logical Maximum.........    (-1)  
                                      Report Count............    (8)  
                                      Report Size.............    (8)  
                                      Input...................   (Data, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Bitfield) 
                                    End Collection     
                                Usage Page    (Vendor Defined) 
                                Usage 242 (0xf2)    
                                    Collection (Logical)    
                                      Usage Page    (Vendor Defined) 
                                      Usage 255 (0xff)    
                                      Logical Minimum.........    (0)  
                                      Logical Maximum.........    (-1)  
                                      Report Count............    (8)  
                                      Report Size.............    (8)  
                                      Feature.................   (Data, Variable, Absolute, No Wrap, Linear, Preferred State, No Null Position, Nonvolatile, Bitfield) 
                                    End Collection     
                              End Collection     
            Endpoint 0x81 - Interrupt Input   
                Address:   0x81  (IN)
                Attributes:   0x03  (Interrupt no synchronization data endpoint)
                Max Packet Size:   8
                Polling Interval:   32 ms
            Endpoint 0x01 - Interrupt Output   
                Address:   0x01  (OUT)
                Attributes:   0x03  (Interrupt no synchronization data endpoint)
                Max Packet Size:   8
                Polling Interval:   32 ms
Bloc de code:
#include <stdio.h>
#include <wchar.h>
#include <string.h>
#include <stdlib.h>
#include "hidapi.h"
#include <unistd.h>


int main(int argc, char* argv[])
{
    int res=0,i;
    unsigned char buf[256];
    hid_device *handle;
    
    handle = hid_open(0x0483, 0x5710, NULL);
    if (!handle) {
        printf("unable to open device\n");
         return 1;
    }

    hid_set_nonblocking(handle, 1);

    while (res == 0) {
        res = hid_read(handle, buf, sizeof(buf));
        if (res == 0)
            printf("waiting...\n");
        if (res < 0)
            printf("Unable to read()\n");
        usleep(500*1000);
    }

    printf("Data read : ");
    for (i = 0; i < res; i++)
        printf("%02hhx ", buf[i]);
    printf("\n");
    //ici j'ai bien "Data read: 0a 14 1e 28 32 3c 46 50" ce qui est ce que j'envoie

    buf[0] = 0x00;
    buf[1] = 0x80;
    res = hid_write(handle, buf, 2);
    if (res < 0)
        printf("Unable to write()\n");
    
    return 0;
}