Есть несколько способов сделать это в целом. Вероятно, наилучший выбор зависит от того, какой тип данных вы просматриваете, когда читаете последовательный порт, и от того, как вы хотите устранить ошибки в этих данных.
Первый способ - открыть последовательный файл для блокировки ввода-вывода и выполнить:
while (question) {
write(ser_fd, question.data, question.len);
sleep(1);
ioctl(ser_fd, FIONREAD, &answer.len);
answer.data = realloc(answer.data, answer.len);
read(ser_fd, question.answer, question.answer_len);
question = next(question);
answer = next(answer);
}
Хотя я не занимался обработкой ошибок в этом.
Если вы хотите иметь возможность ожидания ожидания ответа на последовательный порт, то это многое меняет. Вы должны изучить использование системных вызовов select, pselect, poll, ppoll или epoll. Это позволяет вашей программе блокировать (спать) до тех пор, пока не будут готовы данные для чтения. Затем вы можете циклически выполнять опрос и читать до тех пор, пока не завершите свой ответ или не истечет время.
Другой вариант - попытаться использовать SIGIO, но я не рекомендую это. Нелегко сделать это правильно и трудно отладить.
Кроме того, вы можете использовать SIGALRM, чтобы выбить вас из вызова на чтение, чтобы действовать в качестве таймаута для этого.
Если вы пытаетесь использовать процедуры ввода и вывода stdio, тогда это намного сложнее. Вы застрянете с чем-то похожим на первый метод, не имея возможности спросить, сколько данных готово.