NXP MCU 技术论坛
直播中

话多显蠢

10年用户 890经验值
擅长:479461
私信 关注
[问答]

ESP32和AVR UART通信,TX响应率有问题怎么解决?

所以我在 ESP32 和 AVR 芯片之间使用 UART 通信。TX响应率有问题。

AVR 发送 5 个字节,前两个是命令字节,后 3 个是数据字节:
代码:全选
//command
Serial2.write(0x01);
Serial2.write(0x62);
//data
Serial2.write(0x69); //high byte
Serial2.write(0x70); //low byte
Serial2.write(0x71); //data
  
delayMicroseconds(150);

在 ESP 端,它使用 RX 中断获取数据并将其存储到另一个缓冲区,并使用 xTaskResumeFromISR 对接收到的数据执行某些操作:
代码:全选
static void IRAM_ATTR uart_intr_handle(void *arg)
{
    uint16_t i = 0;
    uint16_t rx_fifo_len = 0;
    rx_fifo_len = UART1.status.rxfifo_cnt; // read number of bytes in UART buffer
   
    while(rx_fifo_len){
    rxbuf[i++] = UART1.fifo.rw_byte; // read all bytes

        if(rxbuf == 0x01 && rxbuf[i+1] == 0x62){
            dataBuff[0] = rxbuf[i + 2];
            dataBuff[1] = rxbuf[i + 3];
            dataBuff[2] = rxbuf[i + 4];

            xTaskResumeFromISR(xHandle);
        }

        if(rxbuf == 0x02 && rxbuf[i+1] == 0x63){
            // xTaskResumeFromISR(xHandle2);
        }

        rx_fifo_len--;
    }
    uart_clear_intr_status(EX_UART_NUM, UART_RXFIFO_FULL_INT_CLR|UART_RXFIFO_TOUT_INT_CLR);
}



这是处理数据的函数:
代码:全选
void task(void *arg){
    while(1){
        char writeAddress[6];
        uint16_t tempAddress = dataBuff[1] | (dataBuff[0]<<8);
        uint8_t writeData = dataBuff[2];

        sprintf(writeAddress, "%d", tempAddress);
        ESP_LOGE("uart", "Address: %s, %x", writeAddress, writeData);
        
        //not implemented yet, but here is where data will be stored into esp nvs
        //and send 0x01 back to AVR so it knows that datas has been stored succesfully

        uart_write_bytes(EX_UART_NUM, &txDataBuff[1], 1);

        vTaskSuspend(NULL);
    }
}

我得到的数据是正确的,这里是 ESP_LOGE 的一瞥:
代码:全选
E (2290198) uart: Address: 26992, 71
E (2290198) uart: Address: 26992, 71
E (2290208) uart: Address: 26992, 71
E (2290208) uart: Address: 26992, 71
E (2290218) uart: Address: 26992, 71
E (2290218) uart: Address: 26992, 71

所以我的问题是 uart_write_bytes() 大约需要 5 毫秒(所以这也意味着函数需要 5 毫秒才能完成?

:只需发送每 ~30 个数据包。
我假设它与恢复任务需要多长时间有关,或者另一个任务正在中断此任务?
我怎样才能增加响应时间?
您的回复将不胜感激





更多回帖

发帖
×
20
完善资料,
赚取积分