Чтение последовательных данных без высокой загрузки ЦП

Я хочу читать сообщения, отправленные с Arduino через (последовательный) интерфейс FTDI в простой программе на C или C ++ под Linux. Arduino отправляет двухсимвольный «заголовок», байт команды, за которым следует несколько байтов данных в зависимости от команды.

Моя первая попытка состояла в том, чтобы просто опросить данные с помощью open () и read (), но это привело к примерно 12% загрузки процессора.

Во-вторых, я прочитал о libevent, где реализован цикл обработки событий, который запускает событие, когда данные присутствуют в файловом дескрипторе. Мой процессор почти не использовался, но я не мог прочитать все сообщение до вызова другого события. События срабатывают не при получении всего сообщения, а при появлении каких-либо данных в файловом дескрипторе. При более внимательном рассмотрении было очевидно, что это не будет работать так, как я хотел. Это мой код события: http://pastebin.com/b9W0jHjb

В-третьих, я реализовал буферизованное событие с помощью libevent. Казалось, это работает несколько лучше, но некоторые сообщения все же разбиваются. Мой код события: http://pastebin.com/PQNriUCN

В-четвертых, я сбросил libevent и опробовал класс ASIO Boost. Я следовал примеру http://www.webalice.it/fede.tft/serial_port/serial_port.html . Казалось, что все работает нормально, но «цикл событий» был «while (1) {}», что снова привело к увеличению загрузки ЦП. Цикл просто проверяет статус ошибки, в то время как последовательное чтение происходит в обратном вызове в другом потоке. Я добавил usleep (1) в цикл while, и это увеличило загрузку процессора до 2%, что нормально, но все еще кажется тяжелым для такой легкой программы.

Большинство примеров libevent и даже лежащий в основе epoll используют TCP сокеты, которые, кажется, не ведут себя так же, как данные последовательного порта.

Итак, мой главный вопрос: каков хороший легкий способ чтения сообщений из последовательного порта без интенсивного опроса? (в Linux, используя C или C ++)

6
задан darkadept 12 August 2011 в 04:15
поделиться