Последовательный порт WriteFile () заморозить - PullRequest
4 голосов
/ 30 октября 2008

У меня есть простое приложение, которое должно отправлять один байт на последовательный порт один раз в минуту. Но иногда, по какой-то странной причине, он зависает где-то в функции WriteFile (). Оба потока управления SW и HW отключены. Я погуглил некоторые вещи об ожидающих операциях чтения, выполняемых из других потоков, но я считаю, что это не проблема, потому что мое приложение имеет один поток. Кроме того, дескриптор из CreateFile выглядит корректно, поэтому порт не должен использоваться никакими другими приложениями. Кто-нибудь страдал этим?

Ответы [ 4 ]

2 голосов
/ 31 октября 2008

Если вы заглянете в Google за словами writefile зависает , вы найдете ряд обсуждений по этой проблеме. Некоторые из них - переполнение буфера, правильный размер буфера, неисправный COM-порт, очистка состояния при ошибке ... Похоже, есть много вещей, которые можно попробовать.

Еще одна вещь, которую я бы предложил, - это использовать коммуникационную библиотеку вместо прямого вызова API, что-то вроде Async Professional (http://sourceforge.net/projects/tpapro/).. Даже если они добавят некоторые накладные расходы на ваше приложение, они могут упростить вашу работу и избежать количество потенциальных ловушек ...

0 голосов
/ 03 ноября 2008

Вы также можете попробовать ComPort , который некоторое время игнорировался, но теперь снова активно развивается.

0 голосов
/ 31 октября 2008

Вы пытались установить для CommPortDriver.CheckLineStatus значение true («для предотвращения зависания, когда устройство не подключено или устройство выключено»)? Источник для библиотеки comdrv32.pas содержит это предложение.

0 голосов
/ 30 октября 2008

Хорошо, я использую эту библиотеку: http://lhdelphi.ic.cz/uploader/storage/ComDrv32.pas в Delphi 7, в Windows XP, но компонент внутри является просто оболочкой для некоторых вызовов Win API, CreateFile, WriteFile и т. Д.

...