【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…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
