4qiuxh
驱动小牛
驱动小牛
  • 注册日期2002-11-27
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:2847回复:12

如果上位机读的数据不等于下位机写的数据,怎么办?

楼主#
更多 发布于:2003-08-01 11:32
如果上位机要读的数据大于下位机写的数据,上位机程序也会出错,比如,下位机向端点写了64B,上位机只读60B,那么读操作失败,或者是上位机要读130字节,下位机每次只能写64字节,分3次写,最后一次上位机读的数还是小于64B,还是会出错,难道只能读64的整数倍吗?这个问题怎么解决那?

最新喜欢:

abei11abei11
flytomoon
驱动巨牛
驱动巨牛
  • 注册日期2003-07-09
  • 最后登录2004-10-18
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-08-01 11:37
正常情况下每个包大小是固定的,所以保证了是64的整数倍,如果剩余的数据不到64,单次读好象是不行,但连续读大量数据时好象这就不重要了。
4qiuxh
驱动小牛
驱动小牛
  • 注册日期2002-11-27
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-08-01 11:56
不是的吧?我一次读760个数据就是不行,readfile()返回的读到的数据长度是0,这就说明读数失败了阿
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分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
Always!978
驱动小牛
驱动小牛
  • 注册日期2002-05-09
  • 最后登录2005-04-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-08-01 14:02
  jinghuiren老大,我buildurb时把short transfer置为FALSE,照理说应该读到我提交的缓冲区大小的数据才返回,可是每次都是读到一帧数据就返回,怎么回事?
Tomorrow Never Die
4qiuxh
驱动小牛
驱动小牛
  • 注册日期2002-11-27
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-08-01 14:46
jinghuiren,确实是这样的,下位机可以写小于64个的数,但是如果上位机读数的字节数小于下位机写入的数据的话,就会出错,反之则不会出错,所以上位机应该以64得整数倍读数,你说的那个设置,在驱动里面确实是有,我得问题是如果上位机读数的长度下雨下位机写入的数据时,就会出错,这个问题该怎么解决。我想应该是有办法的,不然万一用户就是要这样做,那怎么办?
4qiuxh
驱动小牛
驱动小牛
  • 注册日期2002-11-27
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-08-01 14:48
不好意思,上面应该是个小于,不小心打成了 下雨了,见笑了!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-08-01 15:18
qxh:我用的2.0里面是由个寄存器先是本次传输共有多少数据,可以根据这个寄存器的值向in端点中写数据,d12好像没有,因此我想最好就是你在双方面做个约定,你要60个字节设备方就不要写64个字节,如果你的请求里是60,但是设备返回了64个字节的数据,那么缓冲区就越界了,很可能会出现错误的。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-08-01 15:20
 jinghuiren老大,我buildurb时把short transfer置为FALSE,照理说应该读到我提交的缓冲区大小的数据才返回,可是每次都是读到一帧数据就返回,怎么回事?

“一帧数据”是什么意思?一个包吗?如果你申请的数据超过一个包的话不应该是这样的结果的,返回的结果也是对的吗?你仔细检查一下你读取数据的函数吧。
4qiuxh
驱动小牛
驱动小牛
  • 注册日期2002-11-27
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-08-01 15:39
jinghuiren:对,这个问题我已经解决了,其实都是协议的问题,唉!不过我现在又想到新的问题了,比如说在采集的时候如果我把采集的一个周期数据放到一个xdata区,然后再一起发送出去,那么在发送数据的同时很可能有采集的数据要写进来了,这么说来,就很有可能产生冲突了,那么你们做的是不是申请两个缓冲区,在这两个之间切换那?一个在发送的时候,采集到的数据就放在另一个缓冲区?
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-08-01 16:07
You got it!
通常的做法就是用两个缓冲区,进行乒乓切换,这样就不会出现覆盖或者丢是数据的现象了,如果两个不够可以把这两个缓冲区分成多个,或者多申请几个缓冲区。
Always!978
驱动小牛
驱动小牛
  • 注册日期2002-05-09
  • 最后登录2005-04-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-08-01 16:28
[quote]  jinghuiren老大,我buildurb时把short transfer置为FALSE,照理说应该读到我提交的缓冲区大小的数据才返回,可是每次都是读到一帧数据就返回,怎么回事?

“一帧数据”是什么意思?一个包吗?如果你申请的数据超过一个包的话不应该是这样的结果的,返回的结果也是对的吗?你仔细检查一下你读取数据的函数吧。 [/quote]

 我对包这个概念也不是很清楚,我所说的一帧就是固件方给我一次发送的几个字节,因为它是1ms给我发送一次,所以我每次buildurb都是只读到他一次发送的那几个字节,返回值也是读到的那几个字节数。
Tomorrow Never Die
4qiuxh
驱动小牛
驱动小牛
  • 注册日期2002-11-27
  • 最后登录2008-04-14
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-08-01 16:55
不会把?怎么会这么慢那?我这里4ms可以发送768个字节了。一包数据就是你的缓冲区的大小啊,比如说你设定的缓冲区的大小为64B的话,那就是64B了。我做试样的时候,只要上位机在不停地读,下位机不停的写,发送数据是很快的阿,怎么会1ms才发送一个包那?你是在那么测试的那?
游客

返回顶部