Re[3]: COM port with WIN32 API
От: Eugene  
Дата: 29.06.01 14:40
Оценка:
Здравствуйте Roman_M, вы писали:
...
RM>WriteTotalTimeoutConstant у меня равна нулю, просто в приведенном исходники отсутствовали строчки

Вот это и смущает. MSDN "утверждает", что если WriteTotalTimeoutConstant = WriteTotalTimeoutMultiplier = 0, эти константы не используются, что не вполне понятно.
IMHO, следует дать им что-нибудь "определенное", например:
cto.WriteTotalTimeoutMultiplier = 2*CBR_9600/dwBaudRate ? 2*CBR_9600/dwBaudRate : 1; // не менее 1
cto.WriteTotalTimeoutConstant = 50;

Еще одно соображение по поводу оригинального кода. Насколько я понимаю, WaitCommEvent в асинхронном режиме не нужен — его можно "опустить". Точнее он бывает нужен в специфических случаях, к примеру, для побайтового приема с максимально быстрым возвратом эхо. В приведенном же примере при получении уведомления о приеме 1-го байта все равно вызывается ReadFile для приема остальных. Мешать, вроде, не должен, но смысла не несет.

RM>В синхронном режиме скорее всего придется делать TerminateThread при выходе из программы.

Совсем не обязательно: соответствующая установка констант COMMTIMEOUTS обеспечивает активизацию потока через заданное время, а в цикле потока можно анализировать условие выхода и делать корректный выход. Если же поток использует WaitCommEvent, то вызов в другом потоке SetCommMask(0) выводит его из состояния ожидания, что, впрочем, надо делать и в асинхронном режиме.

RM>Кроме того, я слышал, что Win2K не дает открыть порт синхронном режиме.

Дает, это легко проверить.

Евгений.
Don't trouble trouble until trouble troubles you
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.