2008-10-30 8 views
4

J'ai une application simple, qui devrait envoyer un seul octet à un port série une fois par minute. Mais parfois, pour une raison étrange, il se fige quelque part dans la fonction WriteFile(). Les deux contrôles de flux sw et hw sont désactivés. J'ai fait des recherches sur des opérations de lecture en attente effectuées à partir d'autres threads, mais je crois que ce n'est pas un problème, car mon application a un thread unique. En outre, handle de CreateFile semble valide, donc le port ne doit pas être utilisé par d'autres applications. Est-ce que quelqu'un a souffert de ça?Port série WriteFile() freeze

+0

L'information sur la langue, la plate-forme, etc. est également utile. –

Répondre

0

Eh bien, j'utilise cette bibliothèque: http://lhdelphi.ic.cz/uploader/storage/ComDrv32.pas en Delphi 7, sous Windows XP, mais le composant est à l'intérieur juste une enveloppe autour des appels API Win, CreateFile, WriteFile, etc.

+0

ComDrv32.pas ne semble pas avoir beaucoup de réflexion sur la gestion des erreurs. Cela peut fonctionner correctement tant que les choses vont bien, mais il n'y a pas de vérification d'erreur sur les appels d'API. Je ne ferais pas confiance à cette bibliothèque pour être très robuste. – Jozz

2

Si vous Google pour les mots writefile se bloque, vous trouverez un certain nombre de discussions sur ce problème. Certains leads sont des dépassements de buffer, dimensionnant correctement votre buffer, un port COM défectueux, effaçant le statut en cas d'erreur ... On dirait qu'il y a plein de choses à essayer.

Une autre chose que je suggère est d'utiliser une bibliothèque de communication au lieu d'appeler l'API directement, quelque chose comme Async Professional (http://sourceforge.net/projects/tpapro/). Même s'ils ajoutent des frais généraux à votre application, ils peuvent simplifier votre travail et éviter un certain nombre de pièges potentiels ...

0

Avez-vous essayé de définir CommPortDriver.CheckLineStatus sur true («pour éviter les blocages lorsque l'appareil n'est pas connecté ou le périphérique est DE")? La source de la bibliothèque comdrv32.pas contient cette suggestion.

0

Vous pouvez également essayer ComPort, qui a été négligé pendant un certain temps mais qui est maintenant activement développé à nouveau.