У тебя даже не вижу проверки что GetOvpResult возвращает TRUE... Да и вообще это использовать не надо...
Это сделанно для упрошения приведенного кода.
Функция GetOverlappedResult используется что бы перевести поток в состояние покоя до поступления данных в порт (т.к. заранее не известно когда будут поступать данные).
Используй lpNumberOfBytesRead (у тебя переменная temp)
Я открываю порт с флагом FILE_FLAG_OVERLAPPED поэтому функция ReadFile всю информацию о прочитанных байтах возвращает через структуру OVERLAPPED, а по адрессу lpNumberOfBytesRead просто записывается НУЛЬ (в lpNumberOfBytesRead ножно даже NULL записывать, но для совместимости с Win95 я этого не делаю).
Ты сам написал чтоб считывалось 15 символов
ReadFile(hPort,buff,15,&temp,&ov);
Размер передоваемого буффера значения не имет (покрайней мере на моей машине), если он меньше 14 то заполняется по его размеру, если больше только по 14 байт. По данной пречине я и прикрепил тестовый пример (read_port.zip) чтобы попробовали на своей машине и посмотрели по сколько байт извлекается из буффера порта.
Возможно также такое что размер внутр. буфера был равен 14, отсюда такие ошибки и потери данных...
В том то и дело, что потерь данных нет, только иногда проскакивает между входными данными, буфер приема НУЛЕВОГО размера.
При инициализации порта нужно указать требуемые размеры буферов при помощи SetupComm()
Я тоже сначало думал, что этим способом можно изменить размер входного буфера. Но функция GetCommProperties через структуру COMMPROP сообщила, что мой драйвер порта не поддерживает данный способ
dwMaxTxQueue
Specifies the maximum size, in bytes, of the driver's internal output buffer. A value of zero indicates that no maximum value is imposed by the serial provider.
dwMaxRxQueue
Specifies the maximum size, in bytes, of the driver's internal input buffer. A value of zero indicates that no maximum value is imposed by the serial provider.
Да и вообще, функция SetupComm носит рекомендательный характер и драйвер может просто откланить эти данные. Короче, данный способ у меня не дал результатов.
Если тебе нужно узнать сколько байт информации хранится на данный момент в буфере (т.е. то что ещё не было считано ReadFile, но уже считано драйвером из порта) используй ClearCommError(); (в структуре COMSTAT поле cbInQue)
Вот это интересно, но в моем случае когда максимальное количество байт возврашаемых comm-портом равным 14, нет смысла ее использовать.
Я поэтому и прекрепил тестовый пример, что бы погонять его и посмотреть поведение системы на разных машинах. Кстати, на работе машина ведет себя аналогично.