阅读:2847回复:12
如果上位机读的数据不等于下位机写的数据,怎么办?
如果上位机要读的数据大于下位机写的数据,上位机程序也会出错,比如,下位机向端点写了64B,上位机只读60B,那么读操作失败,或者是上位机要读130字节,下位机每次只能写64字节,分3次写,最后一次上位机读的数还是小于64B,还是会出错,难道只能读64的整数倍吗?这个问题怎么解决那?
|
|
最新喜欢:![]() |
沙发#
发布于:2003-08-01 11:37
正常情况下每个包大小是固定的,所以保证了是64的整数倍,如果剩余的数据不到64,单次读好象是不行,但连续读大量数据时好象这就不重要了。
|
|
板凳#
发布于:2003-08-01 11:56
不是的吧?我一次读760个数据就是不行,readfile()返回的读到的数据长度是0,这就说明读数失败了阿
|
|
地板#
发布于:2003-08-01 12:32
驱动里面有一个标志,你设定了之后就可以了。你在bulid urb的时候选上这个标志,如下:
transferFlags = USBD_SHORT_TRANSFER_OK; 就是上面这个标志,选上之后如果收到一个不满包hcd不会返回错误状态,否则会返回错误状态,也就是操作失败! msdn原文如下: TransferFlags Specifies zero, one, or a combination of the following flags: USBD_TRANSFER_DIRECTION_IN Is set to request data from a device. To transfer data to a device, this flag must be clear. The flag must be set if the pipe is an interrupt transfer pipe. USBD_SHORT_TRANSFER_OK Can be used if USBD_TRANSFER_DIRECTION_IN is set. If set, directs the HCD not to return an error if a packet is received from the device that is shorter than the maximum packet size for the endpoint. Otherwise, a short request is returns an error condition. 下面是具体使用的情况,加上上面那一句,d12的驱动里应该有的呀!另外在设备方你应该没办法发60个字节的呀,因为1.1的要求包的尺寸只能是8、16、32和64呀,怎么可能有60? // // get direction info from the endpoint address // if (USB_ENDPOINT_DIRECTION_IN(pipeInfo->EndpointAddress)) transferFlags |= USBD_TRANSFER_DIRECTION_IN; UsbBuildInterruptOrBulkTransferRequest(urb, //ptr to urb urbSize, //size of urb pipeHandle, //usbd pipe handle ioBuffer, //TransferBuffer NULL, //mdl SingleTransferLength, //bufferlength transferFlags, //flags NULL); //link |
|
地下室#
发布于:2003-08-01 14:02
jinghuiren老大,我buildurb时把short transfer置为FALSE,照理说应该读到我提交的缓冲区大小的数据才返回,可是每次都是读到一帧数据就返回,怎么回事?
|
|
|
5楼#
发布于:2003-08-01 14:46
jinghuiren,确实是这样的,下位机可以写小于64个的数,但是如果上位机读数的字节数小于下位机写入的数据的话,就会出错,反之则不会出错,所以上位机应该以64得整数倍读数,你说的那个设置,在驱动里面确实是有,我得问题是如果上位机读数的长度下雨下位机写入的数据时,就会出错,这个问题该怎么解决。我想应该是有办法的,不然万一用户就是要这样做,那怎么办?
|
|
6楼#
发布于:2003-08-01 14:48
不好意思,上面应该是个小于,不小心打成了 下雨了,见笑了!
|
|
7楼#
发布于:2003-08-01 15:18
qxh:我用的2.0里面是由个寄存器先是本次传输共有多少数据,可以根据这个寄存器的值向in端点中写数据,d12好像没有,因此我想最好就是你在双方面做个约定,你要60个字节设备方就不要写64个字节,如果你的请求里是60,但是设备返回了64个字节的数据,那么缓冲区就越界了,很可能会出现错误的。
|
|
8楼#
发布于:2003-08-01 15:20
jinghuiren老大,我buildurb时把short transfer置为FALSE,照理说应该读到我提交的缓冲区大小的数据才返回,可是每次都是读到一帧数据就返回,怎么回事? “一帧数据”是什么意思?一个包吗?如果你申请的数据超过一个包的话不应该是这样的结果的,返回的结果也是对的吗?你仔细检查一下你读取数据的函数吧。 |
|
9楼#
发布于:2003-08-01 15:39
jinghuiren:对,这个问题我已经解决了,其实都是协议的问题,唉!不过我现在又想到新的问题了,比如说在采集的时候如果我把采集的一个周期数据放到一个xdata区,然后再一起发送出去,那么在发送数据的同时很可能有采集的数据要写进来了,这么说来,就很有可能产生冲突了,那么你们做的是不是申请两个缓冲区,在这两个之间切换那?一个在发送的时候,采集到的数据就放在另一个缓冲区?
|
|
10楼#
发布于:2003-08-01 16:07
You got it!
通常的做法就是用两个缓冲区,进行乒乓切换,这样就不会出现覆盖或者丢是数据的现象了,如果两个不够可以把这两个缓冲区分成多个,或者多申请几个缓冲区。 |
|
11楼#
发布于:2003-08-01 16:28
[quote] jinghuiren老大,我buildurb时把short transfer置为FALSE,照理说应该读到我提交的缓冲区大小的数据才返回,可是每次都是读到一帧数据就返回,怎么回事? “一帧数据”是什么意思?一个包吗?如果你申请的数据超过一个包的话不应该是这样的结果的,返回的结果也是对的吗?你仔细检查一下你读取数据的函数吧。 [/quote] 我对包这个概念也不是很清楚,我所说的一帧就是固件方给我一次发送的几个字节,因为它是1ms给我发送一次,所以我每次buildurb都是只读到他一次发送的那几个字节,返回值也是读到的那几个字节数。 |
|
|
12楼#
发布于:2003-08-01 16:55
不会把?怎么会这么慢那?我这里4ms可以发送768个字节了。一包数据就是你的缓冲区的大小啊,比如说你设定的缓冲区的大小为64B的话,那就是64B了。我做试样的时候,只要上位机在不停地读,下位机不停的写,发送数据是很快的阿,怎么会1ms才发送一个包那?你是在那么测试的那?
|
|