C ++ asyn c получить данные из другой функции - PullRequest
0 голосов
/ 04 марта 2020

Это не кодирование, а в основном архитектурный вопрос ...

Например, у меня есть функция loop(), в которой я получаю данные из какого-то источника (в моем случае UART). Код в значительной степени похож на этот (псевдокод):

loop() {
  auto data = UART.GetData();
  // differ data from each other and push it to corresponding message queue or golang-style channel?
  Console.Print(data);
}

Мне нужно реализовать функцию asyn c REST HTTP, которая будет записывать (упорядочивать) данные из UART и ждать их поступления. Имейте в виду, что другие функции asyn c REST HTTP также могут запрашивать данные из UART и в этот момент. Код функции asyn c REST HTTP будет выглядеть следующим образом:

handler(AsyncRequest &req) {
  UART.RequestNeededData(); // This function returns nothing. Data will be handled in loop() method
  auto data = // somehow get this data from other method, in this case it's loop() (get data from message queue or Golang-style channel?)
  req.SendDataToClient(data);
}

UART использует свой собственный протокол для различения запрошенных данных и ответов. Рассматривайте это как пакеты req / res. Мне нужно передать запрошенные данные из функции handler() обратно в handler().

Надеюсь, вы поняли, что мне нужно сделать, и можете помочь мне с этой проблемой. Прокомментируйте, если у вас есть какие-либо вопросы.

1 Ответ

0 голосов
/ 04 марта 2020

Я решил аналогичную проблему с классом шаблона очереди:

 QueuePendingCommands<char> queue(100); //-> Max 100 chars in this queue

обработчик инициализирует соответствующую очередь и заполняет ее данными

 auto data = UART.GetData();
 if (data = fullfillConditionA )
     if (data != '\n') 
        QueuePendingCommandsA.push(data);
     else
        processResponse(QueuePendingCommandsA);
  else if (data = fullfillConditionB )
     if (data != '\n') 
        QueuePendingCommandsB.push(data);
     else
        processResponse(QueuePendingCommandsB);
 else ....

В моем случае есть определенный окончательный символ (например, '#' или '\ n'), нажатие этого в очередь вызывает очистку очереди и заполнение ответа:

void processResponse (inQueue) {
/** Create response - Drain the queued up commands */
 while (inQueue.count() > 0) {
     strcat(response, inQueue.pop());
   }
 .... Do something with the response
 }

Таким образом, для каждого запроса есть определенная очередь, в которую вы пишете и ответ срабатывает после получения специального символа (также фиксированное количество символов, условие или тайм-аут могут вызвать опустошение очереди)

...