27- ESP32-S3 USB虚拟串口(USB-OTG 外设介绍)

ESP32-S3 USB虚拟串口详解

USB-OTG 外设介绍

USB-OTG:
USB-OTG是一种USB规范,允许嵌入式系统(如手机、平板电脑、单片机系统等)在没有主机(如个人电脑)的情况下直接相互通信,同时也能够作为传统USB主机或设备操作。这意味着一个带有USB-OTG功能的设备可以扮演两种角色:主机角色(Host)和外设/设备角色(Peripheral)。当作为主机时,它可以连接并控制其他USB设备(如U盘、键盘、鼠标等);作为外设时,则可被主机(如PC)控制。USB-OTG的核心在于其双角色能力,以及通过一个micro-AB插口或Type-C接口来自动协商连接设备的角色。

ESP32-S2/S3 等芯片内置 USB-OTG 外设,它包含了 USB 控制器和 USB PHY,支持通过 USB 线连接到 PC,实现 USB Host 和 USB Device 功能。

而ESP32-S3通过USB-OTG接口就可以实现USB虚拟串口(CDC-ACM类)功能。

什么是USB虚拟串口?

USB虚拟串口是一种可以让微控制器(如ESP32-S3)通过USB接口与电脑进行串口通信的技术。它的工作原理是在微控制器和电脑之间建立一个虚拟的串口通道,使得电脑可以像操作串口设备一样操作USB设备。同时无需 USB 至 UART 桥,便可直接烧录设备。
请添加图片描述

ESP32 IDF 的 USB 驱动库

ESP-IoT-Solution是一个包含常用外设驱动和代码框架的物联网系统解决方案。它可以作为ESP-IDF的补充组件,让用户能够更轻松地进行开发。

ESP-IoT-Solution

在ESP-IoT-Solution中我们需要使用到TinyUSB这个库,这是 ESP 官方为 USB 打造的一个 USB 驱动库
在这里插入图片描述
添加 ESP-IoT-Solution 指定组件到工程目录:可直接在工程的 CMakeLists.txt 中添加以下代码:

set(EXTRA_COMPONENT_DIRS "${EXTRA_COMPONENT_DIRS} ${IOT_SOLUTION_PATH}/components/{component_you_choose}")

或者可以复制 ESP-IoT-Solution 指定组件到工程目录:直接将该组件和其依赖的组件,复制粘贴至工程的 components 文件夹。

TinyUSB库API使用

我们使用ESP32-S3通过USB提供一个虚拟串口服务,进而实现发送字符串然后接收并回发相同字符串的功能

1. 安装驱动程序:

    const tinyusb_config_t tusb_cfg = {
        .device_descriptor = NULL,
        .string_descriptor = NULL,
        .external_phy = false,
        .configuration_descriptor = NULL,
    };

    // 初始化TinyUSB驱动
    ESP_ERROR_CHECK(tinyusb_driver_install(&tusb_cfg));

2. 初始化USB CDC ACM:

    tinyusb_config_cdcacm_t acm_cfg = {
        .usb_dev = TINYUSB_USBDEV_0,
        .cdc_port = TINYUSB_CDC_ACM_0,
        .rx_unread_buf_sz = 64,
        .callback_rx = tinyusb_cdc_rx_callback, // 注册接收回调
        .callback_rx_wanted_char = NULL,
        .callback_line_state_changed = NULL,
        .callback_line_coding_changed = NULL
    };

    // 初始化USB CDC ACM
    ESP_ERROR_CHECK(tusb_cdc_acm_init(&acm_cfg));

3. 注册回调函数:

// 回收数据的回调函数
static void tinyusb_cdc_rx_callback(uint8_t itf, uint8_t* data, uint16_t len) {
    ESP_LOGI(TAG, "Received %d bytes of data: %.*s", len, len, data);
    
    // 尝试将接收到的数据原样回传
    if (tinyusb_cdc_acm_write(itf, data, len) != ESP_OK) {
        ESP_LOGE(TAG, "Failed to send received data back");
    }
}

tinyusb_cdcacm_register_callback(TINYUSB_CDC_ACM_0, CDC_EVENT_LINE_STATE_CHANGED, &tinyusb_cdc_rx_callback)

完整示例

#include "esp_log.h"
#include "esp_err.h"
#include "tinyusb.h"
#include "tusb_cdc_acm.h"

static const char* TAG = "USB_CDC";

