ESP32自定义串口笔记

一:实现结果

        串口

二:串口自定义中断的意义

        实现更快速的串口数据读取,以及更快速的响应,从而满足项目性能指标

三:实现过程中遇到的坑

        1.IDF版本变更,旧的API函数已失效,旧版API函数如下

    uart_param_config(WIFI_UART_NUM, &uart_config);
    // Set UART pins (using UART0 default pins ie no changes.)
    uart_set_pin(WIFI_UART_NUM, UART2_TX_GPIO_NUM, UART2_RX_GPIO_NUM, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
    //这里是关键点,必须要先uart_driver_install安装驱动,在把中断服务给释放掉
    uart_driver_install(UART_NUM_2, BUF_SIZE * 2, 0, 0, NULL, 0);
    uart_isr_free(UART_NUM_2);
    //重新注册中断服务函数
    uart_isr_handle_t handle;
    uart_isr_register(UART_NUM_2, uart2_irq_handler, NULL, ESP_INTR_FLAG_IRAM, &handle);
	
    //使能串口接收中断
    uart_enable_rx_intr(UART_NUM_2);

        2.新版API查找的思路

                首先从uart.c,uart.h文件查找到uart_driver_install,从此函数找到关于中断的api;跳转到中断相关文件,知道中断函数是通过此函数绑定,剩下就是创建自己的中断函数了。

        PS:一个关键的点是uart_driver_install会申请句柄占据串口中断,必须先释放再重新申请,但是新版的IDF需要通过句柄才能释放,而句柄位于uart.c中的结构体p_uart_obj里,所以为了得到句柄,需要自行在uart.c文件中添加一个函数给外部调用获得中断句柄,最终初始化如下

void Esp32_Uart2_Init(void)
{
    // esp_log_level_set(TAG, ESP_LOG_INFO);
    uart_config_t uart_config =
    {
        .baud_rate = 115200,
        .data_bits = UART_DATA_8_BITS,	//7-8
        .parity = UART_PARITY_DISABLE,	//0 ,2,3
        .stop_bits = UART_STOP_BITS_1,	//1-4s

        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
        .source_clk = UART_SCLK_DEFAULT,
    };


    ESP_LOGI(TAG, "uart driver");
    //uart_driver_install(WIFI_UART_NUM, UART_BUF_SIZE * 2, BUF_SIZE * 2, 0, NULL, 0);
    uart_param_config(UART_NUM_2, &uart_config);
    // Set UART pins (using UART0 default pins ie no changes.)
    uart_set_pin(UART_NUM_2, 17, 16, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
    //这里是关键点,必须要先uart_driver_install安装驱动,在把中断服务给释放掉
    uart_driver_install(UART_NUM_2, UART_BUF_SIZE * 2, 0, 0, NULL, 0);
    intr_handle_t handle;
    handle=uart_get_intr_handle(UART_NUM_2);
    //必须释放出中断函数
    esp_intr_free(handle);
    // Allocate interrupt
    //esp_err_t ret = esp_intr_alloc(ETS_UART2_INTR_SOURCE, ESP_INTR_FLAG_IRAM, uart2_irq_handler, NULL,NULL);
    esp_err_t ret = esp_intr_alloc_intrstatus( ETS_UART2_INTR_SOURCE,  ESP_INTR_FLAG_IRAM,  0,  0, uart2_irq_handler,NULL,NULL);
    if (ret != ESP_OK)
    {
        ESP_LOGI(TAG, "esp_intr_alloc error: %s", esp_err_to_name(ret));

        ESP_LOGI(TAG, "ret error=0x%x", ret);
        return;
    }


    // Enable UART interrupt
    uart_enable_rx_intr(UART_NUM_2);

    //uart_intr_config

    //使能串口接收中断
    uart_enable_rx_intr(UART_NUM_2);
    xTaskCreate(UartTest_Task, "UartTest_Task", 2048, NULL, 16, NULL);
    //esp_intr_alloc_intrstatus

}

四:总结

        最后发现其实,esp32的串口event例程速度也是足够快,只是我用的串口测试软件速度有问题,换成SSCOM可以显示正确的速度
PS:串口调试助手V5.0.2的速度异常,可能是软件内部超时时间设置较大,导致误以为官方例程速度很慢,实际速度有20ms内不丢包

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值