Сравнивая полученные usart данные uint8_t * с постоянной строкой

Я работаю над Arduino Due, пытаясь использовать функции DMA, так как я работаю над проектом, где скорость критична. Я нашел следующую функцию для получения через серийный номер:

uint8_t DmaSerial::get(uint8_t* bytes, uint8_t length) {

// Disable receive PDC
uart->UART_PTCR = UART_PTCR_RXTDIS;

// Wait for PDC disable to take effect
while (uart->UART_PTSR & UART_PTSR_RXTEN);

// Modulus needed if RNCR is zero and RPR counts to end of buffer
rx_tail = (uart->UART_RPR - (uint32_t)rx_buffer) % DMA_SERIAL_RX_BUFFER_LENGTH;

// Make sure RPR follows (actually only needed if RRP is counted to the end of buffer and RNCR is zero)
uart->UART_RPR = (uint32_t)rx_buffer + rx_tail;

// Update fill counter
rx_count = DMA_SERIAL_RX_BUFFER_LENGTH - uart->UART_RCR - uart->UART_RNCR;

// No bytes in buffer to retrieve
if (rx_count == 0) { uart->UART_PTCR = UART_PTCR_RXTEN; return 0; }

uint8_t i = 0;

while (length--) {

bytes[i++] = rx_buffer[rx_head];

// If buffer is wrapped, increment RNCR, else just increment the RCR
if (rx_tail > rx_head) { uart->UART_RNCR++; } else { uart->UART_RCR++; }

// Increment head and account for wrap around
rx_head = (rx_head + 1) % DMA_SERIAL_RX_BUFFER_LENGTH;

// Decrement counter keeping track of amount data in buffer
rx_count--;

// Buffer is empty
if (rx_count == 0) { break; }
}

// Turn on receiver
uart->UART_PTCR = UART_PTCR_RXTEN;

return i;
}

Итак, насколько я понимаю, эта функция записывает в переменную байтов, в качестве указателя, то, что получено, пока не более длина. Поэтому я называю это так:

 dma_serial1.get(data, 8);

без присвоения возвращаемого значения переменной. Я думаю, что полученное значение сохраняется в uint8_t* data но я могу ошибаться

Наконец, я хочу проверить, являются ли полученные данные определенным символом для принятия решений, например:

if (data == "t"){
//do something//}

Как я мог сделать эту работу?

0

Решение

Для сравнения строк, как задумано if (data == "t")вам понадобится функция сравнения строк, например, strcmp, Чтобы это работало, вы должны убедиться, что аргументы на самом деле (0-концевые) C-строки:

uint8_t data[9];
uint8_t size = dma_serial1.get(data, 8);
data[size]='\0';
if (strcmp(data,"t")==0) {
...
}

В случае, если тип символов по умолчанию в вашей среде signed char, пройти data непосредственно к строковым функциям требуется приведение от неподписанного к подписанному:

if (strcmp(reinterpret_cast<const char*>(data),"t")==0) {
...
}

Таким образом, полный MVCE может выглядеть следующим образом:

int get(uint8_t *data, int size) {
data[0] = 't';
return 1;
}

int main()
{
uint8_t data[9];
uint8_t size = get(data, 8);
data[size]='\0';
if (strcmp(reinterpret_cast<const char*>(data),"t")==0) {
cout << "found 't'" << endl;
}
}

Выход:

found 't'
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]