// 回收数据的回调函数
static void tinyusb_cdc_rx_callback(uint8_t itf, uint8_t* data, uint16_t len) {
    ESP_LOGI(TAG, "Received %d bytes of data: %.*s", len, len, data);
    
    // 尝试将接收到的数据原样回传
    if (tinyusb_cdc_acm_write(itf, data, len) != ESP_OK) {
        ESP_LOGE(TAG, "Failed to send received data back");
    }
}

void tud_usb_usart(void) {
    ESP_LOGI(TAG, "USB initialization");

    const tinyusb_config_t tusb_cfg = {
        .device_descriptor = NULL,
        .string_descriptor = NULL,
        .external_phy = false,
        .configuration_descriptor = NULL,
    };

    // 初始化TinyUSB驱动
    ESP_ERROR_CHECK(tinyusb_driver_install(&tusb_cfg));

    tinyusb_config_cdcacm_t acm_cfg = {
        .usb_dev = TINYUSB_USBDEV_0,
        .cdc_port = TINYUSB_CDC_ACM_0,
        .rx_unread_buf_sz = 64,
        .callback_rx = tinyusb_cdc_rx_callback, // 注册接收回调
        .callback_rx_wanted_char = NULL,
        .callback_line_state_changed = NULL,
        .callback_line_coding_changed = NULL
    };

    // 初始化USB CDC ACM
    ESP_ERROR_CHECK(tusb_cdc_acm_init(&acm_cfg));

   
    ESP_ERROR_CHECK(tinyusb_cdcacm_register_callback(TINYUSB_CDC_ACM_0, CDC_EVENT_LINE_STATE_CHANGED, &tinyusb_cdc_rx_callback));

    ESP_LOGI(TAG, "USB initialization DONE");
}

void app_main() {
    ESP_LOGI(TAG, "App started");
    tud_usb_usart(); // 在应用程序启动时初始化USB
    while(1) {
        // 应用程序主循环
        vTaskDelay(pdMS_TO_TICKS(1000)); // 延时1秒
    }
}

总结

除了模拟串口,USB-OTG 外设还有许多其他功能。

例如,它可以支持连接 USB 存储设备,让用户轻松扩展设备的存储容量。此外,它还能作为 USB 音频设备,让用户连接耳机或扬声器,享受高质量音乐。另外,它还支持 USB 打印机模式,使用户能够直接从设备上打印文档。此外,USB-OTG 还可以作为方便的文件传输工具,当需要传输数据时,用户可以快速共享文件。还有更多功能…

参考资料
ESP IDF USB设备驱动程序
ESP-IoT-Solution
外设/USB/设备/tusb_serial_device

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/631530.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PG Vacuum 空间管理工具与pg_freespacemap使用

1.什么是Vacuum: PG pageinspect使用与块空间清理学习-CSDN博客 之前说过PG块更新的特点:先删除后插入,但老元组并不会真正删除,只是把老元组标记为删除状态,这就导致了PG中会有大量的垃圾数据,update所造成的资源消…

train_gpt2_fp32.cu - main

llm.c/test_gpt2_fp32.cu at master karpathy/llm.c (github.com) 源码 // ---------------------------------------------------------------------------- // main training loop int main(int argc, char *argv[]) {// read in the (optional) command line argumentsco…

API数据对接:本地缓存与日志记录的重要性

关键词:数据治理项目、API接口、数据中心、第三方系统、数据异常、本地缓存、日志记录、数据整合、多源异构数据、数据处理效率 阅读建议: 对于数据治理、API接口和系统集成领域的专业人士,本文深入剖析了本地缓存和日志记录在确保系统稳定性…

ArcGI基本技巧-科研常用OLS, GWR, GTWR模型实现

ArcGI基本技巧-科研常用OLS, GWR, GTWR模型实现 OLS,GWR,GTWR回归模型均可以揭示解释变量对被解释变量的影响且可以进行预测。Ordinary Least Squares (OLS)是最小二乘法,Geographically Weighted Regression (GWR)是地理加权回归,Geographically and T…

pytorch-8 单层神经网络及激活函数

一、单层回归网络:线性回归 1. tensor手动实现单层回归神经网络的正向传播 # tensor手动实现单层回归神经网络的正向传播 import torch from torch.nn import functional as FX = torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype = torch.float32) # 特征张量 w =…

青少年CTF练习平台Crypto题解

四重加密 下载附件后,得到一个rar文件,发现被加密,无法解压 使用Bandizip打开 注释中有段编码OFZW4Y3UMY CyberChef base64解码得到第一层压缩包密码 qsnctf 打开后有一个文本文档 内容如下 NCR,HTML解码 得到一串密…

基于Vue和uni-app的增强型单选ccRadioView组件开发

