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

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

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

相关文章

Python库Requests的爬虫程序爬取视频通用模版

这是一个使用Python库Requests的爬虫程序&#xff0c;用于爬取网上的视频。代码必须使用以下代码&#xff1a;爬虫IP主机为duoip&#xff0c;爬虫IP端口为8000。 import requests proxy_host "duoip" proxy_port 8000 url "目标网站" headers {"U…

ChinaSoft 论坛巡礼 | CCF-华为胡杨林基金-系统软件专项(海报)论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

打印机:Open the front cover and pull out the drum unit

参考&#xff1a; https://support.brother.com/g/b/faqend.aspx?cgb&langen&prodmfcl8690cdw_eu_as&faqidfaq00000154_082#:~:textReplacing%20the%20drum%20unit%20Make%20sure%20the%20machine,unit%20out%20of%20the%20machine%20until%20it%20stops. 故障现…

【爬虫实战】用python爬取微博任意关键词搜索结果、exe文件

项目功能简介&#xff1a; 1.交互式配置&#xff1b; 2.两种任意关键词来源&#xff08;直接输入、本地关键词文件&#xff09;&#xff1b; 3.自动翻页(无限爬取)&#xff1b; 4.指定最大翻页页码&#xff1b; 5.数据保存到csv文件&#xff1b; 6.程序支持打包成exe文件…

Java中的static

目录 static修饰成员变量 静态成员变量特征 static修饰成员方法 【静态方法特性】 static成员变量初始化 就地初始化 静态代码块初始化 注意事项 static修饰成员变量 静态成员变量特征 static修饰的成员变量&#xff0c;称为静态成员变量&#xff0c;静态成员变量最大的…

windows10编译高版本openssl

参考文章 参考文章中的windows编译为低版本&#xff0c;在高版本的openssl编译中已经没有&#xff1a;“ms\do_ms.bat”这个脚本了&#xff0c;现记录下编译过程 1、准备工作 安装ActivePerl&#xff0c;安装后会自动写入环境变量&#xff0c;参照参考文章测试安装成功与否&a…

排序——选择排序

基本思想 每一趟在待排序元素中选取关键字最小的元素加入有序子序列。 算法代码 #include <iostream> using namespace std;//选择排序 void SelectSort(int nums[],int n){int i,j,min;for(i0;i<n-1;i){ //一共需要进行 n-1 趟 mini; //记录最小元素的下…

算法:Java构建二叉树并递归实现二叉树的前序、中序、后序遍历

先自定义一下二叉树的类&#xff1a; // Definition for a binary tree node. public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val val;this.left…

[Machine Learning][Part 8]神经网络的学习训练过程

目录 训练过程 一、建立模型&#xff1a; 二、建立损失函数 J(w,b): 三、寻找最小损失函数的(w,b)组合 为什么需要激活函数 激活函数种类 二分法逻辑回归模型 线性回归模型 回归模型 训练过程 一、建立模型&#xff1a; 根据需求建立模型&#xff0c;从前面神经网络的…

STM32:AHT20温湿度传感器驱动程序开发

注&#xff1a;温湿度传感器AHT20数据手册.pdf http://www.aosong.com/userfiles/files/AHT20%E4%BA%A7%E5%93%81%E8%A7%84%E6%A0%BC%E4%B9%A6(%E4%B8%AD%E6%96%87%E7%89%88)%20B1.pdf 一、分析AHT数据手册文档 (1).准备工作 1.新建工程。配置UART2 2.配置I2C1为I2C标准模式&…

数据抽取+dataworks的使用+ADB的应用

一&#xff0c;大数据处理之数据抽取 1&#xff0c;什么是数据抽取 在大数据领域中&#xff0c;数据抽取是指从原始数据源中提取所需的数据子集或特定数据项的过程&#xff0c; 数据抽取是数据预处理的重要步骤&#xff0c;它为后续的数据分析和建模提供了基础。 2&#xff…

