Не так и не так. И то, и другое приведёт кажущейся простоте, но к разлапистому, трудно отлаживаемому и ещё труднее модифицируемому коду.
Правильно разделить задачу на части и есть слона по частям.
Датчикам нах не нужно знать как, когда и каким запросом их данные куда-то уходят (и уходят ли вообще). Программа, обслуживающая датчика, должна считать с него показания и отдать их программе-обработчику. Всё. Ей незачем знать, что как и когда делает программа обработчик, поэтому она простая как валенок - считала данные - отдала, всё остальное время спит.
Программа обработчик – в данном случае менеджер очереди. Её работа – принять данные от программы работы с датчиком и поставить их в очередь на отправку. А когда поступит запрос от программы отправки, передать ей первый элемент очереди, (освободив его). Что было раньше (откуда взялись данные) и что будет потом (с тем элементом, который она отдала на отправку) её не касается абсолютна. Её дело копить очередь и отдавать по одному элементу, когда попросят. Она тоже простая как валенок.
Программа отправки, раз в 10 секунд (или когда её приспичит – никого другого это не волнует) запрашивает элементы из очереди (пока та не опустеет) и отправляет их по одному или всё оптом (Вы забыли описать протокол) как ей нужно.
Таки образом, имеем три простейших программных модуля, которые не зависят друг от друга и отлаживаются по отдельности. Каждый из них прост и прямолинеен. Проблема в любом из них никак не ломает остальные. Например, при временной потере связи, результаты будут просто копиться в очереди и будут отправлены как только связь восстановится – это не требует никаких действий и никакого внимания ни от каких частей программы, кроме отправщика, остальные о проблеме просто не узнают, т.к. им пофиг. И так же со многими другими возможными проблемами.
Боюсь, только я зря всё это писал. Делать правильно здесь не принято. Скорее, наоборот, иногда поражает к каким усилиям и ухищрениям прибегает человек, только бы не сделать, сдуру, правильно 