Arduino stm32 USB CDC虚拟串口使用示例

发布时间:2023年12月29日

Arduino stm32 USB CDC虚拟串口使用示例


[env:genericSTM32F401RC]
platform = ststm32
board = genericSTM32F401RC
framework = arduino
build_flags = 
            -D USBCON 
            -D USBD_USE_CDC
 ;           -D USE_USB_HS
upload_protocol = stlink
;upload_protocol = serial
;upload_protocol = jlink
;upload_protocol = cmsis-dap
  • 🧨 STM32 USB CDC虚拟串口在Arduino IDE中好像可以在功能菜单上选择,由于IDE环境支持包没有安装,没有进一步验证。 ?个人还是推荐VSCode + PIO 方式来开发,比较灵活和便捷。?

🔨Arduino IDE 环境下配置USB CDC虚拟串口方法

  • 🔖这里以Arduino IDE 2.2.1版本设置为例,进行USB CDC虚拟串口配置:
    在这里插入图片描述

📗USBSerial API相关函数

  • 🔖 基本功能函数和硬件串口相关功能函数是一样。
    void begin(void);
    void begin(uint32_t);
    void begin(uint32_t, uint8_t);
    void end(void);

    virtual int available(void);
    virtual int availableForWrite(void);
    virtual int peek(void);
    virtual int read(void);
    virtual size_t readBytes(char *buffer, size_t length);  // read chars from stream into buffer
    virtual size_t readBytesUntil(char terminator, char *buffer, size_t length);  // as readBytes with terminator character
    virtual void flush(void);
    virtual size_t write(uint8_t);
    virtual size_t write(const uint8_t *buffer, size_t size);
  • ? 为什么是使用Serial,因为在WSerial.h文件中有如下定义:
#if defined (USBCON) && defined(USBD_USE_CDC)
  #ifndef DISABLE_GENERIC_SERIALUSB
    #define ENABLE_SERIALUSB
    #if !defined(Serial)
      #define Serial SerialUSB
      #define serialEvent serialEventUSB
    #endif
  #endif

  #if defined(ENABLE_SERIALUSB)
    #define HAVE_SERIALUSB
  #endif

📝示例代码

#include <Arduino.h>
//#include <HardwareSerial.h>
#include <USBSerial.h>
//HardwareSerial Serial2(USART2); // 创建一个Serial2对象
//Arduino IDE环境下需要启用下面2个宏
// #define USBCON  1
// #define USBD_USE_CDC 1

//----------
// #define USB_CDC_HID 1

// put function declarations here:
int myFunction(int, int);

#define led1 PC13
#define led2 PA_5

uint32_t TimerUART;

 //HardwareSerial Serial1(PA10, PA9);//RX,TX将Serialx(x=1-4)串口x的管脚指定到PA10,PA9引脚上
 //USBSerial SerialCDC; // 创建一个USBSerial对象
//  the setup function runs once when you press reset or power the board
void setup()
{
  // Serial1.begin(115200);  // 初始化串口1作为调试串口
  // Serial.begin(115200); // Serial = Serial2初始化串口2作为调试信息输出
   // Serial.begin(115200);
   Serial.begin();
  // initialize digital pin LED_BUILTIN as an output.
  // Serial1.setRx(PA10); // using pin name PY_n
  // Serial1.setTx(PA9); // using pin number PYn
 // Serial.begin(115200);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
 // pinMode(LED_BUILTIN, OUTPUT);
  TimerUART = HAL_GetTick();
}

// the loop function runs over and over again forever
void loop()
{
  if ((HAL_GetTick() - TimerUART) > 1000)
  {
    digitalToggle(led1);
    digitalToggle(led2);
    Serial.println("USART2(PA2 PA3)Arduino STM32F401RC \n");
   // delay(500); // wait for a second
   Serial.printf("USART1(PA9 PA10)STM32F401 SysClockFreq:%d \r\n", HAL_RCC_GetSysClockFreq());
    Serial.print("from SerialUSB data\n");
    TimerUART = HAL_GetTick();
  }
}

// put function definitions here:
int myFunction(int x, int y)
{
  return x + y;
}
  • 🌿输出效果:
    在这里插入图片描述
文章来源:https://blog.csdn.net/weixin_42880082/article/details/135280240
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。