准备
- 硬件: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底层还没实现双缓冲方式。不过这个速度是没有发送间隔的极限速度,模拟的是连续不断的传输大量数据,实际应用中不一定能跑到,两次发送之间稍微有点延时,速度就下来了。