Непрерывный анализ последовательных данных - есть ли лучший подход? - PullRequest
0 голосов
/ 01 мая 2020

Я пишу приложение для драйвера usart для получения последовательных данных и их использования. для этого у меня есть al oop, который постоянно проверяет ввод, и после нажатия «enter» выход ISR (не показан) завершается, и мы возвращаемся в main. Затем мы анализируем вновь введенные данные из arr, который содержит кучу различных входных данных.

, если вы постоянно получаете входные данные от пользователя, создаете временные переменные, как я делал для хранения слишком много проанализированных строк. излишество? Можно ли сделать это лучше?

char arr[30], temp[30], parsedData[30];
char *ptr = arr; // increments for each byte received
char *prevPtr = arr;
Usart usart;

void receive_data(Usart *usart) {
   *usart = data_register;
   usart++;
}

int main() {
    usart.rx_buffer = arr;
    // other init...

    while (true) {
      receive_data(&usart); // populates `arr`
      strncpy(temp, arr, (ptr-prevPtr));   // copy the newly entered bytes into `temp`

      // now parse until '\r'
      const *end = ststr(temp, "\r");
      strncpy(parsedData, temp, (end-temp));  
      // do whatever with parsedData now...
    }
}

/* example of how `arr` would look like as we receive inputs
first attempt: `acceleration\r` // parse acceleration
second attempt: `acceleration\rtemperature\r` // parse temperature
*/
...

1 Ответ

0 голосов
/ 01 мая 2020

Может ли это быть сделано лучше?

"Как только" ввод "нажал, ISR (не показан) выходит, и мы вернулись в основной" наиболее необычно .

Я не знаком с Usart, чтобы предлагать более авторитетно.

Более распространенная парадигма - хранить входящие данные в циклической очереди и увеличивать счет при поступлении '\n' и счет байтов в очереди.

Читатель, чем убывает, как только он их выводит.

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

Ключевым недостатком подхода OP является предположение, что основной код выполнит все после того, как '\n' поступит еще до того, как начнется следующее сообщение. Я бы на это не рассчитывал.


ИМО, код нарушается разными способами:

Нет нулевого символа

ststr(temp, "\r"); ожидает, что temp будет содержать '\0' после последнего введенного символа. Вместо этого он имеет остатки от предыдущего и склонен к переполнению буфера.

Гораздо лучше обрабатывать входящие данные как байты массива, чем C строка .

Отсутствует код?

Ниже указано «приращение для каждого полученного байта», но нет кода, который указывает, что.

Отсутствует код?

Ничто не указывает usart прекращает заполнение arr при 30 байтах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...