首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何利用esp32远程测试环形缓冲区接收长数据帧

如何利用esp32远程测试环形缓冲区接收长数据帧
EN

Stack Overflow用户
提问于 2019-05-14 18:11:47
回答 1查看 1K关注 0票数 0

我是一个新手,我正在玩ESP32和红外线接收器来捕捉来自交流红外线遥控器的信号。目前,我引用用于捕获IR信号的示例代码如下:

代码语言:javascript
运行
复制
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);
}
代码语言:javascript
运行
复制
//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);
...
}

虽然从交流红外遥控器发出的红外信号大约是100条,但我总是看到rx_size只有256条(64条)。所以这是一个问题,我如何从AC IR遥控器捕获总信号?请注意,我将缓冲区大小从3,000设置为10000。

为了解决这个问题,我非常感谢您给我的任何建议。

EN

Stack Overflow用户

发布于 2020-02-13 03:50:55

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

对于我的项目,我使用以下函数将4个RAM块分配给通道0,从而将最大接收大小增加到256位,这对我的应用程序来说绰绰有余。我还必须将接收移动到通道4,因为通道0现在正在使用通道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

同样值得注意的是,当问题发生时,它确实在串行监视器中抛出了一个错误,这确实有助于找到问题的原因。

代码语言:javascript
运行
复制
E (33323) rmt: RMT[0] ERR
E (33323) rmt: status: 0x14000100
E (33373) rmt: RMT RX BUFFER FULL

使用默认的内存大小,我得到的错误代码是0x14000040,当我将其增加到2个数据块时,我得到的状态代码是0x13000040。增加到4个RAM块后,错误信息停止出现。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56127996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档