gpt4 book ai didi

c - 如何通过esp32 rmt Ringbuffer接收长数据帧

转载 作者:行者123 更新时间:2023-11-30 14:39:19 25 4
gpt4 key购买 nike

我是新手,正在使用 ESP32 和红外接收器来捕获来自交流红外 Remote 的信号。目前,我引用的捕获IR信号的示例代码如下:

static void nec_rx_init()
{
rmt_config_t rmt_rx;
rmt_rx.channel = RMT_RX_CHANNEL;
rmt_rx.gpio_num = RMT_RX_GPIO_NUM;
rmt_rx.clk_div = RMT_CLK_DIV;
rmt_rx.mem_block_num = 1;
rmt_rx.rmt_mode = RMT_MODE_RX;
rmt_rx.rx_config.filter_en = true;
rmt_rx.rx_config.filter_ticks_thresh = 100;
rmt_rx.rx_config.idle_threshold = rmt_item32_tIMEOUT_US / 10 * (RMT_TICK_10_US);
rmt_config(&rmt_rx);
rmt_driver_install(rmt_rx.channel, 3000, 0);
}
//get RMT RX ringbuffer
RingbufHandle_t rb = NULL;
rmt_get_ringbuf_handle(RMT_RX_CHANNEL, &rb);

// rmt_rx_start(channel, rx_idx_rst) - Set true to reset memory index for receiver
rmt_rx_start(RMT_RX_CHANNEL, 1);

while(rb) {
uint32_t rx_size = 0;
//try to receive data from ringbuffer.
//RMT driver will push all the data it receives to its ringbuffer.
//We just need to parse the value and return the spaces of ringbuffer.
rmt_item32_t* item = (rmt_item32_t*) xRingbufferReceive(rb, &rx_size, 1000);
...
}

虽然从 AC IR Remote 发出的 IR 信号大约有 100 个项目,但我总是看到 rx_size 只有 256(64 个项目)。所以问题是,如何捕获来自 AC IR Remote 的总信号?请注意,我将缓冲区大小设置为从 3000 到 10000。

感谢您为我解决此问题提供的任何建议。

最佳答案

上周我也遇到了同样的问题。我收到了一个 128 位的串行数据包,但只收到了前 64 位。深入研究后,我发现 RMT 接口(interface)上的硬件缓冲区默认为每个 channel 64x32 位 RAM block 。如果您需要一次接收更多数据,您可以将 channel 设置为使用通常分配给后续 channel 的内存块。

对于我的项目,我使用以下函数为 channel 0 提供 4 个 RAM block ,从而将最大接收大小增加到 256 位,这对于我的应用程序来说绰绰有余。我还必须将接收移动到 channel 4,因为 channel 0 现在正在使用 channel 1 的内存块。

rmt_set_mem_block_num((rmt_channel_t) 0, 4);

可以在此处找到此功能的文档: https://docs.espressif.com/projects/esp-idf/en/stable/api-reference/peripherals/rmt.html#_CPPv421rmt_set_mem_block_num13rmt_channel_t7uint8_t

还值得注意的是,在问题发生时,它确实在串行监视器中引发了错误,这确实有助于找到问题的原因。

E (33323) rmt: RMT[0] ERR
E (33323) rmt: status: 0x14000100
E (33373) rmt: RMT RX BUFFER FULL

使用默认 RAM 量时,我收到错误代码 0x14000040,当我将其增加到 2 个 block 时,我收到状态代码 0x13000040。增加到 4 个 RAM block 后,错误消息不再出现。

关于c - 如何通过esp32 rmt Ringbuffer接收长数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56127996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com