Bonjour à tous,

Pour un de mes projets, je dois développer une application C# exploitant un périphérique HID USB.

Mon objectif est de simplement créer un terminal HID avec connection/déconnection/lecture/écriture.

J'ai fais beaucoup de recherche sur le net et testé quelques projets mais rien de bien concluant appart ce lien :

http://www.florian-leitner.de/index....river-library/

Via celui-ci j'ai pu créer une petite application et envoyer des messages vers mon périphérique HID.

Malheureusement, je ne parviens pas à recevoir des données de manière évènementielle. Je m'explique. Dans les explications fournies, on peut trigger un event pour signaler à l'application d'un message est reçu. Mais cela n'est seulement possible si je spécifie moi même à l'application qu'un message va être reçu après en avoir envoyé un.

Il est possible que je n'exploite pas correctement cette librairie (DLL).

Voici le code (brouillon) sur lequel je travail :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace TEST_HID_USB
{
    public partial class Form1 : Form
    {
 
        USBHIDDRIVER.USBInterface usb = new USBHIDDRIVER.USBInterface("vid_1234", "pid_4444");
        //USBHIDDRIVER.USBInterface usb = new USBHIDDRIVER.USBInterface("vid_04d8", "pid_003f");
        bool CONNECTED = false;
        public Form1()
        {
            InitializeComponent();
            usb.enableUsbBufferEvent(new System.EventHandler(myEventCatcher));
            //usb.startRead();
        }       
 
        public void myEventCatcher(object sender, System.EventArgs e)
        {
            //Log_message("Event ");
            if (USBHIDDRIVER.USBInterface.usbBuffer.Count > 0)
            {
                byte[] currentRecord = null;
                int counter = 0;
                while ((byte[])USBHIDDRIVER.USBInterface.usbBuffer[counter] == null)
                {
                    //Remove this report from list
                    lock (USBHIDDRIVER.USBInterface.usbBuffer.SyncRoot)
                    {
                        USBHIDDRIVER.USBInterface.usbBuffer.RemoveAt(0);
                    }
                }
                //since the remove statement at the end of the loop take the first element
                currentRecord = (byte[])USBHIDDRIVER.USBInterface.usbBuffer[0];
                lock (USBHIDDRIVER.USBInterface.usbBuffer.SyncRoot)
                {
                    USBHIDDRIVER.USBInterface.usbBuffer.RemoveAt(0);
                }
                Log_message("DATA1: " + Convert_byte_array_to_string(currentRecord));
 
 
 
 
 
                usb.stopRead();
 
 
            }
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            if (usb.Connect()) {
                textBox1.Text = "Connecté!";
                CONNECTED = true;
            }
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            //48656C6C6F =  Hello
            byte[] Buffer = new byte[64];
 
            Buffer[0] = 0x48;
            Buffer[1] = 0x65;
            Buffer[2] = 0x6C;
            Buffer[3] = 0x6C;
            Buffer[4] = 0x6F;
            if (usb.write(Buffer))
            {
                //Log_message("Message \"Hello\" OK!");
            }
            //Si pas d'ACK requis pour ce message...
            //usb.startRead();
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            //54455354
            byte[] Buffer = new byte[64];
            //Buffer[0] = 0x00;
            //Buffer[1] = 0x00;
            //Buffer[2] = 0x54;
            //Buffer[3] = 0x45;
            //Buffer[4] = 0x53;
            //Buffer[5] = 0x54;
 
            Buffer[0] = 0x54;
            Buffer[1] = 0x45;
            Buffer[2] = 0x53;
            Buffer[3] = 0x54;
            Buffer[4] = 0x00;
            Buffer[5] = 0x54;
 
 
            if (usb.write(Buffer)) {
                //Log_message("Message \"TEST\" OK!");
            }
            //On attend d'office qq chose en retour
            usb.startRead();
 
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
            textBox2.Text = "";
        } 
 
        public void Log_message(String MSG){
            this.Invoke(new EventHandler(delegate
            {
                textBox2.Text += "> "+MSG;               
            }));
            return;
        }
 
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            //usb.stopRead();
            //usb.Disconnect();
 
        }
 
 
    }
}
Pour l'explication du code, je me connecte simplement au périphérique HID via les identifiants VID et PID.
Si j'envoi un message autre que "Hello", le périphérique HID me renvoi le message que j'envoi. Cela me permet de tester la communication entre mon application et mon périphérique HID.

Quoiqu'il en soit, je suis quand même limité car si j'effectue d'autre tâche mon application se bloque tout simplement.
Je pense que les fonctions appelées par le DLL sont bloquantes (en partie).

Je voulais savoir si il n'existe pas un autre moyen de communiquer avec un périphérique HID.

Je dois travailler en c# et faire une application la plus fiable possible.

Voilà, je sais que ce n'est pas très clair mais j'espère que certain d'entre vous pourrons éventuellement me guider vers une solution (plus compliqué ou pas) pour exploiter mon périphérique HID.

[Désolé si ce sujet a déjà été abordé sur ce forum]