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

【PC电脑windows-学习样例tusb_serial_device-ESP32的USB模拟串口程序-基础样例学习】

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 h

相关链接:https://components.espressif.com/components/espressif/esp_tinyusb

具体命令

cpp 复制代码
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盘,找如下目录。

c 复制代码
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里加入手动桥写。

cpp 复制代码
#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:编译

对于命令行下,其实就是命令

cpp 复制代码
idf.py build

编译过程如下

4:加入组件-解决问题演示

一般不出意外,都会出现错误,告诉你没有发现这个tusbxxx相关文件。

如果在"ESP-IDF 5.0 PowerShell"编译也是一样的

我们使用命令行进行加入组件。

具体命令

cpp 复制代码
idf.py add-dependency esp_tinyusb~1.4.2

重新编译,可以看到多了文件,就是添加进来的组件


5:使能usb模拟串口

如下,报错,意思也很明显,需要使能,在menuconfig下设置

命令:

cpp 复制代码
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"添加组件和编译下载什么的。

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

相关推荐
简单的心12 小时前
window部署虚拟机VirtualBox来部署flink
大数据·windows·flink
viperrrrrrrrrr73 小时前
大数据学习(105)-Hbase
大数据·学习·hbase
IT _oA3 小时前
Active Directory 域服务
运维·服务器·网络·windows·笔记
行思理5 小时前
go语言应该如何学习
开发语言·学习·golang
oceanweave6 小时前
【k8s学习之CSI】理解 LVM 存储概念和相关操作
学习·容器·kubernetes
yangshuo12817 小时前
WSA(Windows Subsystem for Android)安装LSPosed和应用教程
android·windows·模拟器·lsposed·windows安卓子系统
吴梓穆8 小时前
UE5学习笔记 FPS游戏制作43 UI材质
笔记·学习·ue5
学会870上岸华师8 小时前
c语言学习16——内存函数
c语言·开发语言·学习
XYN619 小时前
【嵌入式面试】
笔记·python·单片机·嵌入式硬件·学习
啊哈哈哈哈哈啊哈哈9 小时前
R3打卡——tensorflow实现RNN心脏病预测
人工智能·深度学习·学习