修改的USB虚拟串口程序,只给PC发数据,如何提高速度?
我的程序只修改了,keil例子中USB虚拟串口程序的main()函数,请问怎么才能获得100k/s以上的速度啊?我的只有10k左右。
CDC类的极限速度是多少啊?
keil是3.5版本的,例子中的缓冲区参数应该是64。
main()如下:
int main(void)
{
u8 data[64];
u8 i;
#ifdef DEBUG
debug();
#endif
Set_System();
Set_USBClock();
USB_Interrupts_Config();
USB_Init();
for(i=0;i<64;i++)data=i;
while (1)
{
/*
if ((count_out != 0) && (bDeviceState == CONFIGURED))
{
USB_To_USART_Send_Data(&buffer_out[0], count_out);
count_out = 0;
}
*/
UserToPMABufferCopy(data, ENDP1_TXADDR, 64);
SetEPTxCount(ENDP1, 64);
SetEPTxValid(ENDP1);
}
}
上面的程序只是想测试一下速度,先不考虑丢数据的问题。
我很菜,希望大家多说说。
我是实验的情况是虚拟串口连续向PC发送数据速度约为 55KByte/sec,参考代码如下:
while (1) {
while (count_in);
count_in=64;
UserToPMABufferCopy(data, ENDP1_TXADDR, count_in);
SetEPTxCount(ENDP1, count_in);
SetEPTxValid(ENDP1);
}
如果注释掉 UserToPMABufferCopy 速率提高不明显;
如果注释掉 while (count_in) 速率提高到65kByte/s
显然,虚拟串口的速率很慢,对比 Mass Storage 程序500KByte/s 差了很多。
不只如何才能改进?
3楼:
按照你的程序,我测试了下,我这里依然是10k左右,现在有个活要用虚拟串口,挺急的。那位朋友给指指导下方法。先谢谢了!我的目标只要到100k左右就可以了。
在while里,写这三句是错的。
UserToPMABufferCopy(data, ENDP1_TXADDR, 64);
SetEPTxCount(ENDP1, 64);
SetEPTxValid(ENDP1);
这三句话分别是拷贝数据到端点寄存器,设置发送长度,和使能端点。
USB的通信都是由主机发起的,也就是说,如果主机不要求设备发送数据,即使使能了STM32的端点,并且设置了发送长度,整个发送事件还是不会发生的。
所以不能在while里反复的使能端点,而应该在上一次发送成功完成之后,才使能下一次的发送事件。看上去这个错误是例程里就存在的,所以这个CDC的例程通信一直不稳定。
上一次发送成功的标志是EP1_OUT_Callback函数,只要中断函数调用了这个callback函数,就说明上一次的发送成功了。
请问搂主: 你使用什么方法测试的Virtual COM 的发送速度的?
需要注意的是,如果PC一侧的接收程序慢,也可能导致速度问题。比如接收程序含有屏幕显示。
我使用的是自己编写的Delphi 代码,测的的结果是 55KByte/s 左右。
to 7楼:
我使用串口调试助手测试速度的,方法是在10秒钟内看看接受到了多少字节。
测试的速度只有10k/s 。PC一侧的程序应该不会这么慢吧,seawwh 能给我一份你的Delphi程序么??我想测试一下。谢谢。
to 6楼:
我仔细想了下,你说的有道理,我这就改改程序。我很菜,vigia 能给些代码么??
你用这个小程序测试一下
-
-
USB VCOM Test.rar (171.06 KB)
今天的实验结果: 单向传输(STM32 To PC) , PC端不显示具体数据。
在XP环境 Core 2 Duo 2.1G, STM32 72MHz VCom 传输率675KB/s
换了一台配置低挺多的 XP机器,传输率 680KB/s;
在 Win2K 的情况下, 传输率 55KB/s;
改动 interrupt 端点的 Interval 的值没有影响。数据单向传送由STM32 to PC机。
看来CDC的传输性能和操作系统的版本关系挺大。
while (1) {
while (count_in);
count_in=64;
UserToPMABufferCopy(data, ENDP1_TXADDR, count_in);
SetEPTxCount(ENDP1, count_in);
SetEPTxValid(ENDP1);
}
用双缓存试试,不过在IN接口上的双缓存应该效果不大。
UserToPMABufferCopy(data, ENDP1_TXADDR, 64);
SetEPTxCount(ENDP1, 64);
SetEPTxValid(ENDP1);
这3句式对的,CDC设备中,主机会不断的polling设备,所以只要简单发送数据即可。
TO:seawwh
你好,我在一台dell四核工作站和一台神州笔记本,做的实验,结果都是一样的,两台电脑都是
windows xp sp3 系统。我用串口助手的速度是10K 。
如果和系统有关的话,那就是驱动版本的问题了。
seawwh 有么有用串口助手试试呢??????
再有就是 seawwh 你是不是只 改动了虚拟串口例子中的main()函数呢??
回答12楼:
你试验速度慢的主要原因是PC机显示开销太大造成的,
我是使用自己写的Delphi 小程序测试,不显示收到的数据,只显示计数值。
在XP系统下,速度650kByt/s
建议你使用串口助手的时候,要缩小或关闭数据显示窗口,减小显示开销。
其实你的项目也需要些上位机程序的,不妨写一个小程序测试以下。
我用AccessPort 测试了一下,确实验证了你的说法,开显示窗口的时候很慢,但是我缩小关闭数据显示窗口后,速度接近650kByt/s。
另外,我没有改动虚拟串口例子的其他部分。
回答13楼:
我做了下试验,正如seawwh 所说,确实是因为串口调试助手的问题,我的测试结果为660kByt/s。
感谢seawwh 给的帮助。谢谢!!!
我用USB VCOM TEST.RAR测试发现STM32 USB->PC只有64K,PC-->STM32 USB 倒是可以有600多K
原因是什么啊? 我的CPU E2410 @1.6G 1G RAM