Здравствуйте 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 не дает открыть порт синхронном режиме.
Дает, это легко проверить.