Я хочу читать входящие данные последовательного порта и обрабатывать их (Windows: native C++). Но у меня есть две проблемы:
1- Что мне следует добавить как nNumberOfBytesToRead в ReadFile:
ReadFile( hCom, buffer, nNumberOfBytesToRead, &read, NULL );
Если я поставлю 50 и 40 байт, ReadFile не вернется. Потому что ему нужно еще 10 байтов. Если я поставлю 1, мое приложение не будет оптимизировано. Какое лучшее число? Что мне делать?
2- Когда я хочу выйти из своего приложения, и если никакие данные не поступают через последовательный порт, ReadFile будет заблокирован без возврата. Поэтому я не могу закрыть его правильно, используя CloseHandle. Как я могу заставить ReadFile возвращаться, ожидая данные через последовательный порт?
Когда вы открываете порт, вы должны использовать SetCommTimeouts. Тайм-аут чтения подобен настройке задержки: как долго ReadFile должен ждать до возвращения, если входящие данные приостанавливаются. Размер вашего буфера и тайм-аут для количества миллисекунд, которые вы готовы подождать, прежде чем обрабатывать все, что он получил.
1 - нет лучшего числа. Для чтения данных из порта лучше использовать другую стратегию ввода-вывода, например перекрытие ввода-вывода. Вот пример кода.
2 - В этом случае вы можете и должны закрыть его при вызове CloseHandle. Когда вы это сделаете, любые потоки, заблокированные на ReadFile или другой API блокировки, с помощью только что закрытого вами дескриптора, просыпаются, получая неудачный код результата.