Question

J'ai écrit du code C # qui vérifie si un périphérique est présent sur un port série en émettant une commande sur le port et en écoutant une réponse. Lorsque je viens de définir la vitesse du port, d’ouvrir le port, d’obtenir le flux série et de commencer le traitement, cela fonctionne 100% du temps. Cependant, certains de nos appareils fonctionnent à différentes vitesses et j'essaie de rechercher un appareil à différentes vitesses afin d'auto-négocier une connexion et de détecter la présence d'un appareil.

Quand je fais tout cela dans un seul thread, il n'y a pas de problèmes. Cependant, le délai d'attente de 3 secondes à dix vitesses est de 30 secondes par port série et il peut y en avoir plusieurs. D’où la volonté de sonder simultanément tous les ports.

Parfois, cela fonctionne. Parfois, écrans bleus Vista. Lorsque j'utilise des threads pour sonder simultanément tous les ports, les écrans bleus sont presque toujours bleus. Lorsque je force tout à fonctionner en un seul thread, cela ne se produit jamais.

Un adaptateur série USB Prolific PL-2303 est utilisé avec les pilotes x64.

@Vinko - merci pour l’astuce sur la lecture des mini-pompes.

Aussi près que je puisse dire, le noeud du problème est qu’en démarrant une nouvelle opération d’E / S asynchrone à partir d’un autre thread , il est possible de donner un tout nouveau sens aux I / O, induisant une condition de concurrence à l'intérieur du pilote. Le pilote s'exécutant en mode noyau, BLAM!

Épilogue

Sauf pour donner le coup d'envoi, n'utilisez pas BeginXxx en dehors du gestionnaire de rappel et n'appelez pas BeginXxx tant que vous n'avez pas appelé EndXxx, car vous induirez une situation de concurrence critique dans le code de pilote qui s'exécute en mode noyau.

Postscript

J'ai constaté que cela s'appliquait également aux flux de socket.

Était-ce utile?

La solution

Après avoir écrit les pilotes Windows pour l'un de ces types de périphérique, mon conseil serait de ne pas perdre votre temps avec WinDbg pour tenter de prouver ce que vous savez déjà, à savoir que le pilote que vous utilisez est bogué.

Si vous pouvez trouver un pilote plus récent à partir du PL2302, essayez-le, mais je vous recommande, si vous devez utiliser des adaptateurs série / USB, les meilleurs basés sur FTDI. (Ce ne sont pas celui pour lequel j'ai écrit les pilotes, soit ...)

Autres conseils

Vous pouvez également désactiver le "Redémarrage automatique". sous Propriétés système \ Avancé \ Démarrer et récupération \ Paramètres. Une fois que vous désactivez cela, vous pouvez voir le BSOD et rechercher le message d'erreur, par exemple. IRQL_LESS_OR_EQUAL, en recherchant ce nom d'erreur, vous pouvez généralement vous limiter à la source du problème.

Btw, pas beaucoup d’ordinateurs portables sont équipés de ports série, vous devez donc utiliser un convertisseur USB-série? Si tel est le cas, le pilote a peut-être déjà posé problème, car la plupart des fabricants ont écrit le pilote du port série en tant que pilote virtuel.

BSOD signifie généralement des pilotes bogués.

Quel type de ports matériels utilisez-vous? J'ai des BSOD avec des pilotes de convertisseurs USB / série SiLabs CP21xx.

Il existe des pilotes FTDI stables sous x64 vista et win7. J'appuie la personne qui a dit n'utiliser que des chipsets FTDI.

La plupart des dongles USB et série bon marché des magasins près de chez moi (Toronto, Canada) semblent être des puces FTDI. Comme il n’est jamais sur la boîte, j’en achète une et, si c’est bon, j’en achète une boîte pleine.

W

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top