打印

GD32 CDC 速度测试

[复制链接]
1259|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主


1.  电路图
  file:///C:/Users/MENGSI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png

2.  例程说明
   约定简单通讯协议,测试虚拟串口最大传输速度
(1)  测试平台
   1 WIN1032/64位(免驱动),WIN7 32 /64 需安装驱动
       2 UsbTest.exe 测试工具,传输速度500K 左右
(2)   通讯协议说明
上位机发送一帧数据格式55 AA LEN(2BYTE) DATA ...
下位机发送一帧数据格式55 AA LEN(2BYTE) DATA ...
3.  软件设计
    UsbTest 上位机软件按5K一次循环读取选择的文件内容,
按格式 55 AA LEN(2BYTE) DATA ... 发送给下位机,下位机接收完数据后按
55 AA LEN(2BYTE) DATA ... 格式发回给上位机,上位机根据接收到的DATA写进temp.txt
文件中,当文件发送完成后对比temp.txt和选择的文件可知是否丢失数据。
(1)  上位机说明
1. 如下图所示,Open打开串口,GetFile 选择文件后开始传输数据
file:///C:/Users/MENGSI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image003.png

2 传输完成后用BCompare软件对比发送和接收的文件,如下图所示 ,18.5M的文件并未丢失数据
  file:///C:/Users/MENGSI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image005.png
(2)下位机代码说明
    1 APP.c 文件代码说明
   
iUsbLen=0;  //接收的数据长度
     iUsbFlag=0;//接收完成标记
      iUsbLenPre=0;
     
    /* main loop*/
  while (1)
     {
          if(iUsbFlag==0x80)//一帧数据 接收完毕
          {
               SendUsbDate(&cdc_acm,iUsbBuf,iUsbLen);//发送数据返回给下位机
               iUsbLenPre=0;
               iUsbLen=0;  //接收的数据长度
               iUsbFlag=0;//接收完成标记
               iCmt++;
               if(iCmt%2)gpio_bit_reset(GPIOB,GPIO_PIN_12);
               elsegpio_bit_set(GPIOB,GPIO_PIN_12);
          }
          continue;
    }
2 cdc_acm_core.c文件代码说明
USB虚拟串口接收函数
static uint8_t cdc_acm_out (usb_dev *udev,uint8_t ep_num)
{
   usb_cdc_handler *cdc = (usb_cdc_handler*)udev->dev.class_data[CDC_COM_INTERFACE];
   cdc->packet_receive = 1U;
   cdc->receive_length = ((usb_core_driver*)udev)->dev.transc_out[ep_num].xfer_count;
     iUsbFlag=0;//接收完成标记
            if(cdc->data[0]==0x55&&cdc->data[1]==0xAA)//帧开头
            {
                              iUsbLen=cdc->data[2]*256+cdc->data[3];      
            }
            for(uint8_ti=0;i<cdc->receive_length;i++)
            {
                     if(iUsbLenPre>=10239)break;
                     iUsbBuf[iUsbLenPre++]=cdc->data;
            }
            
            if(iUsbLenPre>=iUsbLen||iUsbLenPre>10239)        
            {
                     iUsbFlag=0x80;//接收完成标记
            }                          
                  cdc_acm_data_receive(udev);
   return USBD_OK;
}
USB虚拟串口发送函数
void SendUsbDate(usb_dev*udev,uint8_t*Buf,uint32_t len)
{
   usb_cdc_handler *cdc = (usb_cdc_handler*)udev->dev.class_data[CDC_COM_INTERFACE];
   if (0U != len)
              {
       cdc->packet_sent = 0U;
       usbd_ep_send (udev, CDC_DATA_IN_EP, (uint8_t*)(Buf), len);
                            cdc->receive_length = 0U;
    }
}











单片机地址
https://github.com/siyuan1644/GD32-USB_CDC-TEST.git

VS 代码地址
https://github.com/siyuan1644/UsbSpeedTest.git

对比.png (623.01 KB )

对比文件

对比文件

上位机.png (27.57 KB )

上位机

上位机

USB 电路图.png (23.12 KB )

USB 电路

USB 电路

GD32 虚拟串口通讯.rar

5.56 MB

单片机源码

UsbTest.rar

5.86 MB

上位机源码

使用特权

评论回复
沙发
LLGTR| | 2022-9-15 13:15 | 只看该作者
看着样子,CDC速度还是完全够用的!

使用特权

评论回复
板凳
andygirl| | 2022-10-3 10:02 | 只看该作者
电路图,这个路径是不是有点玄了

使用特权

评论回复
地板
dxfshsh| | 2022-10-3 15:49 | 只看该作者
GD32E103如果不做数据处理,单纯的收发,做到600k应该是没问题的

使用特权

评论回复
5
chenjun89| | 2022-10-4 09:54 | 只看该作者
学习了,谢谢讲解。

使用特权

评论回复
6
V853| | 2022-10-5 20:44 | 只看该作者
1分钟大概15MB?

使用特权

评论回复
7
软核硬核| | 2022-10-5 20:46 | 只看该作者
开源真不错,就喜欢大佬开源。

使用特权

评论回复
8
tpgf| | 2022-10-8 11:52 | 只看该作者
CDC的速度在主要的通讯方式里边处于一个什么水平呢

使用特权

评论回复
9
qcliu| | 2022-10-8 12:05 | 只看该作者
虚拟串口和实际物理串口的速度相比 哪个更有优势呢

使用特权

评论回复
10
drer| | 2022-10-8 12:13 | 只看该作者
接收数据的长度一般最长能达到多少个字节?受到什么的限制呢

使用特权

评论回复
11
coshi| | 2022-10-8 12:41 | 只看该作者
虚拟串口的通讯对环境的干扰敏感吗

使用特权

评论回复
12
kxsi| | 2022-10-8 13:32 | 只看该作者
应该编写与USB端点大小相同的数据块,以获得最大的传输速度

使用特权

评论回复
13
wiba| | 2022-10-8 13:38 | 只看该作者
如果使用的是USB 1.1,则限制为64KB / s,USB 2.0全速将限制为512KB / s。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

20

帖子

0

粉丝