Bonjour,

Je suis en train de réaliser un projet nécessitant la communication entre un PIC 18f4550 et un PC via une liaison USB HID. Le PIC doit me renvoyer me renvoyer une mesure parmi 24 possibles. J'utilise Visual studio Express 2013 pour mon interface PC. VSE envoie une adresse sur la liaison USB et en fonction de de l'adresse le PIC doit renvoyer une valeur associée. J'utilise donc un timer qui incrémente l'adresse à chaque appel. Ainsi en 24 appels VSE doit être en mesure de m'afficher, sur des textboxs, les 24 valeurs. Pour lire les données sur l'USB, j'utilise la fonction "BeginRead"ou"ReadAsync" (j'ai essayé les 2).
Mon problème est qu'en lançant le programmes, la commande de lecture ne s’exécute pas. Le programme passe bien sur la ligne de code mais la valeur renvoyé n'est pas la bonne (en l’occurrence il me renvoie 0 alors que cette valeur est impossible dans le programme du PIC). Pour faire simple il ne prends pas en compte la ligne de code (le 0 vient du fait qu'il ré-initialise systématiquement le buffer avant de faire la lecture). Toutefois lorsque je fais un delay juste après mon beginRead alors il effectue bien la lecture (j'utilise System.Threading.Thread.Sleep(300)). Cela fonctionne également en pas à pas. Je ne peux malheureusement pas descendre en dessous de 300ms sinon il y a trop de 0 qui reviennent. Comme j'ai 24 valeurs à retourner je ne peux pas attendre 300ms entre chaque, cela me donne un rafraîchissement trop lent.
Quelqu'un a t'il déjà eu ce problème? Auriez vous une solution à me proposer?

Merci d'avance pour vos réponses.

Cordialement.

Ps : Je vous joins le partie de mon code concerné par le problème:

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
  Public Function ReadToDevice() As Integer
        Dim inputReportBuffer() As Byte = Nothing
        Dim outputReportBuffer() As Byte = Nothing
        Dim success As Boolean
 
 
        success = False
        If (Not (hidHandle.IsInvalid)) Then
            If (MyHid.Capabilities.InputReportByteLength > 0) Then
 
                Array.Resize(inputReportBuffer, MyHid.Capabilities.InputReportByteLength)    // Réinitialise inputReportBuffer a 0.
                Dim ar As IAsyncResult = Nothing
                transferInProgress = True
 
                If (fileStreamdevicedata.CanRead) Then
 
                    fileStreamdevicedata.ReadAsync(inputReportBuffer, 0, inputReportBuffer.Length, Nothing) //Fameuse ligne qui ne fonctionne pas bien
                    System.Threading.Thread.Sleep(300)   //Delay de 300ms
                    success = True
                Else
                    CloseCommunications()
                End If
            End If
        End If
        Return inputReportBuffer(1)
    End Function