ESP32S3入手体验测试

ESP32S3入手体验测试 &#x1f516;所入手的型号是YD-ESP32-S3 N16R8,该款和乐鑫官方推出的ESP32-S3-DevKitC-1配置差不多。 &#x1f388;乐鑫官方介绍&#xff1a;ESP32-S3-DevKitC-1 v1.1 &#x1f530;两者采用的模组&#xff1a;ESP32-S3-WROOM-1 和ESP32-S3-WROOM-1U模组…

Postgresql在linux环境下以源码方式安装

linux环境下源码方式的安装 1.下载安装包&#xff08;源码安装方式&#xff09; 安装包下载 https://www.postgresql.org/ftp/source/ 2.安装postgresql ① 创建安装目录 mkdir /opt/pgsql12② 解压下载的安装包 cd /opt/pgsql12 tar -zxvf postgresql-12.16.tar.gz ③编…

代理模式(静态代理、JDK代理、CGLIB代理)

简介 代理模式有三种不同的形式&#xff1a;静态代理、动态代理&#xff08;JDK代理、接口代理&#xff09;、CGLIB代理 目标&#xff1a;在不修改目标对象的前提下&#xff0c;对目标对象进行扩展。 静态代理 需要定义接口或父类对象&#xff0c;被代理对象和代理对象通过实…

【RabbitMQ】 RabbitMQ 消息的延迟 —— 深入探索 RabbitMQ 的死信交换机,消息的 TTL 以及延迟队列

文章目录 一、死信交换机1.1 什么是死信和死信交换机1.2 死信交换机和死信队列的创建方式 二、消息的 TTL2.1 什么是消息的 TTL2.2 基于死信交换机和 TTL 实现消息的延迟 三、基于 DelayExchang 插件实现延迟队列3.1 安装 DelayExchang 插件3.2 DelayExchang 实现消息延迟的原理…

【触想智能】工业显示器上市前的检测项目分享

工业显示器在上市前&#xff0c;需要做一项重要的工作&#xff0c;那就是工业显示器出厂前的产品可靠性检测。 工业显示器选择的测试项目相比商用端更为严格&#xff0c;常见的性能测试项目包括高温老化、防尘防水、电磁静电干扰、防摔防撞等&#xff0c;在工业级应用领域&…

吴恩达《机器学习》4-6->4-7:正规方程

一、正规方程基本思想 正规方程是一种通过数学推导来求解线性回归参数的方法&#xff0c;它通过最小化代价函数来找到最优参数。 代价函数 J(θ) 用于度量模型预测值与实际值之间的误差&#xff0c;通常采用均方误差。 二、步骤 准备数据集&#xff0c;包括特征矩阵 X 和目标…

unity中移动方案--物理渲染分层

一、三种基本移动方案 unity中的移动分为Transform和Rigidbody以及CharacterController&#xff0c;其中CharacterController功能完善&#xff0c;已经可以避免了穿墙&#xff0c;并实现了贴墙走等情况&#xff0c;需要结合性能考虑选择不同的方式。 1.使用transform,直接修改…

Winform 实现俄罗斯方块游戏(一)

第一步&#xff0c;先用GDI绘制小正方形方块&#xff0c;其它形状的用这个方块合成 如何绘制一个方块&#xff1f;先绘制两个正方形&#xff0c;如下&#xff1a; 然后四周用梯形填充&#xff0c;内部颜色用渐变&#xff0c;这样更有立体感&#xff0c;下篇介绍如何实现。

[iOS开发]iOS中TabBar中间按钮凸起的实现

在日常使用app的过程中&#xff0c;经常能看到人家实现了底部分栏控制器的中间按钮凸起的效果&#xff0c;那么这是怎么实现的呢&#xff1f; 效果演示&#xff1a; 实现原理&#xff1a; 创建按钮 创建一个UITabBar的子类&#xff0c;重写它的layoutSubviews方法&#xff1…