Лучшее решение не спать!То, что я имею в виду, это хорошее решение, вероятно, смешать событие IPC и последовательное событие.выберите хороший инструмент для этого.Затем вы должны найти и механизм IPC, который выбирается совместимым.
- IPC на основе сокета
select()
способен - IPC на основе канала
select()
способен - Вы также можете выбрать очередь сообщений posix
И тогда ваш цикл выглядит следующим образом:
while(1) {
select(serial_fd | ipc_fd); //of course this is pseudo code
if(FD_ISSET(fd_set, serial_fd)) {
parse_serial(serial_fd, serial_context);
if(complete_serial_message)
process_serial_data(serial_context)
}
if(FD_ISSET(ipc_fd)) {
do_ipc();
}
}
read_serial
заменяется на parse_serial
, потому что, если вы тратите все свое время на ожиданиеполный последовательный пакет, тогда все преимущества выбора теряются.Но из вашего вопроса, кажется, вы уже делаете это, так как вы упоминаете получение последовательных данных в двух разных циклах.
С предложенной архитектурой у вас хорошая реактивность как на IPC, так и на последовательной стороне.Вы читаете последовательные данные, как только они становятся доступны, но без остановки обработки IPC.
Конечно, предполагается, что вы можете изменить механизм IPC.Если вы не можете, возможно, вы можете создать «процесс моста», который с одной стороны взаимодействует с любым IPC, с которым вы застряли, а с другой стороны использует select()able
IPC для связи с вашим последовательным кодом.