【PC电脑windows-学习样例tusb_serial_device-ESP32的USB模拟串口程序+VScode建立工程+usb组件添加+-基础样例学习】

news2024/11/29 10:44:51

【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
        ));
    #endif

    ESP_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-app
   2 idf.py add-dependency esp_tinyusb~1.4.2
   3 idf.py add-dependency esp_tinyusb 1.4.2
   4 idf.py add-dependency esp_tinyusb~1.4.2
   5 idf.py add-dependency esp_tinyusb~1.0.0
   6 idf.py add-dependency "espressif/esp_tinyusb^1.4.2"
   7 idf.py add-dependency esppressif/esp_tinusb
   8 idf.py build
   9 idf.py menuconfig
  10 idf.py build
  11 idf.py build
  12 idf.py build
  13 idf.py build
  14 idf.py -p com27 flash
  15 idf.py build
  16 idf.py -p com27 flash

在这里插入图片描述

9、总结

时间有点久了,我都记不住了,多尝试吧吧,这样这块也算了一段学习了。

另外这样我们也有了 使用VScode建立工程相关经验了。以后就可以以这个为参照了。

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

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

相关文章

【多线程】静态代理

当使用静态代理模式时&#xff0c;我们会有一个真实的对象&#xff08;RealSubject&#xff09;&#xff0c;一个代理对象&#xff08;ProxySubject&#xff09;&#xff0c;代理对象将请求转发给真实对象&#xff0c;并可以在请求前后执行额外的操作。 真实对象和代理对象要实…

【LeetCode刷题-队列】--2073.买票需要的时间

2073.买票需要的时间 方法一&#xff1a;使用队列 class Solution {public int timeRequiredToBuy(int[] tickets, int k) {Queue<TicketBuyer> queue new LinkedList<>();for(int i 0;i<tickets.length;i){TicketBuyer buyer new TicketBuyer();buyer.inde…

Linux----------------Shell重定向输入输出

&#xff08;一&#xff09; 标准输入 以键盘读取用户输入的数据&#xff0c;然后再把数据拿到 Shel程序中使用。 标准输出 Shell 程序产生的数据&#xff0c;这些数据一般都是呈现到显示器上供用户浏览查看 输入输出重定向 输入方向就是数据从哪里流向程序。数据默认从键…

【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…

SpringBoot + Vue2项目打包部署到服务器后,使用Nginx配置SSL证书,配置访问HTTP协议转HTTPS协议

配置nginx.conf文件&#xff0c;这个文件一般在/etc/nginx/...中&#xff0c;由于每个人的体质不一样&#xff0c;也有可能在别的路径里&#xff0c;自己找找... # 配置工作进程的最大连接数 events {worker_connections 1024; }# 配置HTTP服务 http {# 导入mime.types配置文件…

typeScript基础使用与进阶

typeScript基础使用与进阶 一、初始typeScript1.1 js的超集1.2 编译器编译为js代码1.3 完全兼容js1.4 静态类型检查器 二、ts的安装与编译2.1 ts的安装2.2 ts编译成js2.2.1 手动编译2.2.2 自动编译 三、ts基础使用3.1 类型声明3.1.1 基础类型3.1.2 数组3.1.3 对象3.1.4 any类型…

bug: https://aip.baidubce.com/oauth/2.0/token报错blocked by CORS policy

还是跟以前一样&#xff0c;我们先看报错点&#xff1a;&#xff08;注意小编这里是H5解决跨域的&#xff0c;不过解决跨域的原理都差不多&#xff09; Access to XMLHttpRequest at https://aip.baidubce.com/oauth/2.0/token from origin http://localhost:8000 has been blo…

错误号码2058 Plugin caching_sha2_password could not be loaded:vX八白白白白白令自砸

sqlyog连接数据库时报错&#xff1a; 错误号码2058 Plugin caching_sha2_password could not be loaded:vX八白白白白白令自砸 网上查了资料&#xff0c;是MySQL 从 8.0 版本开始加密方式改变导致的原因。具体的咋也不再这里分析了&#xff0c;就直说如何解决这个问题。下面三…

