Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
USB
USB虚拟串口
vcom
usb增加多路vcom的问题
发布于 2023-05-10 12:58:22 浏览:633
订阅该版
[tocm] # usb增加多路vcom的问题 ## 简介 因项目需要,需要使用USB组合设备实现两路虚拟串口并同时挂载虚拟U盘,rtthread目前默认只支持一路虚拟串口,现在需要增加一路虚拟串口。 ### 测试环境 Rtthread版本:v4.1.0; 开发板:野火F407霸天虎V2; 计算机:windows11; 其他:串口调试助手、MobaXterm(作为shell终端) ### 已完成工作 新增一路CDC vcom,初步完成了2路虚拟串口的挂载,用USB连接开发板和计算机后,计算机能够识别出两路串口,并且虚拟U盘也能够使用; ### 遗留问题 1. 串口调试助手打开串口时,存在卡死的情况; 2. 两路串口无法同时正常使用,在开发板写的发送数据测试代码,总有一路串口启动后,计算机打开串口助手无法收到数据。 3. 出现上面两个问题后,计算机显示USB断开,然后自动重新连接,但无法正常连接,显示无法找到设备描述符。 ## 开发记录 ### 前提条件 已经实现了USB组合设备配置模式下挂载虚拟串口和虚拟U盘。具体实现过程可参考其他开发者的文章,在此不做重复描述。 ### 新增vcom 通过查看rt-thread源码,可知,各种USB设备的驱动代码位于**rt-thread\components\drivers\usb\usbdevice\class**目录下,并且看到了虚拟串口设备驱动文件**cdc_vcom.c**以及其他各类如大容量存储设备**mstorage.c**(用于虚拟U盘)等。所以我的思路就是最简单直接暴力的方法,拷贝cdc_vcom.c并重命名为**cdc_vcom2.c**作为第二路虚拟串口驱动。 ![image-20230510113614416.png](https://oss-club.rt-thread.org/uploads/20230510/e886f2ff75817691af73ee4f5669719a.png) 由于拷贝过来后避免编译错误,所以需要修改,主要对**cdc_vcom2.c**修改如下: - 修改设备名 由于设备名必须是唯一的,以及存在了vcom,故这里重新命名为vcom2。 ```c #define VCOM_DEVICE "vcom2" // vcom->vcom2 ``` - 修改事件名和线程名 修改函数rt_usb_vcom_init内代码 ```c rt_event_init(&data->tx_event, "vcom2", RT_IPC_FLAG_FIFO); // vcom->vcom2 rt_thread_init(&vcom_thread, "vcom2", // vcom->vcom2 vcom_tx_thread_entry, func, vcom_thread_stack, VCOM_TASK_STK_SIZE, 16, 20); ``` - 修改注册函数 避免函数重复定义,修改注册函数部分,主要就是在函数名添加了后缀2,在文件最后代码,修改如下: ```c struct udclass vcom_class2 = { .rt_usbd_function_create = rt_usbd_function_cdc_create2 }; int rt_usbd_vcom_class_register2(void) { rt_usbd_class_register(&vcom_class2); return 0; } INIT_PREV_EXPORT(rt_usbd_vcom_class_register2); #endif ``` ### 编译并解决bug 编译后下载,运行后调试终端显示错误: ```shell endpoint assign error ``` > 端点分配错误。 通过定位发现在文件usbdevice_core.c的rt_usbd_device_add_config()函数中报错: ![image-20230510115201142.png](https://oss-club.rt-thread.org/uploads/20230510/08b5479c13e485cc33d58c4a8ffdf43a.png) 进入函数rt_usbd_ep_assign()后通过调试发现,USB设备的端点列表无法有效分配给各接口设备,而端点列表的定义位于**libraries\HAL_Drivers\drv_usbd.c**,新增了一个虚拟串口后,需要在该列表中增加端点,修改如下: ```c static struct ep_id _ep_pool[] = { {0x0, USB_EP_ATTR_CONTROL, USB_DIR_INOUT, 64, ID_ASSIGNED }, #ifdef BSP_USBD_EP_ISOC {0x1, USB_EP_ATTR_ISOC, USB_DIR_IN, 64, ID_UNASSIGNED}, {0x1, USB_EP_ATTR_ISOC, USB_DIR_OUT, 64, ID_UNASSIGNED}, #else {0x1, USB_EP_ATTR_BULK, USB_DIR_IN, 64, ID_UNASSIGNED}, {0x1, USB_EP_ATTR_BULK, USB_DIR_OUT, 64, ID_UNASSIGNED}, #endif {0x2, USB_EP_ATTR_INT, USB_DIR_IN, 64, ID_UNASSIGNED}, {0x2, USB_EP_ATTR_INT, USB_DIR_OUT, 64, ID_UNASSIGNED}, {0x3, USB_EP_ATTR_BULK, USB_DIR_IN, 64, ID_UNASSIGNED}, // 添加一个vcom, 需要2个BULK,1个INT {0x5, USB_EP_ATTR_INT, USB_DIR_IN, 64, ID_UNASSIGNED}, {0x6, USB_EP_ATTR_BULK, USB_DIR_OUT, 64, ID_UNASSIGNED}, {0x6, USB_EP_ATTR_BULK, USB_DIR_IN, 64, ID_UNASSIGNED}, #if !defined(SOC_SERIES_STM32F1) {0x3, USB_EP_ATTR_BULK, USB_DIR_OUT, 64, ID_UNASSIGNED}, #endif {0xFF, USB_EP_ATTR_TYPE_MASK, USB_DIR_MASK, 0, ID_ASSIGNED }, }; ``` 重新编译,下载,连接开发板,计算机正常识别出了两个串口: ![image-20230510125041534.png](https://oss-club.rt-thread.org/uploads/20230510/ced35996a0fc3c8c72432bc4fadee81b.png) **目前就剩下前面所说的遗留问题了。** ## 附录 ### 串口测试代码 添加测试文件example_vcom.c,加入编译,启动后在调试终端输入如下命令即可: ```shell $ cmd_vcom vcom # 测试虚拟串口1 $ cmd_vcom vcom2 # 测试虚拟串口2 ``` 代码如下: ```c #include
#include
#include
#ifdef RT_USING_ULOG #define LOG_TAG "example_vcom" #define LOG_LVL LOG_LVL_DBG #include
#endif int example_vcom(int argc, char *argv[]) { if(argc<2){ return RT_ERROR; } rt_device_t dev = RT_NULL; char buf[] = "hello rt-thread!\r\n"; dev = rt_device_find(argv[1]); if (dev) { LOG_I("open usb %s", argv[1]); rt_device_open(dev, RT_DEVICE_FLAG_RDWR); } else { LOG_E("could not open vcom"); return -RT_ERROR; } for (int i = 0; i < 10; ++i) { LOG_I("send %d", i); rt_device_write(dev, 0, buf, rt_strlen(buf)); rt_thread_mdelay(500); } rt_device_close(dev); return RT_EOK; } // MSH_CMD_EXPORT(example_vcom, USB Device vcom example) MSH_CMD_EXPORT_ALIAS(example_vcom, cmd_vcom, USB Device vcom example) ```
2
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
wujin
无人机开发者
文章
1
回答
1
被采纳
0
关注TA
发私信
相关文章
1
请教USB Host
2
STM32F4调试USB 读卡器(Slave)提示格式化
3
急求 STM32F4 USB Device MSC+SD 的相关问题
4
USB 框架问题
5
USB键盘
6
LPC17xx 如何添加USB HOST设备
7
RT-Thread目前支持USB HOST了吗?
8
USB HOST的支持问题
9
RTT 2.0.1 USB存储设备问题,枚举到USBREQ_GET_MAX_LUN后复位
10
USB库已经很久没更新了
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部