Я отправляю команды роботу и жду ответа
Да, что у вас будет работать.
Но вещи начинают становиться интересными, если учесть вероятность того, что робот не ответит по какой-либо причине. Затем вам нужно указать время ожидания ответа. Вскоре начинают появляться другие вещи. Например, вы можете не захотеть застрять в чтении на время ожидания, поскольку вам может потребоваться обслуживать другие события (пользовательский ввод или другие источники) по мере их поступления.
Обычная архитектура для этого - использовать select () и сделать его центром всех ваших входящих событий. Затем вы запускаете конечный автомат (или машины) из этих событий. В итоге вы получаете управляемую событиями архитектуру. Это будет выглядеть примерно так:
while(true)
{
select(fds for event sources, timeout);
if (timeout)
{
call robot state machine(timeout);
continue;
}
iterate through fds
{
if (fd has data)
{
read data into buf
if (fd is for robot)
{
call robot state machine(buf)
}
else if (fd is for source1)
{
call source1 state machine(buf)
}
...
}
}
}
В этой модели отправка может быть выполнена из любого места в коде. Но вы попадаете в select () после, ожидая событий. Кроме того, вам придется выяснить детали правильного тайм-аута и выбрать его в целом, но этого достаточно.