标题:基于Vue和uni-app的增强单选组件ccRadioView的设计与实现 摘要:本文将详细介绍如何使用Vue和uni-app构建一个简单、好用且通用的单选框组件ccRadioView。该组件提供了单选列表的功能,并支持反向传值,方便开发者快速实现单选…

Qwen学习笔记3:Qwen模型调用外部API实现模型增强(openai的形式)

前言 本文记录了使用本地部署的Qwen模型,调用外部API实现模型的功能增强,非常的易用,大家用于开发自己的应用,只需要作简单的修改就可以进行使用了。 本文的代码来源视频教程: Qwen大模型变强了,通过API…

JavaSE——集合框架一(3/7)-List系列集合:特点、方法、遍历方式、ArrayList集合的底层原理

目录 List集合 特点、特有方法 实例演示 List集合支持的遍历方式 ArrayList集合的底层原理 List集合 我们要了解List集合三点: 有什么特点?是否有特有功能?适合什么业务场景? 特点、特有方法 List系列集合特点&#xff1a…

互联网上的IP地址定位的应用及意义

在当今高度互联的数字时代,IP地址定位技术发挥着重要作用,帮助企业、机构和个人在多种应用场景中提高效率、保障安全和优化服务。IP数据云将深入探讨IP地址定位技术的具体应用及其实际意义。 什么是IP地址定位? IP地址定位IP数据云 - 免费IP…

vue+elementui地址选择器-三级联选择器+详细地址实现国内地址选择

在页面的显示情况 前端拼接实现存储 具体实现步骤 1.安装中国全省市区的数据 在命令提示符窗口使用管理员身份进入对应vue项目的文件夹,在窗口安装 npm install element-china-area-data -S2.在script内引入安装的数据 import {regionData,codeToText } from…

android绘制多个黑竖线条

本文实例为大家分享了android绘制多个黑竖线条展示的具体代码,供大家参考,具体内容如下 1.写一个LinearLayout的布局,将宽度写成5dp将高度写成match_parent. 2.在写一个类继承LinearLayout,用LayoutInflater实现子布局的在这个L…

tomcat--应用部署

tomcat根目录结构 Tomcat中默认网站根目录是/usr/local/apache-tomcat-8.5.100/webapps/在Tomcat的webapps目录中,有个非常特殊的目录ROOT,它就是网站默认根目录。将eshop解压后的文件放到这个/usr/local/apache-tomcat-8.5.100/webapps/ROOT中。bbs解压…

报错:(idea端口被占用)Web server failed to start. Port 9090 was already in use.

cmd里面输入: netstat -ano|findstr "9090" 可以看到pid是9644 然后再打开任务管理器

大模型MoE技术深度解读,引领AI走向新高度

大模型系列之解读MoE Mixtral 8x7B的亮相,引领我们深入探索MoE大模型架构的奥秘。MoE究竟是什么?一起揭开它的神秘面纱。 1. MoE溯源 MoE,源自1991年的研究论文《Adaptive Mixture of Local Experts》,与集成学习方法相契合&…

YOLO中yaml文件解读

YOLO中yaml文件解读 当我们使用yolo系列去做视觉方面的研究时,都会进行模型的训练,在yolo基础上进行模块的替换之后需要设置对应的yaml文件,但是yaml文件中的参数分别代表什么,应该如何调试是至关重要的。 参数解读 如下所示是…

贷款借钱平台 贷款源码 小额贷款系统 卡卡贷源码 小额贷款源码 贷款平台

贷款平台源码/卡卡贷源码/小贷源码/完美版 , 数据库替换application/database.php 源码下载:https://download.csdn.net/download/m0_66047725/89268533 更多资源下载:关注我。

Java项目:基于ssm框架实现的家政服务网站管理系统分前后台(B/S架构+源码+数据库+毕业论文+答辩PPT)

一、项目简介 本项目是一套基于ssm框架实现的家政服务网站管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 二、技术实现 jdk版本:1.…

Elasticsearch的并发控制策略

文章目录 利用external对版本号进行外部控制利用if_seq_no和if_primary_term作为唯一标识来避免版本冲突 ES中的文档是不可变更的。如果你更新一个文档,会将就文档标记为删除,同时增加一个全新的文档。同时文是的version字段加1内部版本控制 If_seq_no If_primary_term 使用外…

大模型对数据库运维的赋能:智能运维的新时代

引言随着人工智能技术的飞速发展,大模型作为AI领域的前沿技术,已经开始在数据库运维(DBA)领域展现出其独特的价值。大模型的引入,不仅提升了数据库运维的效率,还极大地改善了运维的质量和智能化水平。本文将深入分析大模型在数据库…