打印
[STM32F1]

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

[复制链接]
3077|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Nuaa2014DW|  楼主 | 2016-5-23 16:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用原子虚拟串口例程改的,装了VCP驱动,我网上搜了半天,看见虚拟串口可以达到几百KB,但是我怎么也搞不出来。
uint8_t data[240];
u16 t,n,i;
int main(void)
{       
        for(t=0;t<240;t++)
        data[t]=t;         
        delay_init();                     //ÑÓʱº¯Êý³õʼ»¯          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶
        uart_init(115200);                 //´®¿Ú³õʼ»¯Îª115200
        LED_Init();                                  //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
       
        delay_ms(1800);
        USB_Port_Set(0);         //USBÏȶϿª
        delay_ms(700);
        USB_Port_Set(1);        //USBÔÙ´ÎÁ¬½Ó
        Set_USBClock();   
        USB_Interrupts_Config();   
        USB_Init();       

        while(1)
        {               
                for(i=0;i<4;i++)
                {               
                        UserToPMABufferCopy(data+i*60, ENDP1_TXADDR, 60);
                        SetEPTxCount(ENDP1, 60);
                        SetEPTxValid(ENDP1);
                }       
                        
        }
}
如上,发送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

使用特权

评论回复
5
Nuaa2014DW|  楼主 | 2016-5-23 23:00 | 只看该作者
FAQ 发表于 2016-5-23 18:58
240字节你要发10秒?

不是啊,我是while不断循环发送,用串口调试助手看接收到的数据,看串口助手上10S收到多少字节。

使用特权

评论回复
6
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就可以了,我就是拿战舰例程改的。

使用特权

评论回复
7
starkiki| | 2016-6-28 15:39 | 只看该作者
本帖最后由 starkiki 于 2016-6-28 15:41 编辑

64B不是问题.   你要另外开个buffer缓存接收数据.    比喻我做个协议.当让是我需要这样的协议.      每buffer数据512Byte*256  用来存一桢数据     桢协议 开始传输指令+数据指令+结束传输指令  数据位格式为 开始位+序号+数据+CRC16校验   
上位机每次发送   512Byte*256 数据    每帧等待100ns    一直发送       我测试 128K数据 应该不到1s  

使用特权

评论回复
8
seawwh| | 2016-6-28 21:41 | 只看该作者
将文件 usb_endp.c 中的

#define VCOMPORT_IN_FRAME_INTERVAL             5
改为
#define VCOMPORT_IN_FRAME_INTERVAL             1

使用特权

评论回复
9
Simon21ic| | 2016-6-29 11:37 | 只看该作者
每次传输60字节的话,每个报文间隔是1ms,一秒钟就是差不多60K。你试一下每次都发送64字节看看

使用特权

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

本版积分规则

2

主题

25

帖子

1

粉丝