gmmxrr
驱动牛犊
驱动牛犊
  • 注册日期2003-04-11
  • 最后登录2005-10-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2137回复:12

各位大佬:PC端接收USB数据时时不时的出现数据丢失的现象,请问很可能是什么原因?(在线)

楼主#
更多 发布于:2004-02-13 15:13
我的板通过USB往PC机发送数据,多数情况下出现数据丢失的现象,请问这个很可能是什么原因?会是传输线路的原因么?我的D-,D+输出线上没有串联两个几十欧姆的电阻(由于空间原因没加)。
zhouvirgo
驱动牛犊
驱动牛犊
  • 注册日期2003-03-02
  • 最后登录2011-01-17
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望35点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-02-13 18:55
这和你写的驱动程序是有关系的,
当你用块传输方式时掉真是难免的,你可以试一下使用同步流方式写个驱动看看,
我不知道你这个系统的硬件方面是个什么情况,你在卡上是不是有一个精度小于1mS的数据源,
要保证实时性,驱动是很关键的
clementzhao
驱动大牛
驱动大牛
  • 注册日期2003-05-08
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望63点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-02-14 08:53
我的板通过USB往PC机发送数据,多数情况下出现数据丢失的现象,请问这个很可能是什么原因?会是传输线路的原因么?我的D-,D+输出线上没有串联两个几十欧姆的电阻(由于空间原因没加)。

数据丢失?是指要重发数据,还是接收到的数据缺少?应该不是电阻的问题。
fieldwind
驱动牛犊
驱动牛犊
  • 注册日期2003-12-31
  • 最后登录2009-05-13
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-02-14 15:00
会不会是你并没有及时的读数据啊。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-02-16 11:07
你的设备和驱动没有协调好数据读写问题。
你的设备写数据的速率较高,而主机读数据的速率较低
这样就会有些数据没有写到端点里,也就是在设备端数据就丢了。

如果想不让数据丢失有两种方法:
1,在设备端根据ack中断来写数据,如果是2.0的,每收到一个中断最多就写512字节,收到下一个中断再写512字节,这样数据绝对不会丢失。
2,驱动里用异步读写方式,对新手实现起来比较麻烦,但条件是你的设备端速率不能太高。

如果你的数据不需要实时传输,那建议用方法1
llqm1202
驱动牛犊
驱动牛犊
  • 注册日期2003-07-29
  • 最后登录2006-10-16
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望6点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-02-16 13:23
请问我在ds下用driverwizard产生了usb驱动,什么也改动,只是编写了inf文件,初次在2000系统下能够转载上,并且上面的数据传输挺好的。可是拔了usb板又插上,数据传输就有问题了!
请各位帮忙,急!
还有驱动装上时,inf文件在winnt文件夹中的inf文件夹中变成了oem开头的inf文件了,这又是怎么回声呢?
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-02-16 20:00
1,可能拔掉后你的设备没有断电,这样端点里就会有残留数据,下次传输的时候要先把残留数据传走才能进行新数据的传输,因此你要确定在拔掉设备之前主机已经停止了数据传输了。
2,我想那是备份用的,它的内容和你的inf的内容是一样的。
gmmxrr
驱动牛犊
驱动牛犊
  • 注册日期2003-04-11
  • 最后登录2005-10-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-02-17 10:21
我的开发板是基于linux的。在linux端USB DEVICE驱动中发送数据是这么来处理的:
  在数据发送过程中我利用阻塞方式。同时定义了一回调函数,回调函数用来唤醒等待线程。
  在发送完一数据包后,如果收到了ACK我就调用回调函数来唤醒等待线程。否则在5秒之后清除等待线程并提示错误信息。
  现在的现象是:在正确的发送了几十个数据包后就收不到ACK了,然后程序在5秒后清楚了等待线程并提示错误信息。感觉是发送端和PC端的驱动程序接收数据不是同步的。可能是我开发板发送数据太快了么?
gmmxrr
驱动牛犊
驱动牛犊
  • 注册日期2003-04-11
  • 最后登录2005-10-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-02-17 11:37
有个发现,在我成功的发送了几十个数据包后,在开发板端的端点接收不到中断了,而此时PC端的驱动程序中接收数据函数已经退出了。驱动程序中的listenpipe中的读端口函数返回为-1。可以这么认为发送数据速度小于接收数据速度吧。

 而我看到在listenpipe线程中的等待时间是300000ms,怎么这么短时间就返回了呢?

[编辑 -  2/17/04 by  gmmxrr]
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-02-17 16:54
你用的是同步传输???
如果是批量传输,不会有超时的问题,如果是同步就不好说了,我没做过。
gmmxrr
驱动牛犊
驱动牛犊
  • 注册日期2003-04-11
  • 最后登录2005-10-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-02-17 17:37
哦,刚才理解是错了。我用的是BULK传输方式,应该是不存在超时的说法。但是我发送完几十个数据包后,为什么端点就进不了中断了呢(我跟踪后发现的)?估计是USB HOST没有发来ACK,而且此时我发现PC端应用程序中的ReadPipe82函数返回值为-1。
  还有就是,如果PC端的应用程序开始执行listenPipe线程,而此时开发板并没有发送数据,ReadPipe82函数也会很快返回-1。ReadPipe82函数不是只有接收到数据包或接收数据出错才返回么?而我此时并没有给端点发送数据呀,那为什么会出错呢?

那会是什么原因呢?这个问题怎么解决呢?很是郁闷!多谢各位指点!

[编辑 -  2/18/04 by  gmmxrr]
gmmxrr
驱动牛犊
驱动牛犊
  • 注册日期2003-04-11
  • 最后登录2005-10-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-02-18 10:18
有时所有的数据包发送完并成功的接收到了,但ReadPipe82最后的返回值还会是-1,我跟踪了错误代码发现返回的是WD_USBD_STATUS_DEV_NOT_RESPONDING
这个错误是怎么回事呢?
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-02-18 11:18
你主机上必须控制一下,没有数据就不要发请求下去,而设备端一旦收到读写数据的命令就完成一次读写,不要出现没有数据却要读写的现象。
我没用ds写过,因此你说的错误我不清楚。
游客

返回顶部