Как сохранить только определенные байты, которые мне нужны, а не все в массиве?

#c #stm32 #uart

Вопрос:

Я получаю от датчика через UART-связь каждые 10 байт в секунду. Но мне не нужны все байты, на самом деле для работы нужны только определенные байты. Теперь я сохраняю все байты в массив, создаю два новых uint8_t и назначаю им байт из буферного массива, который мне нужен.

Есть ли способ получать и сохранять только те байты, которые мне нужны в первую очередь, а не все 10?

 uint8_t buffer[10];

HAL_UART_Receive_DMA(amp;huart4, (uint8_t*)buffer, 10)

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart4)
{
  uint8_t value1 = buffer[4];
  uint8_t value2 = buffer[5];
  .
  .
  .
}
 

Комментарии:

1. Если вы получаете 10 байт из UART, вам нужно прочитать их, точка. Прочитайте все 10 байтов, а затем разберитесь с ними.

2. Если вы настраиваете передачу DMA и обрабатываете свои данные в режиме обратного вызова, как выглядит ваш код, то код, который вы показали, безусловно, ваш лучший выбор.

3. ЕСЛИ бы вы читали символы из файлового дескриптора или потока, используя (скажем) функции из <stdio.h> , у вас были бы другие варианты, но они все равно включали бы явное чтение и отбрасывание ненужных байтов.

4. Для чего этот подозрительный актерский состав? (uint8_t*)buffer

5. Также буферы DMA, как правило, должны быть volatile . Является ли функция ST копированием данных из фактического буфера DMA или ваш массив должен быть этим буфером? Вам также необходимо объявить переменные, совместно используемые с обратными вызовами, как volatile .

Ответ №1:

В режиме DMA вам нужно предоставить буфер полного размера. Другого способа нет, так как прием не контролируется ядром (это делается в фоновом режиме), а контроллер DMA сигнализирует об окончании (объявление, если вы хотите, чтобы половина и условия ошибок) транзакции только

Ответ №2:

Это возможно при простой обработке необработанных прерываний, без каких-либо DMA и (в основном) без причудливых функций HAL.

Вам придется написать ручной обработчик прерываний UART для флага RXNE, который устанавливается, когда UART получает символ signle. Прочитайте его из DR register и решите — сохранить или отказаться от него. Конечно, теперь вам решать, считать все полученные байты и определять условие «конец сообщения».

или

Если ваш код не имеет никакого отношения к получению этого сообщения, используйте

HAL_UART_Receive

Для чтения сообщения байт за байтом