修改的USB虚拟串口程序,只给PC发数据,如何提高速度?

shily   2009-9-26 23:43 楼主


我的程序只修改了,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);
  }
}

回复评论 (15)

上面的程序只是想测试一下速度,先不考虑丢数据的问题。
我很菜,希望大家多说说。
点赞  2009-9-27 19:53
我是实验的情况是虚拟串口连续向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 差了很多。
不只如何才能改进?
点赞  2009-9-29 16:41
3楼:
按照你的程序,我测试了下,我这里依然是10k左右,现在有个活要用虚拟串口,挺急的。那位朋友给指指导下方法。先谢谢了!我的目标只要到100k左右就可以了。
点赞  2009-9-29 21:10
                                 自己顶,高人现身吧
点赞  2009-10-1 23:02


在while里,写这三句是错的。
UserToPMABufferCopy(data, ENDP1_TXADDR, 64);
SetEPTxCount(ENDP1, 64);
SetEPTxValid(ENDP1);

这三句话分别是拷贝数据到端点寄存器,设置发送长度,和使能端点。

USB的通信都是由主机发起的,也就是说,如果主机不要求设备发送数据,即使使能了STM32的端点,并且设置了发送长度,整个发送事件还是不会发生的。

所以不能在while里反复的使能端点,而应该在上一次发送成功完成之后,才使能下一次的发送事件。看上去这个错误是例程里就存在的,所以这个CDC的例程通信一直不稳定。

上一次发送成功的标志是EP1_OUT_Callback函数,只要中断函数调用了这个callback函数,就说明上一次的发送成功了。
点赞  2009-10-2 21:21
请问搂主: 你使用什么方法测试的Virtual COM 的发送速度的?

  需要注意的是,如果PC一侧的接收程序慢,也可能导致速度问题。比如接收程序含有屏幕显示。
  我使用的是自己编写的Delphi 代码,测的的结果是 55KByte/s 左右。
点赞  2009-10-4 10:32
to 7楼:
我使用串口调试助手测试速度的,方法是在10秒钟内看看接受到了多少字节。
测试的速度只有10k/s  。PC一侧的程序应该不会这么慢吧,seawwh 能给我一份你的Delphi程序么??我想测试一下。谢谢。
to 6楼:
我仔细想了下,你说的有道理,我这就改改程序。我很菜,vigia 能给些代码么??
点赞  2009-10-4 12:24
你用这个小程序测试一下

USB VCOM Test.rar (171.06 KB)

点赞  2009-10-4 13:02
今天的实验结果:  单向传输(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);     
  }
点赞  2009-10-9 18:05


用双缓存试试,不过在IN接口上的双缓存应该效果不大。

UserToPMABufferCopy(data, ENDP1_TXADDR, 64);
SetEPTxCount(ENDP1, 64);
SetEPTxValid(ENDP1);
这3句式对的,CDC设备中,主机会不断的polling设备,所以只要简单发送数据即可。
点赞  2009-10-9 18:50
TO:seawwh
你好,我在一台dell四核工作站和一台神州笔记本,做的实验,结果都是一样的,两台电脑都是
windows xp sp3 系统。我用串口助手的速度是10K 。
如果和系统有关的话,那就是驱动版本的问题了。
seawwh 有么有用串口助手试试呢??????
再有就是 seawwh 你是不是只 改动了虚拟串口例子中的main()函数呢??
点赞  2009-10-9 21:47
回答12楼:

你试验速度慢的主要原因是PC机显示开销太大造成的,
我是使用自己写的Delphi 小程序测试,不显示收到的数据,只显示计数值。
在XP系统下,速度650kByt/s
建议你使用串口助手的时候,要缩小或关闭数据显示窗口,减小显示开销。
其实你的项目也需要些上位机程序的,不妨写一个小程序测试以下。

我用AccessPort 测试了一下,确实验证了你的说法,开显示窗口的时候很慢,但是我缩小关闭数据显示窗口后,速度接近650kByt/s。




另外,我没有改动虚拟串口例子的其他部分。
点赞  2009-10-9 22:31
回答13楼:
我做了下试验,正如seawwh 所说,确实是因为串口调试助手的问题,我的测试结果为660kByt/s。
感谢seawwh 给的帮助。谢谢!!!
点赞  2009-10-11 23:26
我用USB VCOM TEST.RAR测试发现STM32 USB->PC只有64K,PC-->STM32 USB 倒是可以有600多K
原因是什么啊? 我的CPU E2410 @1.6G 1G RAM
点赞  2009-10-22 13:55
解决了吗,楼主?
点赞  2015-1-4 15:41
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复