Arduino RP2040 两个CDC虚拟串口通讯

2023-11-21 08:59

本文主要是介绍Arduino RP2040 两个CDC虚拟串口通讯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Arduino RP2040 两个CDC虚拟串口通讯


  • 🎬通讯效果演示:
    在这里插入图片描述
  • 🌿基于Earle F. Philhower的固件开发平台: https://github.com/earlephilhower/arduino-pico
  • 🔖USB配置参考:https://arduino-pico.readthedocs.io/en/latest/usb.html
  • ✅本例程使用的开发板:YD-RP2040版(源地YD-RP2040)
    在这里插入图片描述

📑功能说明

🖋两个CDC虚拟串口通讯,不受波特率限制,物理上只占用一个USB接口。

🛠参数配置

  • 🔧编译并运行此例程需要将默认参数中的USB Stack配置为Adafruit TinyUSB库才可以实现多个USB设备的挂载。
    在这里插入图片描述
  • 🔨修改Adafruit TinyUSB库中的默认参数
    -

🔖个人的文件路径参考:

C:\Users\Administrator\AppData\Local\Arduino15\packages\rp2040\hardware\rp2040\3.3.0\libraries\Adafruit_TinyUSB_Arduino\src\arduino\ports\rp2040
    • 👉🏻修改宏CFG_TUD_CDC 参数为2,默认是只生成一个CDC虚拟串口。
//--------------------------------------------------------------------
// Device Configuration
//--------------------------------------------------------------------#define CFG_TUD_ENDOINT0_SIZE 64#define CFG_TUD_CDC 2   //默认值是1,只生成一个虚拟CDC端口,2代表生成2个CDC虚拟端口 
#define CFG_TUD_MSC 1
#define CFG_TUD_HID 2
#define CFG_TUD_MIDI 1
#define CFG_TUD_VENDOR 1
  • 🌿程序烧录成功后,将生成2个CDC虚拟串口:
    在这里插入图片描述
  • ✨如果是第一次使用Arduino平台开发,那么需要按住RP2040开发板上的Boot按键,通过USB数据线连接到电脑USB端口,会出现一个64MB的虚拟U盘,此再编译上传代码即可。

📝例程代码

  • 🔖本例程代码可以在固件库自带的例程示例中找到:
    在这里插入图片描述
/*This example demonstrates the use of multiple USB CDC/ACM "VirtualSerial" portsWritten by Bill Westfield (aka WestfW), June 2021.Copyright 2021 by Bill WestfieldMIT license, check LICENSE for more information
*//* The example creates two virtual serial ports. Text entered onany of the ports will be echoed to the all ports with- all lower case in port0 (Serial)- all upper case in port1
需要修改库中的配置参数:libraries/Adafruit_TinyUSB_Arduino/src/arduino/ports/rp2040/tusb_config_rp2040.h
#define CFG_TUD_CDC 2 //默认值是1,只生成一个虚拟CDC端口,2代表生成2个CDC虚拟端口Requirement:The max number of CDC ports (CFG_TUD_CDC) has to be changed to at least 2.Config file is located in Adafruit_TinyUSB_Arduino/src/arduino/ports/{platform}/tusb_config_{platform}.hwhere platform is one of: nrf, rp2040, samdNOTE: Currnetly multiple CDCs on ESP32-Sx is not yet supported.An PR to update core/esp32/USBCDC and/or pre-built libusb are needed.We would implement this later when we could.
*/#include <Adafruit_TinyUSB.h>#define ARDUINO_ARCH_RP2040
#define LED LED_BUILTIN// Create 2nd instance of CDC Ports.
#ifdef ARDUINO_ARCH_ESP32
#error "Currnetly multiple CDCs on ESP32-Sx is not yet supported. An PR to update core/esp32/USBCDC and/or pre-built libusb are needed."
// for ESP32, we need to specify instance number when declaring object
Adafruit_USBD_CDC USBSer1(1);
#else
Adafruit_USBD_CDC USBSer1;
#endifvoid setup() {pinMode(LED, OUTPUT);Serial.begin(115200);// check to see if multiple CDCs are enabledif ( CFG_TUD_CDC < 2 ) {digitalWrite(LED, HIGH); // LED on for error indicatorwhile (1) {//如果没有修改Adafruit_TinyUSB_Arduino/src/arduino/ports/tusb_config_rp2040.h中的CFG_TUD_CDC参数,程序将停留在这里面运行Serial.printf("CFG_TUD_CDC must be at least 2, current value is %u\n", CFG_TUD_CDC);Serial.println("  Config file is located in Adafruit_TinyUSB_Arduino/src/arduino/ports/{platform}/tusb_config_{platform}.h");Serial.println("  where platform is one of: nrf, rp2040, samd");digitalWrite(LED, HIGH);delay(1000);digitalWrite(LED, LOW);delay(1000);}}// initialize 2nd CDC interfaceUSBSer1.begin(115200);while (!Serial || !USBSer1) {if (Serial) {Serial.println("Waiting for other USB ports");}if (USBSer1) {USBSer1.println("Waiting for other USB ports");}delay(1000);}Serial.print("You are port 0\n\r\n0> ");USBSer1.print("You are port 1\n\r\n1> ");
}int LEDstate = 0;void loop() {int ch;ch = Serial.read();if (ch > 0) {printAll(ch);}ch = USBSer1.read();if (ch > 0) {printAll(ch);}if (delay_without_delaying(500)) {LEDstate = !LEDstate;digitalWrite(LED, LEDstate);}
}// print to all CDC ports
void printAll(int ch) {// always lower caseSerial.write(tolower(ch));// always upper caseUSBSer1.write(toupper(ch));
}// Helper: non-blocking "delay" alternative.
boolean delay_without_delaying(unsigned long time) {// return false if we're still "delaying", true if time ms has passed.// this should look a lot like "blink without delay"static unsigned long previousmillis = 0;unsigned long currentmillis = millis();if (currentmillis - previousmillis >= time) {previousmillis = currentmillis;return true;}return false;
}

这篇关于Arduino RP2040 两个CDC虚拟串口通讯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/401298

相关文章

SpringBoot3中使用虚拟线程的完整步骤

《SpringBoot3中使用虚拟线程的完整步骤》在SpringBoot3中使用Java21+的虚拟线程(VirtualThreads)可以显著提升I/O密集型应用的并发能力,这篇文章为大家介绍了详细... 目录1. 环境准备2. 配置虚拟线程方式一:全局启用虚拟线程(Tomcat/Jetty)方式二:异步

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

C#使用MQTTnet实现服务端与客户端的通讯的示例

《C#使用MQTTnet实现服务端与客户端的通讯的示例》本文主要介绍了C#使用MQTTnet实现服务端与客户端的通讯的示例,包括协议特性、连接管理、QoS机制和安全策略,具有一定的参考价值,感兴趣的可... 目录一、MQTT 协议简介二、MQTT 协议核心特性三、MQTTNET 库的核心功能四、服务端(BR

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.

java两个List的交集,并集方式

《java两个List的交集,并集方式》文章主要介绍了Java中两个List的交集和并集的处理方法,推荐使用Apache的CollectionUtils工具类,因为它简单且不会改变原有集合,同时,文章... 目录Java两个List的交集,并集方法一方法二方法三总结java两个List的交集,并集方法一