【问题标题】:Comparing an usart received uint8_t* data with a constant string将 usart 接收到的 uint8_t* 数据​​与常量字符串进行比较
【发布时间】:2018-10-08 20:49:01
【问题描述】:

我正在开发一个 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; 
}

所以,据我了解,这个函数写入变量bytes,作为一个指针,只要不超过长度。所以我这样称呼它:

 dma_serial1.get(data, 8);

没有将其返回值分配给变量。我认为接收到的值存储到uint8_t* data,但我可能错了。

最后,我要做的是检查接收到的数据是否是某个字符来做出决定,像这样:

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

我怎样才能做到这一点?

【问题讨论】:

    标签: c++ arduino-due atsam3x


    【解决方案1】:

    要比较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'
    

    【讨论】:

    • dma_serial1.get() 函数的第一个参数必须是uint8_t* 类型。但是像这样和你所展示的,它都不会编译。
    • Hm - data[9] 在用作函数参数时将衰减为 uint8_t*。你试过了吗?
    • 是的,我正在尝试。如果我将 data 定义为 uint8_t data[9],当我调用 strcmp(data,"t") 时,它会显示 invalid conversion from 'uint8_t* {aka unsigned char*}' to 'const char*' [-fpermissive],所以它不会编译。
    • @Dan Berezin:对,unsigned 可能会阻碍这里。请参阅扩展答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    相关资源
    最近更新 更多