Pb plantage aléatoire com USB avec chip FTDI (FT232RL)

Signaler
Messages postés
9
Date d'inscription
mercredi 28 janvier 2004
Statut
Membre
Dernière intervention
28 juin 2010
-
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
-
Bonjour,
n'ayant jamais de réponse sur le support technique de FTDI (et pas que pour ce pb), et ne trouvant rien sur le net,
j'espère que quelqu'un (s'il existe) pourra m'aider.

Je communique par port USB avec une carte électronique qui utilise un circuit FTDI (FT232RL) et j'utilise "D2XX Direct Drivers" en passant par leur dll ce qui évite de déclarer des port COM virtuel pour accéder au port USB.
Cela fonctionne relativement bien mais de temps en temps, de manière complètement aléatoire, il y a des pertes de communications (cela peut-être au bout de quelques minutes ou heures) et il faut débrancher/rebrancher le cordon USB pour que cela reparte.

Pour donner un ex concret, lorsque la com est perdue, je réinitialise le circuit avec le code suivant:

Public Function OpenFTDI() As String

Dim NumDevices As Integer
Dim strSerialNumber As New VB6.FixedLengthString(256)
Dim strDescription As New VB6.FixedLengthString(256)

' Lecture du nbre d'appareil USB branché
statusFTDI = FT_GetNumDevices(NumDevices, vbNullString, FT_LIST_BY_NUMBER_ONLY)
If statusFTDI <> FT_OK Then
MsgBox("Erreur! Aucun device USB n'est détecté.", MsgBoxStyle.Exclamation)
OpenFTDI = "KO"
Exit Function
End If

' Open the device
statusFTDI = FT_Open(0, HandleFTDI)
If statusFTDI <> FT_OK Then
'MsgBox("Erreur! Impossible d'ouvrir le port USB. Vérifiez que le conditionneur est bien alimenté et relié à un port USB.", MsgBoxStyle.Exclamation)
OpenFTDI = "KO"
Exit Function
End If

' Set baud rate to 9600
'statusFTDI = FT_SetBaudRate(HandleFTDI, 9600)
statusFTDI = FT_SetBaudRate(HandleFTDI, 19200)
If statusFTDI <> FT_OK Then
'MsgBox("Erreur! SetBaudRate Failed. Vérifiez que le conditionneur est bien alimenté et relié à un port USB.", MsgBoxStyle.Exclamation)
CloseFTDI()
OpenFTDI = "KO"
Exit Function
End If

' 8 data bits, 1 stop bit, no parity
statusFTDI = FT_SetDataCharacteristics(HandleFTDI, FT_BITS_8, FT_STOP_BITS_1, FT_PARITY_NONE)
If statusFTDI <> FT_OK Then
'MsgBox("Erreur! Impossible de dialoguer avec le conditionneur. Vérifiez qu'il est bien alimenté et relié à un port USB.", MsgBoxStyle.Exclamation)
CloseFTDI()
OpenFTDI = "KO"
Exit Function
End If

OpenFTDI = "OK"

End Function



Et le pb est que la fonction FT_Open() me retourne toujours FT_INVALID_HANDLE.
Quelqu'un a-t'il une expérience avec ce circuit et peut-il me donner une piste pour réinitialiser l'usb de manière automatique (équivalente à celle manuelle de débrancher/rebrancher le cordon) ?
Je sais que c'est très spécifique comme demande mais je suis complètement bloqué et je ne sais plus vers qui me tourner.

Merci d'avance,
Thomas.

3 réponses

Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
37
Salut,

Es-tu sûr d'être en VB.Net ?

Si c'est le cas cela peut provenir de ta déclaration d'API qui serait non conforme. Dans le cas contraire tu n'as pas posté dans la bonne catégorie et je laisse donc le soins aux experts du vb6 de trouver une réponse à ton problème.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
9
Date d'inscription
mercredi 28 janvier 2004
Statut
Membre
Dernière intervention
28 juin 2010

Salut,
oui, j'utilise Visual Studio 2008 mais j'ai convertit les sources fournis par FTDI qui étaient écrit pour du VB6.
Cependant, j'ai viré les fonctions qui n'étaient pas directement compatible et je n'utilise que celles qui (à priori) sont totalement compatibles avec VB.Net. C'estr à dire sans erreur ni warning.

En me relisant, je ne suis pas sûr d'être clair: le code que je donne en exemple est le code d'init du chip USB de FTDI. Ce code fonctionne parfaitement bien.
Ensuite j'utilise d'autres fonctions de read et write qui fonctionne aussi jusqu'au plantage aléatoire. A ce moment là, je ferme le device (fonction CloseFTDI()) et j'essaye de le réouvrir en appelant donc la fonction OpenFTDI() décrite ci-dessus et c'est uniquement à ce moment là que j'ai un code d'erreur permanent tant que je n'ai pas débrancher le cordon USB.

Thomas.
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
37
Ne t'en fais pas, j'avais parfaitement compris ^^

En vrais, le code que tu utilises est un code vb6 mais il fonctionne pour les deux, d'ou ma question.

Par contre le changement intervient au niveau de VB.Net déjà pour plusieurs choses :

1\Le Framework est basé sur du 64bits, donc les "long" en vb6 sont à traduire en "Integer" en .Net.

2\En .Net, on ne peut plus passer de structure comme on le faisait en vb6, il faut donc modifier l'appel à l'API déclaré pour lui passer un pointeur (IntPtr) vers l'adresse mémoire ou se trouve notre structure.

Il se peut dans ton cas, que tes API soient mal déclarés laissant des ressources ouverte, ne permettant plus à l'application la communication avec le périphérique (étant déjà utilisé).

De même il se peut que le programme interne du chip plante durant tes appels à Read/Write et que bien que tu appelles la fonction close derrière, le périphérique n'est plus en mesure de répondre, dans ce cas il faut réinitialiser celui-ci en le désalimentant pas le choix c'est comme avec n'importe quel périph USB Planté (scan, webcam etc...).

Je plancherais plus pour la seconde. Il te faut à mon avis, trouver pourquoi les fonctions Read/Write plantent, même si c'est aléatoire il doit forcément y avoir une raison. Quelles-sont les données que tu envoies ? Sont-elles de tailles différentes ? Sont-elles aléatoires ?

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.