Я хочу читать сообщения, отправленные с Arduino через интерфейс FTDI (последовательный) в простой программе на C или C ++ под Linux. Arduino отправляет двухсимвольный заголовок - командный байт, за которым следуют несколько байтов данных в зависимости от команды.
Моя первая попытка состояла в том, чтобы просто опрашивать данные с помощью open () и read (), но это вызывает примерно 12% использования ЦП. Похоже, что это не тот способ ведения дел.
Во-вторых, я прочитал в libevent о реализованном цикле событий, который запускает событие, когда данные присутствуют в дескрипторе файла. Я почти ничего не использовал, но я не мог прочитать все сообщение до того, как было вызвано другое событие. События не срабатывали при получении всего сообщения, но как только какие-либо / некоторые данные были доступны в дескрипторе файла. Глядя на это больше, было очевидно, что это не сработает так, как я этого хотел. Это мой код события: http://pastebin.com/b9W0jHjb
В-третьих, я реализовал буферизованное событие с libevent. Казалось, что он работает несколько лучше, но все же разделил некоторые сообщения. Мой код события: http://pastebin.com/PQNriUCN
В-четвертых, я выбросил libevent и опробовал класс Boost ASIO. Пример, которому я следовал, был http://www.webalice.it/fede.tft/serial_port/serial_port.html. Казалось, что он работал нормально, но «цикл обработки событий» был «while (1) {}», что привело к увеличению загрузки ЦП. Цикл просто проверяет состояние ошибки, в то время как последовательное чтение происходит в обратном вызове в другом потоке. Я добавил usleep (1) в цикл while, и он увеличил загрузку моего процессора до 2%, что нормально, но все же кажется тяжелым для такой легкой программы.
В большинстве примеров libevent и даже базового epoll используются сокеты TCP, которые, похоже, не ведут себя так же, как данные последовательного порта.
Итак, мой главный вопрос: что является хорошим облегченным способом чтения сообщений с последовательного порта без интенсивного опроса? (в Linux, используя C или C ++)