由于找不到vcruntime140.dll无法继续执行代码

在计算机使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“vcruntime140.dll丢失”。这个错误通常发生在运行某些程序或游戏时&#xff0c;它会导致程序无法正常运行。那么&#xff0c;如何解决vcruntime140.dll丢失的问题呢&#xff1f;本文将介绍…

基于单片机的滚筒洗衣机智能控制系统设计

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、系统整体设计方案2.1控制系统的功能2.2设计的主要内容 二、硬件设计3.1 控制系统整体框图3.2 电源电路 三 软件设计主程序设计仿真设计 四、 结论 概要 因此我们需要一个完善的智能系统来设计一个全自动滚筒洗…

【unity实战】教你轻松构建对话系统

先来看最终效果 前言 欢迎来到我们的Unity实战教程系列。在这一篇中&#xff0c;我们将深入探讨如何在Unity中构建一个对话系统。 对话系统是许多游戏中不可或缺的一部分&#xff0c;特别是在角色扮演游戏&#xff08;RPG&#xff09;、冒险游戏和视觉小说等类型中。它们为玩…

selenium自动化测试入门 —— python unittest单元测试框架

unittest又名PyUnit&#xff0c; Python单元测试框架&#xff08;The Python unit testing framework&#xff09;&#xff0c;简称为PyUnit。自从 Python 2.1 版本后&#xff0c;PyUnit成为 Python标准库的一部分。 为什么需要使用unittest单元测试框架&#xff1f; 当我们写…

MIT6.5830 Lab1-GoDB实验记录(五)

MIT6.5830 Lab1-GoDB实验记录&#xff08;五&#xff09; – WhiteNights Site 标签&#xff1a;Golang 完成了Exercise 1&#xff0c;还有四个Exercise在等着我&#xff0c;慢慢来吧。 实验准备 了解缓冲池 缓冲池&#xff0c;俗称BP。相关的概念还有数据页和缓存页。页&…

VueX 模块化和namespace

当我们的项目很大的时候&#xff0c;VueX中的代码会越来越多&#xff0c;会有处理数据的&#xff0c;处理人员列表的&#xff0c;处理订单的... 如果我们将这些东西都写在一个state、actions和mutations中的话&#xff0c;就非常不方便后期的维护。 所以我们引入了VueX的模块…

Linux的指令和用途(持续更新)

1. 基本指令&#xff1a; 概念介绍&#xff1a; 1. 目录&#x1f7f0;文件夹 Linux指令用法说明who查看哪些人登陆我的机器whoami (who am i)查看当前账号是谁 pwd 查看当前我所在的目录clear 清屏 tree 目录名&#xff08;文件夹名&#xff09;以树形结构列出该文件夹下的所有…

深度学习之基于Tensorflow人脸面部表情识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于Tensorflow的人脸面部表情识别系统是一种基于深度学习技术的图像处理应用&#xff0c;该系统主要通过人脸图像数…

【Unity实战】最全面的库存系统(五)

文章目录 先来看看最终效果前言配置商店系统数据创建另一个NPC绘制商店UI控制商店开关列出商品添加和删除物品功能添加商品到购物车购买商品购物车删除物品商店预览效果购买和出售切换出售功能保存商店数据快捷栏物品切换和使用完结 先来看看最终效果 前言 本期也是最好一期&a…

最新 vie-vite框架下 jtopo安装使用

官方地址 官方源码 安装下载 1.官方好像都没有给git地址&#xff0c;尝试npm安装报错 2.找到1.0.5之前的版本npm i jtopo2&#xff0c;安装成功后使用报错&#xff0c;应该是版本冲突了 1.本地引入&#xff0c; 点击官方源码下载&#xff0c;需要jtopo_npm文件 2.引入到本…

【wp】2023鹏城杯初赛 Web web1(反序列化漏洞)

考点&#xff1a; 常规的PHP反序列化漏洞双写绕过waf 签到题 源码&#xff1a; <?php show_source(__FILE__); error_reporting(0); class Hacker{private $exp;private $cmd;public function __toString(){call_user_func(system, "cat /flag");} }class A {p…