[STM32F1] STM32F103 USB虚拟串口速度始终突破不了64K/s

[复制链接]
 楼主| Nuaa2014DW 发表于 2016-5-23 16:27 | 显示全部楼层 |阅读模式
使用原子虚拟串口例程改的,装了VCP驱动,我网上搜了半天,看见虚拟串口可以达到几百KB,但是我怎么也搞不出来。
  1. uint8_t data[240];
  2. u16 t,n,i;
  3. int main(void)
  4. {       
  5.         for(t=0;t<240;t++)
  6.         data[t]=t;         
  7.         delay_init();                     //ÑÓʱº¯Êý³õʼ»¯          
  8.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶
  9.         uart_init(115200);                 //´®¿Ú³õʼ»¯Îª115200
  10.         LED_Init();                                  //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
  11.        
  12.         delay_ms(1800);
  13.         USB_Port_Set(0);         //USBÏȶϿª
  14.         delay_ms(700);
  15.         USB_Port_Set(1);        //USBÔÙ´ÎÁ¬½Ó
  16.         Set_USBClock();   
  17.         USB_Interrupts_Config();   
  18.         USB_Init();       

  19.         while(1)
  20.         {               
  21.                 for(i=0;i<4;i++)
  22.                 {               
  23.                         UserToPMABufferCopy(data+i*60, ENDP1_TXADDR, 60);
  24.                         SetEPTxCount(ENDP1, 60);
  25.                         SetEPTxValid(ENDP1);
  26.                 }       
  27.                         
  28.         }
  29. }
如上,发送240字节的数组,分4次每次60字节。速度60K左右(串口助手接收10秒,算出每秒字节数)。求指教如何提高速度?
 楼主| Nuaa2014DW 发表于 2016-5-23 16:34 | 显示全部楼层
网上说一帧能发送多个数据包?具体怎么操作?
FAQ 发表于 2016-5-23 18:58 | 显示全部楼层
240字节你要发10秒?
lxyppc 发表于 2016-5-23 19:17 来自手机 | 显示全部楼层
60字节就是告诉USB主控器,我一帧只发一包
要发多包需要发送的数据大小为endpoint max packet size
并且在上一包的数据发完前准备好下一包数据(双缓冲)

如果只是简单应用USB,找个满足自己的例程修改
如果要调优性能,得看USB的specification
 楼主| Nuaa2014DW 发表于 2016-5-23 23:00 | 显示全部楼层
FAQ 发表于 2016-5-23 18:58
240字节你要发10秒?

不是啊,我是while不断循环发送,用串口调试助手看接收到的数据,看串口助手上10S收到多少字节。
 楼主| Nuaa2014DW 发表于 2016-5-23 23:29 | 显示全部楼层
lxyppc 发表于 2016-5-23 19:17
60字节就是告诉USB主控器,我一帧只发一包
要发多包需要发送的数据大小为endpoint max packet size
并且在 ...

你说的endpoint max packet size是指哪个?UserToPMABufferCopy是库里的函数哎,这个长度只能64B哎,超过64接收不到数据。我要求不高,100KB~200KB就可以了,我就是拿战舰例程改的。
starkiki 发表于 2016-6-28 15:39 | 显示全部楼层
本帖最后由 starkiki 于 2016-6-28 15:41 编辑

64B不是问题.   你要另外开个buffer缓存接收数据.    比喻我做个协议.当让是我需要这样的协议.      每buffer数据512Byte*256  用来存一桢数据     桢协议 开始传输指令+数据指令+结束传输指令  数据位格式为 开始位+序号+数据+CRC16校验   
上位机每次发送   512Byte*256 数据    每帧等待100ns    一直发送       我测试 128K数据 应该不到1s  
seawwh 发表于 2016-6-28 21:41 | 显示全部楼层
将文件 usb_endp.c 中的

#define VCOMPORT_IN_FRAME_INTERVAL             5
改为
#define VCOMPORT_IN_FRAME_INTERVAL             1
Simon21ic 发表于 2016-6-29 11:37 | 显示全部楼层
每次传输60字节的话,每个报文间隔是1ms,一秒钟就是差不多60K。你试一下每次都发送64字节看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

25

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部