'USBCDC' does not name a type

Hi,

I want to use ESP32 as USB to UART converter and I think USBSerial example project can be used for that. Project is located under ESP32 Dev Module examples. I only pressed the 'verify' button and I've got the following error:
'USBCDC' does not name a type

I suppose it's a library problem, but as it's a project example I'm wondering why this error is happening. I also added USBHost library just in case but the problem is not resolved. I'm using Arduino 1.8.19 version.

Can someone help me?

Thanks,
Alberto

Yes... lots of people on this forum.

No... not unless you post your code. Ideally all of it, in code tags (these things "</>").

This is the full code:

#include "USB.h"

#if ARDUINO_USB_CDC_ON_BOOT
#define HWSerial Serial0
#define USBSerial Serial
#else
#define HWSerial Serial
USBCDC USBSerial;
#endif

static void usbEventCallback(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data){
  if(event_base == ARDUINO_USB_EVENTS){
    arduino_usb_event_data_t * data = (arduino_usb_event_data_t*)event_data;
    switch (event_id){
      case ARDUINO_USB_STARTED_EVENT:
        HWSerial.println("USB PLUGGED");
        break;
      case ARDUINO_USB_STOPPED_EVENT:
        HWSerial.println("USB UNPLUGGED");
        break;
      case ARDUINO_USB_SUSPEND_EVENT:
        HWSerial.printf("USB SUSPENDED: remote_wakeup_en: %u\n", data->suspend.remote_wakeup_en);
        break;
      case ARDUINO_USB_RESUME_EVENT:
        HWSerial.println("USB RESUMED");
        break;
      
      default:
        break;
    }
  } else if(event_base == ARDUINO_USB_CDC_EVENTS){
    arduino_usb_cdc_event_data_t * data = (arduino_usb_cdc_event_data_t*)event_data;
    switch (event_id){
      case ARDUINO_USB_CDC_CONNECTED_EVENT:
        HWSerial.println("CDC CONNECTED");
        break;
      case ARDUINO_USB_CDC_DISCONNECTED_EVENT:
        HWSerial.println("CDC DISCONNECTED");
        break;
      case ARDUINO_USB_CDC_LINE_STATE_EVENT:
        HWSerial.printf("CDC LINE STATE: dtr: %u, rts: %u\n", data->line_state.dtr, data->line_state.rts);
        break;
      case ARDUINO_USB_CDC_LINE_CODING_EVENT:
        HWSerial.printf("CDC LINE CODING: bit_rate: %u, data_bits: %u, stop_bits: %u, parity: %u\n", data->line_coding.bit_rate, data->line_coding.data_bits, data->line_coding.stop_bits, data->line_coding.parity);
        break;
      case ARDUINO_USB_CDC_RX_EVENT:
        HWSerial.printf("CDC RX [%u]:", data->rx.len);
        {
            uint8_t buf[data->rx.len];
            size_t len = USBSerial.read(buf, data->rx.len);
            HWSerial.write(buf, len);
        }
        HWSerial.println();
        break;
      
      default:
        break;
    }
  }
}

void setup() {
  HWSerial.begin(115200);
  HWSerial.setDebugOutput(true);
  
  USB.onEvent(usbEventCallback);
  USBSerial.onEvent(usbEventCallback);
  
  USBSerial.begin();
  USB.begin();
}

void loop() {
  while(HWSerial.available()){
    size_t l = HWSerial.available();
    uint8_t b[l];
    l = HWSerial.read(b, l);
    USBSerial.write(b, l);
  }
}

That library doesn't have any USBCDC class as far as I can see.
Did you mean "USBHost" perhaps?

I included USBHost library using Library Manager but error persists. Do you know the exact name of library to set in the #include? I searched on internet but I didn't find anything.

Anyway, I don't know why this project is not working from the beginning as it's an Arduino example and I didn't modify it:

Looking at USB.H file, there is #include: "USBCDC.h (line 21) which I suppose it contains the USBCDC class. Unfortunately, I can't access to that library trhough the project so I think it's not included when it should.

// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#pragma once

#include "sdkconfig.h"

#if CONFIG_TINYUSB_ENABLED

#include "esp_event.h"
#include "USBCDC.h"

#define ARDUINO_USB_ON_BOOT (ARDUINO_USB_CDC_ON_BOOT|ARDUINO_USB_MSC_ON_BOOT|ARDUINO_USB_DFU_ON_BOOT)

ESP_EVENT_DECLARE_BASE(ARDUINO_USB_EVENTS);

typedef enum {
    ARDUINO_USB_ANY_EVENT = ESP_EVENT_ANY_ID,
    ARDUINO_USB_STARTED_EVENT = 0,
    ARDUINO_USB_STOPPED_EVENT,
    ARDUINO_USB_SUSPEND_EVENT,
    ARDUINO_USB_RESUME_EVENT,
    ARDUINO_USB_MAX_EVENT,
} arduino_usb_event_t;

typedef union {
    struct {
        bool remote_wakeup_en;
    } suspend;
} arduino_usb_event_data_t;

class ESPUSB {
    public:
        ESPUSB(size_t event_task_stack_size=2048, 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);
        
        bool VID(uint16_t v);
        uint16_t VID(void);

        bool PID(uint16_t p);
        uint16_t PID(void);

        bool firmwareVersion(uint16_t version);
        uint16_t firmwareVersion(void);

        bool usbVersion(uint16_t version);
        uint16_t usbVersion(void);

        bool usbPower(uint16_t mA);
        uint16_t usbPower(void);

        bool usbClass(uint8_t _class);
        uint8_t usbClass(void);

        bool usbSubClass(uint8_t subClass);
        uint8_t usbSubClass(void);

        bool usbProtocol(uint8_t protocol);
        uint8_t usbProtocol(void);

        bool usbAttributes(uint8_t attr);
        uint8_t usbAttributes(void);

        bool webUSB(bool enabled);
        bool webUSB(void);
        
        bool productName(const char * name);
        const char * productName(void);

        bool manufacturerName(const char * name);
        const char * manufacturerName(void);

        bool serialNumber(const char * name);
        const char * serialNumber(void);

        bool webUSBURL(const char * name);
        const char * webUSBURL(void);

        bool enableDFU();
        bool begin();
        operator bool() const;
        
    private:
        uint16_t vid;
        uint16_t pid;
        String product_name;
        String manufacturer_name;
        String serial_number;
        uint16_t fw_version;
        uint16_t usb_version;
        uint8_t usb_class;
        uint8_t usb_subclass;
        uint8_t usb_protocol;
        uint8_t usb_attributes;
        uint16_t usb_power_ma;
        bool webusb_enabled;
        String webusb_url;
        
        bool _started;
        size_t _task_stack_size;
        uint8_t _event_task_priority;
};

extern ESPUSB USB;

#endif /* CONFIG_TINYUSB_ENABLED */

Which ESP32 do you have?
USBCDC works on ESP32-S2 or S3.

I'm using ESP-WROOM-32.

As my goal is to make ESP32 works as a USB to UART converter in order to flash a custom board, I saw on Internet that it can be done just connecting TX and RX signals properly and pressing ESP32 enable button. Am I right?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.