Ceci est mon premier projet utilisant le pilote et la bibliothèque WinUsb.WinUsb: écrire sur le tuyau OUT provoque une corruption des données dans le tuyau IN
Mon ordinateur hôte utilise WINDOWS 10, toutes les mises à jour sont installées. Mon périphérique haute vitesse exploite trois points de terminaison de données: - Point de terminaison de commande OUT: l'ordinateur hôte l'utilise pour envoyer la commande - IN Point de terminaison de réponse: l'ordinateur hôte reçoit une réponse à chaque commande - Point de terminaison de flux IN: le périphérique envoie des données de flux, 1600 octets avec période de 10 millisecondes.
Dans l'application hôte, il y a deux fils pertinents: - fil de commande envoie des commandes à la Command tuyau et reçoit des réponses de tuyau de réponse - fil flux recueille des données à partir de tuyaux flux fonctions non-attente sont utilisées pour tous les tuyaux .
Chaque fil fonctionne parfaitement si un autre fil est suspendu. Toutefois, si deux threads fonctionnent simultanément, les données du flux apparaissent corrompues en des points arbitraires. Plus d'analyse a révélé les faits suivants: - La corruption apparaît comme une séquence contiguë de mauvais octets. La longueur de la mauvaise séquence correspond à peu près à la longueur des commandes et réponses . - Une séquence incorrecte commence à partir d'un point arbitraire non lié aux limites de paquets. - Les octets incorrects peuvent être différents. parfois, ils sont tous des zéros, parfois ils ont l'air d'ordures. - L'analyse du temps suggère que la corruption se produit une fois que la commande est envoyée au tube de commande.
L'effet disparaît si j'implémente la synchronisation entre les threads, de sorte que les opérations de lecture/écriture sont séparées dans le temps. Cependant, cette solution n'est pas acceptable, je veux que deux threads fonctionnent de manière asynchrone. Est-ce que quelqu'un a fait face à un tel effet?
Il n'y a tout simplement pas beaucoup de raisons de suspecter la bibliothèque, surtout vu la fréquence à laquelle elle a été martelée et le peu qu'elle fait. Beaucoup plus probable est que cela ne va pas dans le firmware de l'appareil. Fais ce qui fonctionne. –
Le firmware de l'appareil était ma première supposition, surtout parce qu'il fait aussi partie de mon projet. Par conséquent, j'ai mis en œuvre la vérification de l'intégrité du tampon de flux avant et après le transfert. Aucun problème n'a été trouvé. –
Si ce n'est pas la bibliothèque ou le firmware - donc, seul le matériel reste? –