2011-11-15 4 views
0

Environnement: WinXP; PowerBuilder 11.5 (bien que probablement pas pertinent parce que cette partie est presque entièrement des appels WinAPI)Le port COM ne fonctionne plus

Mon application ouvre un port COM pour l'écriture en utilisant des appels de méthode chevauchés. Le port est ouvert lorsque l'application est ouverte. L'application laisse le port ouvert à tout moment.

Parfois, le périphérique connecté cesse de recevoir des données même si l'application envoie toujours des données. L'application ne reçoit aucun message d'erreur. L'arrêt et le redémarrage de l'application ne le résolvent pas. Le redémarrage de l'ordinateur ne le résout pas. Cependant, la connexion via hyperterminal le corrige.

Cet appareil particulier imprime des étiquettes de codes à barres. L'application sera très bien imprimée, puis soudainement, il ne sera pas imprimé. Fermez l'application ouvrir et se connecter avec hyperterminal; déconnecter et fermer l'hyperterminal; ouvrez l'application Cela fonctionne très bien encore ... pendant un moment. (J'ai eu des problèmes similaires avec d'autres périphériques qui communiquent également via le port COM, donc je sais que ce n'est pas le périphérique lui-même.)

Le problème le plus proche que je peux trouver sur le web est à http://www.eggheadcafe.com/microsoft/Windows-XP-Hardware/30829577/com1-not-behaving.aspx qui parle de conflits d'IRQ et n'offre aucune solution. Je peux seulement deviner que mon problème est similaire.

Est-ce que quelqu'un sait ce que l'hyperterminal pourrait faire pour éclaircir les choses?

+1

L'indicateur fort est que la poignée de main est incorrecte.Comme si vous n'utilisiez rien lorsque le périphérique nécessite RTS + CTS ou Xon/Xoff. –

+0

C'est certainement une possibilité. Mais est-ce que quelque chose comme ça fonctionnerait de temps en temps? L'application fonctionne pendant un certain temps puis s'arrête soudainement. Aussi, comment devrais-je spécifier la méthode handshake lors de l'utilisation de la méthode CreateFile? http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx –

+0

Vous le spécifiez dans le DCB avec SetCommState() –

Répondre

0

J'ai explicitement défini la méthode de poignée de main en utilisant SetCommState et qui semble avoir résolu le problème. PowerBuilder n'a pas d'opérandes de bits, donc j'ai dû créer une méthode qui a transformé un nombre DWORD en un tableau de caractères de '1 et' 0. J'ai créé une méthode correspondante qui a retourné le tableau de caractères dans un DWORD. Donc, j'ai attrapé l'état actuel en utilisant GetCommState, traduit les drapeaux dans un tableau, marchais le tableau en copiant les valeurs existantes sauf celles qui spécifient le contrôle de flux (Contrôle DTR et Contrôle RTS - pas sûr si j'avais besoin des deux) mis à '0', puis traduit le tableau résultant en un DWORD et utilisé SetCommState pour l'appliquer. Pour les recherches, n'oubliez pas que le contrôle DTR et le contrôle RTS sont deux bits chacun. Les valeurs décimales pour ceux-ci sont:

CONSTANT ULong fDtrControl_Enable = 2^4 
CONSTANT ULong fDtrControl_Handshake = 2^5 
CONSTANT ULong fRtsControl_Enable = 2^12 
CONSTANT ULong fRtsControl_Handshake = 2^13 
CONSTANT ULong fRtsControl_Toggle = fRtsControl_Enable + fRtsControl_Handshake 
+0

Eh bien, visage triste, il se trouve que cela ne l'a pas réparé. C'est un problème sporadique et le client a apparemment eu une série de plusieurs jours sans qu'il ne surgisse. Soit ce n'est pas un problème de poignée de main ou je ne définis pas les paramètres de prise de contact à droite. :( –

0

Eh bien, ce qui est très en retard, mais j'ai connu des problèmes similaires sur plusieurs appareils, principalement sur les périphériques USB qui ont un pilote de port USB/COM. Le symptôme que j'ai trouvé est le port COM se ferme sporadiquement tout seul. J'ai identifié ce problème à deux problèmes potentiels:

  1. Le pilote USB/COM peut comporter des bogues entraînant la fermeture du port. Essayez un pilote mis à jour.

  2. Un bruit électrique sur le câble USB entrant dans l'ordinateur peut entraîner la fermeture du port. Si vous rencontrez ce problème, vous ne pourrez peut-être pas résoudre le problème facilement. Essayez d'isoler l'environnement électrique afin que le bruit n'entre pas par le câble USB. Si vous ne le pouvez pas, vous devrez peut-être modifier votre application pour détecter un port fermé, puis effectuer une réinitialisation du pilote, ce qui équivaut à débrancher et rebrancher le câble USB, puis faire une pause assurez-vous que la réinitialisation prend effectivement.

Questions connexes