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

相关文章

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的交集,并集方法一

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2

VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virtual disk”问题

《VMWare报错“指定的文件不是虚拟磁盘“或“Thefilespecifiedisnotavirtualdisk”问题》文章描述了如何修复VMware虚拟机中出现的“指定的文件不是虚拟... 目录VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virt

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专