阅读:2137回复:12
各位大佬:PC端接收USB数据时时不时的出现数据丢失的现象,请问很可能是什么原因?(在线)
我的板通过USB往PC机发送数据,多数情况下出现数据丢失的现象,请问这个很可能是什么原因?会是传输线路的原因么?我的D-,D+输出线上没有串联两个几十欧姆的电阻(由于空间原因没加)。
|
|
沙发#
发布于:2004-02-13 18:55
这和你写的驱动程序是有关系的,
当你用块传输方式时掉真是难免的,你可以试一下使用同步流方式写个驱动看看, 我不知道你这个系统的硬件方面是个什么情况,你在卡上是不是有一个精度小于1mS的数据源, 要保证实时性,驱动是很关键的 |
|
板凳#
发布于:2004-02-14 08:53
我的板通过USB往PC机发送数据,多数情况下出现数据丢失的现象,请问这个很可能是什么原因?会是传输线路的原因么?我的D-,D+输出线上没有串联两个几十欧姆的电阻(由于空间原因没加)。 数据丢失?是指要重发数据,还是接收到的数据缺少?应该不是电阻的问题。 |
|
地板#
发布于:2004-02-14 15:00
会不会是你并没有及时的读数据啊。
|
|
地下室#
发布于:2004-02-16 11:07
你的设备和驱动没有协调好数据读写问题。
你的设备写数据的速率较高,而主机读数据的速率较低 这样就会有些数据没有写到端点里,也就是在设备端数据就丢了。 如果想不让数据丢失有两种方法: 1,在设备端根据ack中断来写数据,如果是2.0的,每收到一个中断最多就写512字节,收到下一个中断再写512字节,这样数据绝对不会丢失。 2,驱动里用异步读写方式,对新手实现起来比较麻烦,但条件是你的设备端速率不能太高。 如果你的数据不需要实时传输,那建议用方法1 |
|
5楼#
发布于:2004-02-16 13:23
请问我在ds下用driverwizard产生了usb驱动,什么也改动,只是编写了inf文件,初次在2000系统下能够转载上,并且上面的数据传输挺好的。可是拔了usb板又插上,数据传输就有问题了!
请各位帮忙,急! 还有驱动装上时,inf文件在winnt文件夹中的inf文件夹中变成了oem开头的inf文件了,这又是怎么回声呢? |
|
6楼#
发布于:2004-02-16 20:00
1,可能拔掉后你的设备没有断电,这样端点里就会有残留数据,下次传输的时候要先把残留数据传走才能进行新数据的传输,因此你要确定在拔掉设备之前主机已经停止了数据传输了。
2,我想那是备份用的,它的内容和你的inf的内容是一样的。 |
|
7楼#
发布于:2004-02-17 10:21
我的开发板是基于linux的。在linux端USB DEVICE驱动中发送数据是这么来处理的:
在数据发送过程中我利用阻塞方式。同时定义了一回调函数,回调函数用来唤醒等待线程。 在发送完一数据包后,如果收到了ACK我就调用回调函数来唤醒等待线程。否则在5秒之后清除等待线程并提示错误信息。 现在的现象是:在正确的发送了几十个数据包后就收不到ACK了,然后程序在5秒后清楚了等待线程并提示错误信息。感觉是发送端和PC端的驱动程序接收数据不是同步的。可能是我开发板发送数据太快了么? |
|
8楼#
发布于:2004-02-17 11:37
有个发现,在我成功的发送了几十个数据包后,在开发板端的端点接收不到中断了,而此时PC端的驱动程序中接收数据函数已经退出了。驱动程序中的listenpipe中的读端口函数返回为-1。可以这么认为发送数据速度小于接收数据速度吧。
而我看到在listenpipe线程中的等待时间是300000ms,怎么这么短时间就返回了呢? [编辑 - 2/17/04 by gmmxrr] |
|
9楼#
发布于:2004-02-17 16:54
你用的是同步传输???
如果是批量传输,不会有超时的问题,如果是同步就不好说了,我没做过。 |
|
10楼#
发布于:2004-02-17 17:37
哦,刚才理解是错了。我用的是BULK传输方式,应该是不存在超时的说法。但是我发送完几十个数据包后,为什么端点就进不了中断了呢(我跟踪后发现的)?估计是USB HOST没有发来ACK,而且此时我发现PC端应用程序中的ReadPipe82函数返回值为-1。
还有就是,如果PC端的应用程序开始执行listenPipe线程,而此时开发板并没有发送数据,ReadPipe82函数也会很快返回-1。ReadPipe82函数不是只有接收到数据包或接收数据出错才返回么?而我此时并没有给端点发送数据呀,那为什么会出错呢? 那会是什么原因呢?这个问题怎么解决呢?很是郁闷!多谢各位指点! [编辑 - 2/18/04 by gmmxrr] |
|
11楼#
发布于:2004-02-18 10:18
有时所有的数据包发送完并成功的接收到了,但ReadPipe82最后的返回值还会是-1,我跟踪了错误代码发现返回的是WD_USBD_STATUS_DEV_NOT_RESPONDING
这个错误是怎么回事呢? |
|
12楼#
发布于:2004-02-18 11:18
你主机上必须控制一下,没有数据就不要发请求下去,而设备端一旦收到读写数据的命令就完成一次读写,不要出现没有数据却要读写的现象。
我没用ds写过,因此你说的错误我不清楚。 |
|