【PC电脑windows-学习样例tusb_serial_device-ESP32的USB模拟串口程序+VScode建立工程+usb组件添加+-基础样例学习】
【PC电脑windows-学习样例tusb_serial_device-ESP32的USB模拟串口程序-基础样例学习】
- 1、概述
- 2、实验环境
- 3-1、 物品说明
- 3-2、所遇问题:ESP32 cannot open source file "tinyusb.h"或者“tinyusb.h:No such file or directory ....”
- 3-3、解决问题:被抛弃,变成组件了,需要添加组件
- 4、自我总结
- 5、本次实验说明
- 6、实验过程
- (1)复制目录到桌面
- (2)VScode建立工程-详细步骤
- 1:命令模式,建立模板
- 2:建立
- 3:选择文件夹
- 4:选择模板APP
- 5:如此就会出现一个模板了
- (3)手动敲写代码
- 1:选择端口
- 2:选择芯片
- 3:编译
- 4:加入组件-解决问题演示
- 5:使能usb模拟串口
- (4)加入信息解析部分
- (5)串口验证
- 7、代码连接
- 8、相关细节
- (1)相关官方文档:USB外设说明
- (2)github上相关说明与代码
- (3)编译环境配置
- (4)练习回复信息,报错,代码写法问题。
- (5)其他错误:误导的博客,注意自查
- (6)没有文件build.ninja
- (7)命令行尝试,历史截图
- 9、总结
1、概述
最为新手,想要快速入门相关设备,比如ESP32,可能最好的方式就是直接手动去敲一遍代码,而USB模拟串口其中一个应用,自己作为新手,虽然只是简单运行这个历程,但是认为依然有记录的价值。自己感觉官网样例还是有点晦涩难懂,今天我们就是学习这个样例。
2、实验环境
ESP32说明:ESP32-S3 是一款集成 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE) 的 MCU 芯片,支持远距离模式 (Long Range)。ESP32-S3 搭载 Xtensa® 32 位 LX7 双核处理器,主频高达 240 MHz,内置 512 KB SRAM (TCM),具有 45 个可编程 GPIO 管脚和丰富的通信接口。ESP32-S3 支持更大容量的高速 Octal SPI flash 和片外 RAM,支持用户配置数据缓存与指令缓存。
硬件信息:开发板 ESP32-S3-DevKitM-1(EPS32-S3-wroom-1模块)
其它硬件:杜邦线,两个usb-type-c连接线。
3-1、 物品说明
ESP32对自己来说还是比较新的,最近也是刚刚接触,这里对自己使用ESP32进行简单说明。
博文链接:【在英伟达nvidia的jetson-orin-nx和PC电脑ubuntu20.04上-装配ESP32开发调试环境-基础测试】
另外如果对ESP32相关型号比较感兴趣,可以去官网查看,或者找些资。
官网文档:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s3/hw-reference/esp32s3/user-guide-devkitm-1.html
3-2、所遇问题:ESP32 cannot open source file "tinyusb.h"或者“tinyusb.h:No such file or directory …”
在运行过程中,发现报错如下:
3-3、解决问题:被抛弃,变成组件了,需要添加组件
文档说明链接:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s3/migration-guides/release-5.x/5.0/removed-components.html?highlight=tinyusb%20h
相关链接:https://components.espressif.com/components/espressif/esp_tinyusb
具体命令
idf.py add-dependency esp_tinyusb~1.4.2
这块 自己也反复重试才通过的,运行上述命令后,如下图所示
重新编译,可以看到多了文件,就是添加进来的组件
4、自我总结
(1)本案例难点:问题相关
自己认为本样例难点,不是说练习代码或者理解代码,而是如何解决问题。如果你拿样例直接编程,不会出现任何问题,但是自己手动重建时,必然会遇到,而网上对这个说的比较少。
(2)USB模拟串口会覆盖掉原本串口,下载需要复位启动
因为使用USB模拟串口,USB原本是用来下载的,所以使用本次样例,USB连接的串口,会变成另一个串口,下载的时候,要重新复位才可以。
(3)自己增加恢复信息的代码
自己的尝试的时候,想着,如何发送消息为特定时候,ESP32会回一些消息。也遇到了一些问题,经过大佬指导,也顺利解决了,这主要自己对基础语法不熟练吧,也能体现练习必要性。
(4)样例说明
本样例,就是你发送什么信息,ESP32的模拟串口,收到后,就会回复给你什么信息。
5、本次实验说明
本次实验是使用样例tusb_serial_device,直接复制一份在桌面,然后手动敲写一遍。
然后加入了一些自己的设定,收到自己的规定的字符的时候,不是回复对应信息,而是回复特定信息。
自己在另一台电脑上,安装在D盘,找如下目录。
D:\Espressif\frameworks\esp-idf-v5.1.1\examples\peripherals\usb\device\tusb_serial_device
6、实验过程
(1)复制目录到桌面
(2)VScode建立工程-详细步骤
我们重新使用使用VScode建立一个工程。
相关环境可以看这个:
【ESP32-PC电脑windows-环境搭建-记录-hello-world-运行基础样例学习】
1:命令模式,建立模板
2:建立
3:选择文件夹
可以看到我这里有了,没有选择一个。
4:选择模板APP
5:如此就会出现一个模板了
在文件夹下,VScode就会添加一些文件,
(3)手动敲写代码
我们重新使用使用VScode建立一个工程。
我们可以继续需要VScode,进行练习代码了。
在main.c里加入手动桥写。
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <assert.h>
#include "freertos/FreeRTOS.h"
#include "freertos/semphr.h"
#include "freertos/task.h"
#include "freertos/timers.h"
#include "nvs_flash.h"
#include "esp_event.h"
#include "esp_netif.h"
#include "esp_wifi.h"
#include "esp_log.h"
#include "esp_system.h"
#include "esp_now.h"
#include "esp_crc.h"
#include "tinyusb.h"
#include "tusb_cdc_acm.h"
#include "sdkconfig.h"static const char *TAG = "example";
static uint8_t buf[CONFIG_TINYUSB_CDC_RX_BUFSIZE+1];
//static const char buf_send = "12345\n";
//static uint8_t buf_send="abcdef";
//const uint8_t *buf_send='12345';
//const uint8_t *buf_send='12345';
const uint8_t buf_send[]="ABCD78654321";void tinyusb_cdc_rx_callback(int itf,cdcacm_event_t *event){size_t rx_size=0;//size_t send_data_size=sizeof(buf_send);size_t send_data_size=strlen(&buf_send);//printf("Hello,USB Serial_rx_callback!\n");//ESP_LOGI(TAG,"Hello,USB Serial_rx_callback!\n");esp_err_t ret=tinyusb_cdcacm_read(itf,buf,CONFIG_TINYUSB_CDC_RX_BUFSIZE,&rx_size);if(buf[0]==0x31 && buf[1]==0x32 && buf[2]==0x33 ){tinyusb_cdcacm_write_queue(itf,buf_send,send_data_size); tinyusb_cdcacm_write_flush(itf,0);}else{tinyusb_cdcacm_write_queue(itf,buf,rx_size);tinyusb_cdcacm_write_flush(itf,0);}if(ret==ESP_OK){ESP_LOGI(TAG,"Data from channel %d:",itf);ESP_LOG_BUFFER_HEXDUMP(TAG,buf,rx_size,ESP_LOG_INFO);}else{ESP_LOGE(TAG,"Read error");}// tinyusb_cdcacm_write_queue(itf,&buf_send,9);}void tinyusb_cdc_line_state_changed_callback(int itf,cdcacm_event_t *event){int dtr=event->line_state_changed_data.dtr;int rts=event->line_state_changed_data.rts;ESP_LOGI(TAG,"Line state_changed on channel %d: DTR:%d, RTS:%d",itf,dtr,rts);}void app_main(void)
{//初始化 USB的串口// printf("Hello,USB Serial!\n");// while(1){// printf("output data:this is my app_usb_uart_test_wifi_test!\n");// vTaskDelay(pdMS_TO_TICKS(1000));// printf("test_wifi_file_tinyUSB.c_file!\n");// vTaskDelay(pdMS_TO_TICKS(1000));// }ESP_LOGI(TAG,"USB initialization");const tinyusb_config_t tusb_cfg = {.device_descriptor = NULL,.string_descriptor = NULL,.external_phy = false ,.configuration_descriptor = NULL,};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, //the first way to register a callback.callback_rx_wanted_char = NULL,.callback_line_state_changed = NULL,.callback_line_coding_changed = NULL };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_line_state_changed_callback));#if (CONFIG_TINYUSB_CDC_COUNT > 1)acm_cfg.cdc_port = TINYUSB_CDC_ACM_1;ESP_ERROR_CHECK(tinyusb_cdc_acm_init(&acm_cfg));ESP_ERROR_CHECK(tinyusb_cdcacm_register_callback(TINYUSB_CDC_ACM_1,CDC_EVENT_LINE_STATE_CHANGED,&tinyusb_cdc_line_state_changed_callback));#endifESP_LOGI(TAG,"USB_initialization DONE");}
然后自己手都敲写一遍。
1:选择端口
最好保证你只是连接一个esp32USB串口,一般没下代码的话,出现的串口就是下载端口。
如下,确保你的USB相关接口,连接的是USB上
而一般如你个下载过代码后,或者拿到手了时候,已经不是下载端口,或者说,已经是模拟串口了,该怎么能,就需要重新复位下ESP32.
复位后,立刻使用串口工具查看,这样出现的端口,就是下载端口。
然后我们在VScode选择串口
2:选择芯片
之后就是选择芯片了,这就像进行如下的命令
选择匹配的型号
选择下载方式
然后软件就会帮助我们,建立文件夹“build”。
加入编译需要文件
3:编译
对于命令行下,其实就是命令
idf.py build
编译过程如下
4:加入组件-解决问题演示
一般不出意外,都会出现错误,告诉你没有发现这个tusbxxx相关文件。
如果在"ESP-IDF 5.0 PowerShell"编译也是一样的
我们使用命令行进行加入组件。
具体命令
idf.py add-dependency esp_tinyusb~1.4.2
重新编译,可以看到多了文件,就是添加进来的组件
5:使能usb模拟串口
如下,报错,意思也很明显,需要使能,在menuconfig下设置
命令:
idf.py menuconfig
选择component config->TinyUSB Stack->com…
如下目录,这里也就不截图太多了,按照目录找吧
然后重新编译
(4)加入信息解析部分
可这块自己也是反了很多低级错误,或者说是对c代码写法不熟悉,最后大佬指点才弄明白吧。
如下代码,如果发的字符有“123(十六进制就是31 32 33)”,那么就返回字符串“ABCD…”
(5)串口验证
下载成功后,按下复位键,验证
(1)
(2)
可以看到如字符串首位是123,那么会回复自定义字符,如果开头是ABCD,那就回原始数据。
7、代码连接
代码链接:https://download.csdn.net/download/qq_22146161/88502147
8、相关细节
(1)相关官方文档:USB外设说明
https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32s3/api-reference/peripherals/usb_device.html?highlight=usb
(2)github上相关说明与代码
连接:https://github.com/espressif/esp-idf/tree/8fc8f3f479/examples/peripherals/usb/device/tusb_serial_device
(3)编译环境配置
相关配置情况自己的其他文章:【ESP32-PC电脑windows-环境搭建-记录-hello-world-运行基础样例学习】
(4)练习回复信息,报错,代码写法问题。
如下,自己对代码不熟练,总是提示一些写法问题。
(5)其他错误:误导的博客,注意自查
相关链接:https://blog.csdn.net/oHuanCheng/article/details/127203208
按照网上教程,说是解决找不到文件“”
结果尝试后,引入了其他问问题。
(6)没有文件build.ninja
如下图
一般需要重新设置下芯片。
命令:
(7)命令行尝试,历史截图
如下图,是自己在终端上所做的尝试,前面VScode构建工程,后面"ESP-IDF 5.0 PowerShell"添加组件和编译下载什么的。
Id CommandLine-- -----------1 cd C:\Users\Admin\Desktop\esp_32_work\now_test_tusb_serial_device\template-app2 idf.py add-dependency esp_tinyusb~1.4.23 idf.py add-dependency esp_tinyusb 1.4.24 idf.py add-dependency esp_tinyusb~1.4.25 idf.py add-dependency esp_tinyusb~1.0.06 idf.py add-dependency "espressif/esp_tinyusb^1.4.2"7 idf.py add-dependency esppressif/esp_tinusb8 idf.py build9 idf.py menuconfig10 idf.py build11 idf.py build12 idf.py build13 idf.py build14 idf.py -p com27 flash15 idf.py build16 idf.py -p com27 flash
9、总结
时间有点久了,我都记不住了,多尝试吧吧,这样这块也算了一段学习了。
另外这样我们也有了 使用VScode建立工程相关经验了。以后就可以以这个为参照了。
相关文章:

【PC电脑windows-学习样例tusb_serial_device-ESP32的USB模拟串口程序+VScode建立工程+usb组件添加+-基础样例学习】
【PC电脑windows-学习样例tusb_serial_device-ESP32的USB模拟串口程序-基础样例学习】 1、概述2、实验环境3-1、 物品说明3-2、所遇问题:ESP32 cannot open source file "tinyusb.h"或者“tinyusb.h:No such file or directory ....”3-3、解决问题&#…...
LeetCode75——Day26
文章目录 一、题目二、题解 一、题目 394. Decode String Given an encoded string, return its decoded string. The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guar…...

面试算法53:二叉搜索树的下一个节点
题目 给定一棵二叉搜索树和它的一个节点p,请找出按中序遍历的顺序该节点p的下一个节点。假设二叉搜索树中节点的值都是唯一的。例如,在图8.9的二叉搜索树中,节点8的下一个节点是节点9,节点11的下一个节点是null。 分析…...

2023SHCTF web方向wp
1.ezphp 看一眼,你大爷,啥玩意都给我过滤完了。 还好下面有preg_replace()/e,会把replacement当作php语句执行 传参pattern.*, .*表示任意字符,code{${phpinfo()}} ,为什么这样写,因为,print_…...

从物理磁盘到数据库 —— 存储IO链路访问图
原图来自:数据库IO链路访问图 – OracleBlog 由于很复杂,为了加深理解自己重新画了一次,另外参考其他文档补充了各部分的插图和介绍。 一、 存储服务器 1. 物理磁盘 外层的壳子称为硬盘笼 cage 2. chunklet Chunklet 是一个虚拟概念而不是实…...

基于java+springboot+vue在线选课系统
项目介绍 本系统结合计算机系统的结构、概念、模型、原理、方法,在计算机各种优势的情况下,采用JAVA语言,结合SpringBoot框架与Vue框架以及MYSQL数据库设计并实现的。员工管理系统主要包括个人中心、课程管理、专业管理、院系信息管理、学生…...
GO学习之 同步操作sync包
GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…...

NUUO网络摄像头(NVR)RCE漏洞复现
简介 NUUO Network Video Recorder(NVR)是中国台湾NUUO公司的一款网络视频记录器。 NUUO NVR视频存储管理设备的__debugging_center_utils___.php文件存在未授权远程命令执行漏洞,攻击者可在没有任何权限的情况下通过log参数执行任意命令。…...

一款快速获取目标网站关键信息的工具
1.摘要 今天要介绍的这款工具是一个快速收集网站信息的开源脚本, 采用Python语言编写, 该工具可以快速收集网站的页面标题、网站上次更新日期、DNS信息、子域、防火墙名称、网站使用的技术栈、证书等信息, 默认支持对验证码和JavaScript内容执行绕过操作。 2.工具安装使用 使…...
将GC编程语言引入WebAssembly的新方法
本文讨论了一种名为 WasmGC 的新方法,用于将垃圾收集编程语言有效地引入 WebAssembly。 WasmGC 定义了新的 GC 类型,例如结构和数组,与之前编译为线性内存的方法 (WasmMVP) 相比,它们可以实现更好的优化: 在编译时和…...

微信小程序UI自动化测试实践:Minium+PageObject
小程序架构上分为渲染层和逻辑层,尽管各平台的运行环境十分相似,但是还是有些许的区别(如下图),比如说JavaScript 语法和 API 支持不一致,WXSS 渲染表现也有不同,所以不论是手工测试,…...
Java零基础入门-输入与输出
哈喽,各位小伙伴们,你们好呀,我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。 我是一名后…...

iOS报错命名空间“std”中的“unary_function”
刚刚将我的 Xcode 升级到 15.0,突然它开始在 RCT_Folly 中出现以下错误 No template named unary_function in namespace std; did you mean __unary_function?我尝试删除缓存数据和派生数据并清理构建。也尝试删除 pod 和 node_modules。但没有任何帮助。 于是我…...

Flink SQL 窗口聚合详解
1.滚动窗⼝(TUMBLE) **滚动窗⼝定义:**滚动窗⼝将每个元素指定给指定窗⼝⼤⼩的窗⼝,滚动窗⼝具有固定⼤⼩,且不重叠。 例如,指定⼀个⼤⼩为 5 分钟的滚动窗⼝,Flink 将每隔 5 分钟开启⼀个新…...
中间件redis的使用
Java中的中间件配置体现在springboot的yml配置文件中。Springboot框架支持微服务和中间件和restful api远程服务的调用。中间件是Java web系统的中间层的服务系统的调用接口。Springboot的自动装配和约定大于配置机制初始化springcontext的容器空间和注册组件。使用容器管理服务…...
Why delete[] array when deepcopying with “=“?
代码负责释放对象之前已经分配的资源,比如堆上的内存。在执行深拷贝之前,你需要确保对象不再引用之前的资源,以避免内存泄漏。通过删除先前的资源,你可以确保在进行深拷贝之前,已经释放了之前的资源,从而避…...

curl(六)DNS解析、认证、代理
一 DNS解析 ① ip协议 使用ipv4 [-4] 还是ipv6 [-6] ② --resolve 场景: 在不修改系统配置文件 /etc/hosts 的情况下将单个请求临时固定到 ip 地址 1、使用 * 作为通配符,这样请求中调用的所有 Host 都 会转到你指定的 ip curl https://www.wzj.com --resolv…...

(免费领源码)PHP#MySQL高校学生信息管理系统28099-计算机毕业设计项目选题推荐
摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用php技术建设学生信息管理系统设计。…...

[动态规划] (四) LeetCode 91.解码方法
[动态规划] (四) LeetCode 91.解码方法 91. 解码方法 题目解析 (1) 对字母A - Z进行编码1-26 (2)11106可以解码为1-1-10-6或者11-10-6, 但是11-1-06不能解码 (3) 0n不能解码 (4) 字符串非空,返回解码方法的总数 解题思路 状态表示 dp[i]:以i为结…...

Vue Vuex的使用和原理 专门解决共享数据的问题
Vuex专门解决共享数据的问题 多组件共享时使用,如用户ID各组件需要根据ID发送请求获取数据,任意组件可以进行增删改,相当于全局变量 Vuex 工作流程 如果确定值参数可以不经过Actions 直接走 安装Vuex vue2使用 vuex3 vue3使用 vuex4 npm i…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...