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