Распространенным способом чтения из нескольких файловых дескрипторов в linux является использование select (). Я предлагаю начать с manpage . Основной системный поток выглядит следующим образом:
1) Инициализация устройств
2) Получить список файловых дескрипторов устройства
3) Установите время ожидания
4) Вызовите select с файловыми дескрипторами и timeout в качестве параметров - он будет блокироваться до тех пор, пока в одном из файловых дескрипторов не появятся данные или не истечет время ожидания
5) Определите, почему select вернулся и действуйте соответствующим образом (то есть вызовите read () для дескриптора файла, в котором есть данные). Возможно, вам придется внутренне буферизовать результат чтения, пока не будет получен целый грамм данных.
6) вернуться к 4.
Это может стать основным циклом ваших программ. Если у вас уже есть другой основной цикл, вы можете запустить вышеописанное без цикла, но вам нужно будет убедиться, что функция вызывается достаточно часто, чтобы вы не потеряли данные на последовательных портах. Вам также следует убедиться, что ваша частота обновления (т. Е. 1 / время ожидания) достаточно быстра для вашей основной задачи.
Select может работать с любым файловым дескриптором, таким как сетевые сокеты, и всем остальным, что предоставляет интерфейс через файловый дескриптор.