ESP32S2 Multiple definition of `USBSerial' but it is only defined once in the class

Are there some additional defines which i can not see because if i just use the main.cpp like this:

#include "USB.h"
#include "Arduino.h"

#if ARDUINO_USB_CDC_ON_BOOT
#define HWSerial Serial0
#define USBSerial Serial
#else
#define HWSerial Serial
USBCDC USBSerial;
#endif
// HWSerial = buildin UART in developmentboard
// USBSerial = Use D+ and D- on the esp32S2 as serial

void setup()
{
    HWSerial.begin(115200);
    HWSerial.setDebugOutput(true);

    USBSerial.begin();
    USB.begin();
}

void loop()
{
    USBSerial.println("Message from the USB port");
    delay(2000);
}

Everthing works but when I use:

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

In a class I get a

multiple definition of `USBSerial';

error.
main.cpp:

#include "USBCommunication.h"

USBCommunication com;
void messageListener(String message)
{
    com.sendMessage("Got message", "PING");
}

void setup()
{
    com.setMessageListener(messageListener);
    com.initCommunication();
    com.startMessageListener();
}

void loop()
{
    // Serial.println("Testmessage");
    com.sendMessage("Message from the USB port", "MESSAGE");
    delay(2000);
}

USBCommunication.h

#include "Communication.h"
#include <Arduino.h>
#include "USB.h"
#pragma once

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


class USBCommunication : public Communication
{
public:
  USBCommunication();
  ~USBCommunication();
  int initCommunication();
  // Becarefull when you call this methode. This will stop all serial communications.
  int stopCommunication();
  int sendMessage(String message,String label);
  int checkForMessages();

private:

};

USBCommunication.cpp:

#include "USBCommunication.h"

USBCommunication::USBCommunication()
{
}

USBCommunication::~USBCommunication()
{
}

int USBCommunication::initCommunication()
{
    HWSerial.begin(115200);
    HWSerial.setDebugOutput(true);
    USBSerial.begin();
    USB.begin();

    USBSerial.begin();
    USB.begin();
    return 0;
}
int USBCommunication::stopCommunication()
{
    USBSerial.end();
    return 0;
}
int USBCommunication::sendMessage(String message,String label)
{
    USBSerial.print("["+label+"]");
    USBSerial.println(message);
    return 0;
}

int USBCommunication::checkForMessages()
{
    while(USBSerial.available())
    {
        this->processMessage(USBSerial.readStringUntil('\n'));
    }
    return 0;
}

(files as full example jqEgewqP)

(The same error happens in the arduion IDE and PlatformIO)

Does someone know more about this? Is that a bug or do in need other defines?

The problem is unrelated to classes:

This is a variable definition. You shouldn't have (non-inline) function or variable definitions in header files. Mark it extern in the header and move the definition to an implementation file (.cpp).

Can you please show me how I should do that?

Mark it extern in the header and move the definition to an implementation file (.cpp).

What is "it" in this context, do you mean USBCDC?

No, “it” is the global USBSerial variable.

Headers should only declare global variables, not define them. See chapter 6 of learncpp.com for more details, e.g. https://www.learncpp.com/cpp-tutorial/scope-duration-and-linkage-summary/

Somefile.hpp

#pragma once

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

Somefile.cpp

#include "Somefile.hpp"

#if !ARDUINO_USB_CDC_ON_BOOT
USBCDC USBSerial; // definition
#endif

Thank you that solved my problem.

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