ESP32S3 无线双机文件传输器

在日常工作中,经常会遇到需要在测试机和主机之间传输文件的需求。通常WIFI 是非常好的方法,但是安全规则限制,主机和测试机无法接入同一个网络中,如果能用无线将他们连接起来能够提升效率。

基本思路是:ESP32 S3 将自身模拟为 USB CDC 设备,这样插入系统后就会出现一个串口。我们使用超级终端来进行文本和文件的传输。

收到的数据会放置在 USB Buffer 中,这些数据我们通过 ESP32 的 ESPNOW 发送出去。接收到之后,再通过串口传入系统中,同样又超级终端来接收。

需要注意的地方是:

1. Arduino 中需要修改如下2个位置

a.C:\Users\USERNAME\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.2.1\cores\esp32\USBCDC.cpp 这里是USB缓冲区的大小。太小了影响效率。

void USBCDC::begin(unsigned long baud) {
  if (itf >= CFG_TUD_CDC) {
    return;
  }
  if (tx_lock == NULL) {
    tx_lock = xSemaphoreCreateMutex();
  }
  // if rx_queue was set before begin(), keep it
  if (!rx_queue) {
    //ZivDebug setRxBufferSize(256);  //default if not preset
setRxBufferSize(64*1024);  //ZivDebug 64K Buffer
  }
  devices[itf] = this;
}

b.C:\Users\USERNAME\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.2.1\cores\esp32\USB.h 这里是USB CDC Task 的栈大小,原值过小,导致使用时会重启

class ESPUSB {
public:
  //ZivDebug  ESPUSB(size_t event_task_stack_size = 2048, uint8_t event_task_priority = 5);
  ESPUSB(size_t event_task_stack_size = 20480, uint8_t event_task_priority = 5);
  ~ESPUSB();
  void onEvent(esp_event_handler_t callback);
  void onEvent(arduino_usb_event_t event, esp_event_handler_t callback);

2.代码烧录需要设置如下

3. 代码中 ESPNOW 的发送和接收写在了一起,具体使用时读取 Io10 的状态来决定自身的 Mac 地址,换句话说成对使用时,一块板子的Io10 悬空,另外一块Io10 接地就可以了。

3.Arduino 版本  1.8.16 ,  ESP32 Package 是3.2.1

源代码:

电路图和PCB下载:

工作的测试视频:

电路图和PCB:

工作的视频:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注