hackerapple
驱动牛犊
驱动牛犊
  • 注册日期2004-11-20
  • 最后登录2004-12-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1976回复:8

68013的Bulk传输丢数据咋办?

楼主#
更多 发布于:2004-12-22 22:53
6MHz的实时数据送到68013的端点去(EP6IN 512*4)
用Bulk,AutoIN
AutoInLength 512    MaxPacketSize 512
但是应用程序读回数据的时候出现数据的间歇性丢失
应用程序的做法就是一个循环:
for(i=0;i<readTime;i++)
{
    if (!DeviceIoControl(m_hDevice,IOCTL_EZUSB_BULK_READ,&bulkControl,
          sizeof (BULK_TRANSFER_CONTROL),resbuff,readLength,&rcnt,NULL) )
    {
        strMsg.Format("GPIF Read Error! Last Read Length is: %d.",rcnt);
        SetWindowText(strMsg);
    }
}
现在考虑可能是因为应用的速度跟不上
导致数据在68013的端点FIFO中溢出而丢失。当然也有可能是别的原因。。。
除了中间加一级SRAM缓冲的做法外
大虾们还有什么好的建议么?万分感谢~

[编辑 -  12/23/04 by  hackerapple]
shen_51000
驱动牛犊
驱动牛犊
  • 注册日期2004-10-12
  • 最后登录2006-05-14
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-23 15:32
也许只能用等时传输了
或者让缓冲瞒的时候数据先停一下,等host读后再继续
蓝蓝的天空上有一朵白云……
hackerapple
驱动牛犊
驱动牛犊
  • 注册日期2004-11-20
  • 最后登录2004-12-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-23 16:44
这是一位大虾给我的建议,大家以为如何?
我现在正在尝试

驱动里边开一个新的接收线程,不停的从usb设备上接收数据。
把收到的数据放在缓冲区里边。缓冲区设置为几M到十几M
当应用程序读取驱动的数据的时候,把缓冲区里边的数据返回上去。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-23 21:30
6MHz的实时数据送到68013的端点去(EP6IN 512*4)
用Bulk,AutoIN
AutoInLength 512    MaxPacketSize 512
但是应用程序读回数据的时候出现数据的间歇性丢失
应用程序的做法就是一个循环:
for(i=0;i<readTime;i++)
{
    if (!DeviceIoControl(m_hDevice,IOCTL_EZUSB_BULK_READ,&bulkControl,
          sizeof (BULK_TRANSFER_CONTROL),resbuff,readLength,&rcnt,NULL) )
    {
        strMsg.Format("GPIF Read Error! Last Read Length is: %d.",rcnt);
        SetWindowText(strMsg);
    }
}
现在考虑可能是因为应用的速度跟不上
导致数据在68013的端点FIFO中溢出而丢失。当然也有可能是别的原因。。。
除了中间加一级SRAM缓冲的做法外
大虾们还有什么好的建议么?万分感谢~

[编辑 -  12/23/04 by  hackerapple]

应用的速度当然没有问题,你多大的速度?
20多M字节/秒没有问题。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
hackerapple
驱动牛犊
驱动牛犊
  • 注册日期2004-11-20
  • 最后登录2004-12-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-23 22:26
6MB/s
如果老大觉得应用没问题的话
可否指教一下问题大约出在什么地方呢?谢~
应用的速度当然没有问题,你多大的速度?
20多M字节/秒没有问题。
reuterk
驱动牛犊
驱动牛犊
  • 注册日期2004-12-24
  • 最后登录2005-02-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-24 10:27
当时我做时,外部有一个16K的fifo,主机读取时,可以达到30MB/s
数据未丢。
如果全靠usb内部512×4的fifo,估计来不及,测68013的信号时,usb‘满’信号之间的间隔总是会有100us(可能更长,一时忘了)的空闲时间出现,即主机读取时,总是会有空闲时间出现,如果从驱动上考虑,这个100us的时间应该想法去掉,否则没办法解决丢失现象

100us×6MB/s=600B > 512
hackerapple
驱动牛犊
驱动牛犊
  • 注册日期2004-11-20
  • 最后登录2004-12-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-25 14:37
当时我做时,外部有一个16K的fifo,主机读取时,可以达到30MB/s
数据未丢。
如果全靠usb内部512×4的fifo,估计来不及,测68013的信号时,usb‘满’信号之间的间隔总是会有100us(可能更长,一时忘了)的空闲时间出现,即主机读取时,总是会有空闲时间出现,如果从驱动上考虑,这个100us的时间应该想法去掉,否则没办法解决丢失现象

100us×6MB/s=600B > 512

你的意思是中间不加一级SRAM或者FIFO做缓冲是很难不丢的是吧?
5555
如果在硬件不允许做太大改动的前提下,能怎么做呢

我现在将应用的那个for循环拿到驱动中去做,貌似还是不行。
AllenZh老大,给指条活路吧~
reuterk
驱动牛犊
驱动牛犊
  • 注册日期2004-12-24
  • 最后登录2005-02-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-12-28 10:24
这么算吧:
usb在1ms间隔中,高速usb可以读取8个微帧,每次512个字节,每个微帧时间是125us;
如果每次主机读取时,1ms中都可以读8个包,那么你的时间是来得及的,但是‘实际上’主机要处理其他事务时,有可能只读了7个包甚至更少,还有一个包的时间125us或更多时间是没有读的,那么,没有更多缓冲的情况下,总线空闲时,外部数据就只有丢的份了
chaoswang
驱动小牛
驱动小牛
  • 注册日期2003-10-10
  • 最后登录2005-10-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-12-28 16:13
外部加个缓存,因为PC读取数据的请求可能会超时。
游客

返回顶部