目录
- [1. 起初的想法](#1. 起初的想法)
- [2. 串口小板](#2. 串口小板)
- [3. ESP32-S3 开发](#3. ESP32-S3 开发)
-
- [3.1 硬件介绍和接线](#3.1 硬件介绍和接线)
- [3.2 软件开发环境](#3.2 软件开发环境)
- [3.3 代码编译](#3.3 代码编译)
- [3.4 功能实现](#3.4 功能实现)
- [4. 遇到的一些问题](#4. 遇到的一些问题)
-
- [踩坑1 文档引脚图错误](#踩坑1 文档引脚图错误)
- [踩坑2 环境变量设置无效](#踩坑2 环境变量设置无效)
- [踩坑3 menuconfig 无法移动](#踩坑3 menuconfig 无法移动)
1. 起初的想法
日常开发中一直在分析杂音、破音一系列问题,遇到问题就需要dump音频数据,以往Android、Linux项目算力、内存足够强,音频链路的数据直接写入文件,通过adb pull 出来可以。 最近一直在基于RTOS 系统开发穿戴式产品,不管是算力、内存都是捉襟见肘,更别说adb了, 调试方式只有串口。 于是聪明的厂商们,就基于串口开发出了类似tgdb 、Audio Developer 传输音频工具,只能说能用,但不够好用,项目初期折腾了一段时间才跑通。日常串口波特率115200,传输音频数据波特率需要用3M 波特率。 但是也会由于各种原因出现丢包的问题。导致分析音频数据时候不知道是丢包导致的还是传输导致的。 于是就想在串口传输上想一些办法来避免丢包。
MCU
串口
波特率3M
PC上运行Audio Developer

2. 串口小板
日常开发串口波特率都是115200之类的速率,现在到了3M波特率,原来的模块速率跟不上了,速率最多到1M,再高就不行了。
所以需要找带有变压器隔离的器件的,相对性能都比较好,驱动能力强,速率较高的串口小板。
其次就是串口小板的硬件FIFO都比较小,如果能基于单片机开发一款串口,那可玩性就比较高了。Buffer 可以所以加大,这样丢包就可控一些。 于是找了一圈下来,备选的有STM32和ESP32-S3,两款芯片之前都玩过一些,综合性价比、可玩性,下单了ESP32-S3 N16R8 DevKitC-1开发板 加个也不贵,20多块钱 接近 一款性能好的串口小板。 能够快速搭建出原型。 而且这几天状态也不错,一步一步把心里的想法落地下来很不错,比工作上多解几个Bug 来的带劲。
还有一种方案就是使用 FT232H 芯片 + D2XX 驱动 直接操作芯片获取数据,其核心原理是:绕过操作系统标准串口(COM)抽象层,通过 FTDI 官方提供的 D2XX DLL/API 直接与 USB 设备通信,实现高速、低延迟、精确控制的 GPIO 和 FIFO 模式数据传输。核心是 把 FT232H 当作一个"可编程 USB-to-Parallel/FIFO/GPIO 桥",而非串口。 这使得 FT232H 不再是一个"串口转 USB"芯片,而是一个 通用的、可编程的 USB 协议控制器,非常适合需要 确定性时序 + 高吞吐 的嵌入式开发场景。 这种方案还未验证,不知道可行性。 重点先放在ESP32-S3 开发上,看下效果。
3. ESP32-S3 开发
3.1 硬件介绍和接线
官网文档通俗易懂,ESP32-S3-DevKitC-1
淘宝卖的开发板都是兼容官方的,价格做的更便宜功能也拓展了一下。 接线图如下:
MCU 的 RX / TX 接到 ESP32-S3 的 17、18 pin ,对应的是 Uart1 TX / RX ,默认Uart0 是打印串口,调试过程中需要用到。



原理图还是要看一下,知道大概的连接线路。
3.2 软件开发环境
开发环境 看完官方文档之后,首先是通过VSCode 安装ESP-IDF 一键式安装开发环境,折腾了俩小时,一直有报错,尝试了几种方案后一直没有解决,果断放弃。 类似这个错误 Can't install esp-idf in VS Code due to operation not permitted, rename (VSC-1735) #1612, 但是尝试了这个方式也不错,因为把开发环境做成这种不多,过程中肯定会遇到不少问题,但是一旦搞好了,这样效率提升很多,大家就不至于为搭建开发环境而困惑。

于是通过ESP-IDF 工具安装器 安装成功,源码下载、编译器以及相关依赖、环境变量设置都搞定了。
过程中遇到一个问题就是源码以及交叉编译器的安装一直都是安装到默认路径也就是C盘,但是C盘空间不足,需要安装到D盘,按照文档中的set IDF_TOOLS_PATH=D:\16-ESP32-Uart\Tool 设置了环境变量之后,一直不生效,于是临时修改了tools/idf_tools.py脚本解决问题。
bash
/tools/idf_tools.py
+#IDF_TOOLS_PATH_DEFAULT = os.path.join('~', '.espressif')
+# 修改后(Windows 示例)
+IDF_TOOLS_PATH_DEFAULT = r'D:\Project\16-ESP32-Uart\Tool'
3.3 代码编译
ESP32-S3 编译全部用Pyhton 脚本化,具体的编译框架没研究,拿来就用,简单容易上手,唯一的缺点就是编译特别慢。 理论上这种RTOS 系统编译都是很快的,基本一个小工程都是几秒就完成了。但是ESP32-S3 编译比较慢。
//找个例子
cd ~/examples\peripherals\uart\uart_echo
//设置芯片类型
idf.py set-target esp32s3
//如需要配置其它,可以通过menuconfig
idf.py menuconfig
// 如手动修改了配置,需要重新加载配置
idf.py reconfigure
//编译
idf.py build
//烧录
idf.py -p COM94 flash
//串口打印
idf-monitor.exe --port COM94
3.4 功能实现
目前要实现的功能类似于esp32_uart_bridge.c, 将ESP32-S3配置为一个高性能的 USB-to-UART 串口桥接器,功能等同于常见的 FT232R 或 CP210x 芯片。通过内置的 USB-CDC 接口与电脑通信,并通过 GPIO18(RX)和 GPIO17(TX)连接外部 MCU 的串口,实现双向透传。 目前现有的仓库中并没有这个demo,需要做一系列改动。
COMPUTER ESP32-S3 设备MCU
┌────────┐ ┌────────┬────────┐ ┌────────┐
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ USB │◄───►│ CDC │ UART │◄─3M──►│ UART │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
└────────┘ └────────┴────────┘ └────────┘
首先先基于 examples\peripherals\usb_serial_jtag\usb_serial_jtag_echo 打通,验证串口收发没问题,刚开始跑这个demo 的时候,发现设备MCU的串口数据一直收不到,一直在排查问题, 于是先用 examples\peripherals\uart\uart_echo 跑一下,发现硬件接线错误,按照官方的图把MCU TX / RX 接到 Pin 16 17 引脚,一直不通,用万用表量了一下,才发现问题,正确的应该是Pin 17 / Pin18 代表是Uart1 TX、Uart1 RX

这才是对的

串口跑通之后,接下来在usb_serial_jtag Demo 上进行改造,打通了一个基本串口功能,比较兴奋,于是立马测试整条链路,发现通过串口dump 音频数据还是有明显丢包,无奈放弃usb_serial_jtag ,继续examples\peripherals\usb\device\tusb_serial_device 改造,这个过程遇到一个问题,串口可以正常数据,但是音频数据丢包严重,百思不得其解, 反复调试之后找到了原因, ✅ USB CDC 的发送缓冲区(TX buffer)太小,导致数据来不及发送就被新数据覆盖或丢弃,从而造成一直是"错误帧"。尝试把CONFIG_TINYUSB_CDC_TX_BUFSIZE 增加到 4096 ,并确保单次写入不超过该值,即可解决"全部错误帧"的问题。 但是出现栈溢出crash, 于是改到2048解决。 初测效果没有达到预期,但是达到了一般串口的水平, 还需要继续调试。
整个过程从周五晚上的时间,还有周六(0117) 一天半的时间,把一个想法快速落地搭建原型,这个过程找回来之前DIY的感觉,非常不错呀。
4. 遇到的一些问题
踩坑1 文档引脚图错误

有个坑就是官方的这图有问题, 16/17 U1TXD U1RXD 标识有错误,正确的应该是 17/18 导致一直在反复排查问题,尴尬了。 通过着examples\peripherals\uart\uart_echo\main\uart_echo_example_main.c 验证出来的问题,起初发现也不通,然后测量电平,反复排查才怀疑到这里引脚可能错了。
踩坑2 环境变量设置无效
IDF_TOOLS_PATH环境变量设置无效,源码一直安装到默认路径。 最后无奈修改了tools\idf_tools.py 脚本解决
踩坑3 menuconfig 无法移动
idf.py menuconfig 上下移动 不是方向键而且经典的vim 快捷键,jk 有点意外,导致第一次用方向键一直没生效,还在琢磨怎么回事。