CH32V305的高速USB2.0 CDC串口速度测试(很快啊)——2023.11.29

准备

  • 硬件:CH32V305RB
  • 软件:CherryUSB

测试流程

CH32V305作为CDC串口设备与电脑连接,并向电脑循环发送数据,每次发送8192字节。电脑端用python脚本打开串口循环读数据,读到一定数量后关闭串口并计算时间和速度。由于pyserial一次写大量数据很麻烦,所以为了方便测试就只做了电脑端读数据的测试。

测试代码

单片机代码

void cdc_acm_data_send_with_dtr_test(void)
{
    static uint8_t i = 0;
    if (dtr_enable) {
        write_buffer[0] = i;
        i++;
        ep_tx_busy_flag = true;
        usbd_ep_start_write(USBD_IF1_AL0_EP1_ADDR, write_buffer, 8192);
    }
}

int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	SystemCoreClockUpdate();
	Delay_Init();
	USART_Printf_Init(115200);	
	printf("SystemClk:%d\r\n",SystemCoreClock);
	printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
	printf("This is printf example\r\n");

	bsp_init();

    const uint8_t data[10] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30 };

    memcpy(&write_buffer[0], data, 10);
    memset(&write_buffer[10], 'A', 8192 - 10);

    usbd_desc_register(usbd_descriptor);
    usbd_add_interface(usbd_cdc_acm_init_intf(&intf0));
    usbd_add_interface(usbd_cdc_acm_init_intf(&intf1));
    usbd_add_endpoint(&cdc_out_ep);
    usbd_add_endpoint(&cdc_in_ep);
    usbd_initialize();

    while (1)
    {
        cdc_acm_data_send_with_dtr_test();
    }
}

python脚本

import serial
import time

baudrate = 1152000
pack_size = 8192
total_count = 15200

com_num = input("请输入需要测试的串口号:")
ser = serial.Serial(com_num, baudrate)
ser.close()
if(ser.isOpen()):
    print("串口关闭失败")
else:
    print("串口关闭成功")
ser.open()
print("串口打开成功")
ser.dtr = True

start_time = 0
size_count = 0
print("开始测试")

for i in range(4):
    while 1:
        if size_count == 0:
            start_time = time.time()
    
        com_input = ser.read(pack_size)
        size_count = size_count + 1

        if size_count == total_count:
            end_time = time.time()
            size_count = 0
            total_time = end_time - start_time
            print("测试数据量%dMB, 时间%.2fs, 速度%.2fMB/s" %(total_count*pack_size/1000000, total_time, (total_count*pack_size/1000000)/total_time))
            break

ser.close()
if(ser.isOpen()):
    print("串口关闭失败")
else:
    print("串口关闭成功")

结果

在这里插入图片描述
30.8MB/s的速度还是很快的了,也还有一定的优化空间,目前移植的CherryUSB底层还没实现双缓冲方式。不过这个速度是没有发送间隔的极限速度,模拟的是连续不断的传输大量数据,实际应用中不一定能跑到,两次发送之间稍微有点延时,速度就下来了。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值