阅读:1443回复:16
swf2003大侠:请教swf2003大侠:请教 您好: 请教你几个问题。 一 我用CY7C68013的片子做实时数据采集系统,用的试BULK,SLAVE模式。曾在本站内看到过你的帖子,是关于如何保证数据接收完整,不掉数据,您提的是用两个URB来构建,具体如何运行机制,小弟特向您请教。我现在速率高的话,数据就会掉(我要一边采,一边存盘,而且要保证数据实时)。请教:用什么好的机制来实现好呢。我还看过本贴中有用异步发32个Deviceiocontrol来请求数据,但我觉得我的要求是数据立即就返回了。用异步能行吗,另外驱动中要如何实现呢。 二 USB协议中用块传输和实时传输都分别在什么情况下使用呢 ,我用实时可行吗。 |
|
沙发#
发布于:2003-11-06 18:36
用BULK是可以的,大约可以做到20M-30M左右,实时没问题,至于Deviceiocontrol,你可以在驱动中尽量加大MAXTRANSFERSIZE的大小,如1024×6400K,没问题,这样可以尽量每次多调用几回Deviceiocontrol,至于线程是一定用多线程了,保证数据完整,除了你的采集时序没问题外,用AUTOIN和AUTOOUT模式4缓冲就应该不会丢数据。
|
|
板凳#
发布于:2003-11-06 18:48
用BULK是可以的,大约可以做到20M-30M左右,实时没问题,至于Deviceiocontrol,你可以在驱动中尽量加大MAXTRANSFERSIZE的大小,如1024×6400K,没问题,这样可以尽量每次多调用几回Deviceiocontrol,至于线程是一定用多线程了,保证数据完整,除了你的采集时序没问题外,用AUTOIN和AUTOOUT模式4缓冲就应该不会丢数据。 您说的20-30M是字节还是比特呢,加大MAXTRANSFERSIZE的大小不能解决根本问题,问题是用BULK模式,HOST读取USB设备的数据只能用轮循的机制来读取,现在我用系统线程来读取数据,另一个线程来存盘,但CPU的时间片是固定的,我要一边保证读取数据,一边保证来的及存盘。用BULK还有别的机制读取数据吗。 另外你说的采集时序是电路读取数据的时序逻辑吧,时序应该没问题。 您的驱动和应用是如何读取数据的。能否让我参考。 我的邮箱lioniamhero@yahoo.com.cn |
|
地板#
发布于:2003-11-06 18:55
其实改变MAXTRANSFERSIZE就是每次向内存多写些数据啊,这样在主机读取数据时AD可以继续向USB的fifo里写数据啊,等到主机处理完成(通常不会耽误USB传数据的)继续从USB向里边写。在这种情况下速度可以达到20-30MB,也就是200Mb左右,对于25帧/秒的图像信号实时显示是绰绰有余的。当然我说的是只向主机送数据的情况。
|
|
地下室#
发布于:2003-11-07 22:42
其实改变MAXTRANSFERSIZE就是每次向内存多写些数据啊,这样在主机读取数据时AD可以继续向USB的fifo里写数据啊,等到主机处理完成(通常不会耽误USB传数据的)继续从USB向里边写。在这种情况下速度可以达到20-30MB,也就是200Mb左右,对于25帧/秒的图像信号实时显示是绰绰有余的。当然我说的是只向主机送数据的情况。 MAXTRANSFERSIZE的值是指一个管道中传输的的最大数值。那您的驱动是如何工作的呢。是直接用EZUSB.SYS吗,应用是如何和驱动交互数据的呢。 |
|
5楼#
发布于:2003-11-08 22:25
其实改变MAXTRANSFERSIZE就是每次向内存多写些数据啊,这样在主机读取数据时AD可以继续向USB的fifo里写数据啊,等到主机处理完成(通常不会耽误USB传数据的)继续从USB向里边写。在这种情况下速度可以达到20-30MB,也就是200Mb左右,对于25帧/秒的图像信号实时显示是绰绰有余的。当然我说的是只向主机送数据的情况。 您得理解我还不太明白,数据会因为你得MAXTRANSFERSIZE得值大就会对数据有缓冲得作用吗,对数据有缓冲作用得应该是硬件得FIFO的大小吧,您得意思是数据会在内存中缓存吗。但在我调试得过程中,如果我用得是MAXSTRANSGERSIZE=16K,那么在我得信号速率高的时候,比如几十M比特时,就在16K的倍数的地方数据会断,会掉。您有什么高见呢。楼上的问题再问。 |
|
6楼#
发布于:2003-11-09 11:00
[quote]其实改变MAXTRANSFERSIZE就是每次向内存多写些数据啊,这样在主机读取数据时AD可以继续向USB的fifo里写数据啊,等到主机处理完成(通常不会耽误USB传数据的)继续从USB向里边写。在这种情况下速度可以达到20-30MB,也就是200Mb左右,对于25帧/秒的图像信号实时显示是绰绰有余的。当然我说的是只向主机送数据的情况。 MAXTRANSFERSIZE的值是指一个管道中传输的的最大数值。那您的驱动是如何工作的呢。是直接用EZUSB.SYS吗,应用是如何和驱动交互数据的呢。 [/quote] 就是直接应用在sys中的,你可以将sys.c直接修改,然后用ddk编辑生成新的SYS就可以了。其实这就可以理解为在内存中开辟了一个你定义的MAXTRANSFERSIZE大小的缓冲区。和硬件的fifo没什么关系。68013里的fifo足够用了,当然你应该用4倍缓冲模式。明白了吗? |
|
7楼#
发布于:2003-11-10 15:40
您说得是真得吗,我用得也是BULK 4倍缓存啊。我也改过MAXTRANSFERSIZE的值啊,但我调试的话就会掉数据,断数据啊。您的驱动没有做任何处理吗。直接用EZUSB.SYS的驱动吗。
我改过MAXTRANSFERSIZE的值,最多也就到12mbite速率。您的数据有存盘吗。如1024×6400K这个值很大。我改过最大也试过8m。 |
|
8楼#
发布于:2003-11-10 16:34
直接用EZUSB.SYS的驱动吗。
[/quote] 当然是将EXUSB.SYS改掉,用新的驱动了!要不有什么用呢?你是将SYS.C中的MAXTRANSFERSIZE的值改成1024×6400K这么大以后用DDK编译生成新的EZUSB.SYS并安装后再测试的吗? |
|
9楼#
发布于:2003-11-10 16:37
先给分。
我记得我在调试时把MAXTRANSFERSIZE改为8m后,当速率一高,如12m或24m的话数据就会丢,我想和硬件也有关系。现在是我 要一边读取数据,一边存盘啊。 |
|
10楼#
发布于:2003-11-10 16:43
先给分。 感觉你说的问题好像是硬件的事,我这么做到15M可以,20M偶尔也丢数。 |
|
11楼#
发布于:2003-11-10 16:45
不会吧。您改的话1024×6400K那是6.4G啊。这样我会试一试。但其他的就不要改吗。您在应用程序是用什么的机制呢。能讲讲吗。用DeviceIoControl的话如果要实时采集,您是如何实现的呢。您是在应用程序中用轮循机制吗。
|
|
12楼#
发布于:2003-11-10 16:49
15M啊。我现在只要能保证8M就可以了。您觉得还有什么地方吗。只有10天时间了。
不在郁闷中成长,就在郁闷中毁灭。 |
|
13楼#
发布于:2003-11-10 16:50
我改成了1024×6400大小,没有那个K。 :D :D
|
|
14楼#
发布于:2003-11-10 20:51
我改过啊。我改成1024×1024×8过,而且我就采集这么大的数据也会掉。那您在驱动中向USB总线驱动是如何交互数据的呢?您的驱动别的地方都没改吗。就用一个IRP一直来和USB设备交互数据吗、
|
|
15楼#
发布于:2003-11-11 08:13
当然使用多线程了!
|
|
16楼#
发布于:2003-11-11 09:51
能否具体点呢。
不在郁闷中成长,就在郁闷中毁灭。 |
|