【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建立工程相关经验了。以后就可以以这个为参照了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

京东大数据平台(京东数据分析):9月京东牛奶乳品排行榜

鲸参谋监测的京东平台9月份牛奶乳品市场销售数据已出炉&#xff01; 9月份&#xff0c;牛奶乳品市场销售呈大幅上涨。鲸参谋数据显示&#xff0c;今年9月&#xff0c;京东平台牛奶乳品市场的销量为2000万&#xff0c;环比增长约65%&#xff0c;同比增长约3%&#xff1b;销售额为…

JVM字节码文件浅谈

文章目录 版权声明java虚拟机的组成字节码文件打开字节码文件的姿势字节码文件的组成魔数&#xff08;基本信息&#xff09;主副版本号&#xff08;基本信息&#xff09;主版本号不兼容的错误解决方法基本信息常量池方法 字节码文件的常用工具javap -v命令jclasslib插件阿里art…

搭建Qt5.7.1+kylinV10开发环境、运行环境

1.下载Qt源码 Index of / 2.编译Qt 解压缩qt-everywhere-opensource-src-5.7.1.tar.gz 进入到qt-everywhere-opensource-src-5.7.1/qtbase/mkspecs这个目录下&#xff0c; 2.1找到以下目录 复制他&#xff0c;然后改名linux-x86-arrch64&#xff0c;博主这里名字取的有些问…

循环链表(单循环、双循环)(数据结构与算法)

循环链表&#xff1a;循环单链表、循环双链表 1. 循环单链表 循环单链表&#xff08;Circular Singly Linked List&#xff09;是一种特殊类型的单链表&#xff0c;其中最后一个节点的指针指向头节点&#xff0c;形成一个循环。 循环单链表与普通单链表的主要区别在于&#xf…

汽车标定技术(三)--XCP协议如何支持测量功能

目录 1. 概述 2. 测量方式 -- Poll 3. 测量方式 -- DAQ 3.1 ODT概念模型 3.2 DAQ List概念 3.3 ODT 绝对编号和相对编号 3.4 静态DAQ和动态DAQ模式 &#xff08;1&#xff09;静态DAQ &#xff08;2&#xff09;动态DAQ 4.小结 1. 概述 在该系列的首篇文章汽车标定技…

python把Word题库转成Excle题库

又到了一年一度的背题时刻&#xff0c;但是收到的题库是Word版的&#xff0c;页数特别多 话不多说&#xff0c;上代码&#xff0c;有图有真相&#xff0c;代码里面备注的很详细 # 导入所需库 import csv import os import refrom docx import Document from win32com import c…

tcp/ip协议2实现的插图,数据结构2 (15 - 章)

(40) 40 十五1 插口层 结构socket,sysent (41) 41 十五2 插口层 实用函数与file结构描述汇总 (42) 42 十五3 插口层 函socket,socreate,pr_usrreq (43)

工作数字化的中国历程 | 从 OA 到 BPM 到数字流程自动化

业务流程是由“活动”&#xff08;或称“工作任务”&#xff09;构成的&#xff0c;在企业里的所有工作是不是都叫流程&#xff0c;或者属于流程的一部分&#xff0c;这个概念很绕&#xff0c;我觉得没有必要去做学究气的辨析。我曾经提出过一个从工作的两个特性&#xff08;产…

接口测试之什么是接口文档?

一、为什么要有接口文档&#xff1f; 没有接口文档的接口测试都是在抓瞎~前面的接口测试重点讲了协议&#xff0c;也讲了fiddler模拟接口请求&#xff0c;估计大部分还是不太懂怎么下手测试。这里小编专门拿出接口文档来做接口测试参考&#xff08;估计很多测试小伙伴没见过接口…

Azure 机器学习 - 使用无代码 AutoML 训练分类模型

了解如何在 Azure 机器学习工作室中使用 Azure 机器学习自动化 ML&#xff0c;通过无代码 AutoML 来训练分类模型。 此分类模型预测某个金融机构的客户是否会认购定期存款产品。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管…

java的线程池

线程池 可以做什么怎么创建 先了解下线程的生命周期 解释: 新建:线程创建但未被启动可运行:线程处于可运行的状态,当该线程有cpu的时间片后就可以执行睡眠:线程进入计时等待,等待一段指定的时间,可以通过wait()方法,sleep方法,join()方法等方式等待:线程进入等待模式,直到其…

抖音群控软件的作用是什么?

随着智能手机的普及和社交媒体的兴起&#xff0c;抖音成为了人们日常生活中不可或缺的一部分&#xff0c;许多人都通过抖音平台分享自己的生活、展示才艺、开展商业活动等。 然而&#xff0c;要想在抖音上获得更多的关注和收益&#xff0c;需要投入大量的时间和精力&#xff0…

【软件逆向】如何逆向Unity3D+il2cpp开发的安卓app【IDA Pro+il2CppDumper+DnSpy+AndroidKiller】

教程背景 课程作业要求使用反编译技术&#xff0c;在游戏中实现无碰撞。正常情况下碰撞后角色死亡&#xff0c;修改为直接穿过物体不死亡。 需要准备的软件 il2CppDumper。DnSpy。IDA Pro。AndroidKiller。 一、使用il2CppDumper导出程序集 将{my_game}.apk后缀修改为{my_…

基于jsp的采购管理系统的分析与实现

物资采购管理系统是针对内部而设计的&#xff0c;应用于的局域网&#xff0c;这样可以使得内部管理更有效的联系起来。企业采购管理系统是将IT技术用于企业采购信息的管理, 它能够收集与存储企业采购的档案信息&#xff0c;提供更新与检索企业采购信息档案的接口&#xff1b;提…

OpenGL ES入门教程(二)之绘制一个平面桌子

OpenGL ES入门教程&#xff08;二&#xff09;之绘制一个平面桌子 前言0. OpenGL绘制图形的整体框架概述1. 定义顶点2. 定义着色器3. 加载着色器4. 编译着色器5. 将着色器链接为OpenGL程序对象6. 将着色器需要的数据与拷贝到本地的数组相关联7. 在屏幕上绘制图形8. 让桌子有边框…

【iOS免越狱】利用IOS自动化WebDriverAgent实现自动直播间自动输入

1.目标 由于看直播的时候主播叫我发 666&#xff0c;支持他&#xff0c;我肯定支持他呀&#xff0c;就一直发&#xff0c;可是后来发现太浪费时间了&#xff0c;能不能做一个直播间自动发 666 呢&#xff1f;于是就开始下面的操作。 2.操作环境 iPhone一台 WebDriverAgent …

latex空心小写字母、数字

公式中可用 R \R R、 E \mathbb{E} E 等空心大写字母表示集合、期望等&#xff0c;latex 用 \mathbb 实现。有时想用空心的小写字母&#xff08;虚数单位&#xff0c;因 i 已用来表示下标&#xff09;和数字&#xff08;指示函数用空心 1&#xff09;&#xff0c;此时 \mathbb…

用于 GaN-HEMT 功率器件仿真的 TCAD 方法论

目录 标题&#xff1a;TCAD Methodology for Simulation of GaN-HEMT Power Devices来源&#xff1a;Proceedings of the 26th International Symposium on Power Semiconductor Devices & ICs(14年 ISPSD)GaN-HEMT仿真面临的挑战文章研究了什么文章的创新点文章的研究方法…

asp.net docker-compose添加volume配置

打开docker-compose.override.yml下面添加 volumes:killsb-one-sqldata:external: false 服务下面添加volume配置 volumes:- "./dapr/config/social-client.json:/app/OidcSettings.json" 添加volume配置成功

【LeetCode刷题-队列与栈】--225.用队列实现栈

225.用队列实现栈 class MyStack {Queue<Integer> queue1;Queue<Integer> queue2;public MyStack() {queue1 new LinkedList<Integer>();queue2 new LinkedList<Integer>();}public void push(int x) {queue2.offer(x);while(!queue1.isEmpty()){que…