berrey
驱动牛犊
驱动牛犊
  • 注册日期2003-08-01
  • 最后登录2004-02-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2261回复:11

提问:pc端发送数据的时候如何打包?

楼主#
更多 发布于:2003-08-19 13:10
现在下位机的bulk out端口是16byte的,那么我发数据的时候一定要16byte一帧的发下去吗?

将数据打包是在总线驱动层进行的吗?那么我如何干预呢?
worldwar
驱动牛犊
驱动牛犊
  • 注册日期2003-08-04
  • 最后登录2009-11-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-08-20 09:21
你是从主机向设备发数据吗?
打包一般是在应有程序中,驱动主要是认识包,然后向下传而已。
worldwar
驱动牛犊
驱动牛犊
  • 注册日期2003-08-04
  • 最后登录2009-11-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-08-20 09:22
你是从主机向设备发数据吗?
打包一般是在应有程序中,驱动主要是认识包,然后向下传而已。
数据不一定要16B啊,主要看你要每次传多少
berrey
驱动牛犊
驱动牛犊
  • 注册日期2003-08-01
  • 最后登录2004-02-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-08-20 09:45
我现在是要从pc机下传数据。

比如说,我要通过usb传1024byte到下位机,而我下位机的bulk out端口是16byte的,那么我一定要将1024byte分解为16byte一帧的传下去?还是可以直接将1024byte一起扔到总线驱动层,让它处理呢?

请指教,谢谢!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-08-20 13:06
我现在是要从pc机下传数据。

比如说,我要通过usb传1024byte到下位机,而我下位机的bulk out端口是16byte的,那么我一定要将1024byte分解为16byte一帧的传下去?还是可以直接将1024byte一起扔到总线驱动层,让它处理呢?

请指教,谢谢!


你说的两种方式都是可行的
不过使用后者会减少你很多麻烦
berrey
驱动牛犊
驱动牛犊
  • 注册日期2003-08-01
  • 最后登录2004-02-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-08-20 14:17
如果我使用后者,我怎么能保证总线驱动层是一16byte一帧在下传数据呢?在什么地方设置这种属性呢?
zyz1974
驱动小牛
驱动小牛
  • 注册日期2002-11-06
  • 最后登录2005-06-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-09-16 09:17
worldwar
   你好,你所说的在应用程序里设置包的大小,该如何设置呢?希望能给予指教,谢谢,我的qq
  107947912
zyz1974
驱动小牛
驱动小牛
  • 注册日期2002-11-06
  • 最后登录2005-06-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-09-16 09:19
berrey
  你好,你的问题解决了吗?我现在也遇到了打包的问题,希望能给于帮助,谢谢
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-09-16 10:44
如果我使用后者,我怎么能保证总线驱动层是一16byte一帧在下传数据呢?在什么地方设置这种属性呢?


你基本概念都没弄清楚!
驱动会根据你选择的端点的属性(如是in还是out,以及最大包的大小)来确定一次传输的数据量。
比如:你用的是out端点,最大包大小是16,你要发送32字节的数据给设备,那么你就可以直接把32字节的数据传到底层驱动,底层驱动自动把32字节的数据分成两个16发到设备!
因此,没有什么应用程序中打包不打包的问题。下面这段话是从walter oney的书中摘出来的,希望对你有所帮助。
/**********************************************
其中管道信息结构是我们在此真正关心的,因为结构中的其它域是在提交URB后由USBD填充的。管道结构描述如下:

typedef struct _USBD_PIPE_INFORMATION {
  USHORT MaximumPacketSize;
  UCHAR EndpointAddress;
  UCHAR Interval;
  USBD_PIPE_TYPE PipeType;
  USBD_PIPE_HANDLE PipeHandle;
  ULONG MaximumTransferSize;
  ULONG PipeFlags;
} USBD_PIPE_INFORMATION, *PUSBD_PIPE_INFORMATION;
 

这样,我们已经有了一组USBD_INTERFACE_LIST表项,每一项中的USBD_INTERFACE_INFORMATION结构又包含一组USBD_PIPE_INFORMATION结构。接下来的任务是填充管道信息结构中的MaximumTransferSize成员,如果不填充这个成员,USBD将使用默认值USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE,其值等于DDK中的PAGE_SIZE。这个成员值与端点在单事务中的最大传输量(在一个总线事务中可以传输多少字节)或端点接收量(由设备上有多少有效内存决定)不直接相关。相反,它代表单一URB中能携带的最大数据量。这个值可以小于应用程序向设备或设备向应用程序发送的数据量的最大值,在这种情况下,驱动程序必须把应用程序的请求分成不大于这个值的小块。我们将在\"管理批量传输管道\"中再讨论这个问题。

提供最大传输量的原因是由于一个调度算法,主控制器驱动程序使用这个算法把URB请求分成总线帧中的事务。如果要发送大量数据,我们的数据可能占满整个帧而其它设备的数据会被挤出去。所以,通过为URB指定一个适当的单次传输最大值来均衡总线带宽的使用。
*********************************************/
wdy9927
驱动老牛
驱动老牛
  • 注册日期2003-08-04
  • 最后登录2017-02-04
  • 粉丝0
  • 关注0
  • 积分89分
  • 威望143点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2003-09-16 11:41
也就是说,要传多少数据就传多少(没有上限?),打包的问题不用我们来管,pc端和你的usb芯片会自动打包和解包吧。

有一点不明白,如果usb芯片支持usb1。1和usb2。0,那它会按哪个协议呢? 是怎么判断的。

jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-09-16 14:27
当然有上限了,我给你的那段话你没有仔细看吧,那个MaximumTransferSize就是上限,一般设置成64k,如果你的机器内存很大可以设置的大一些。

如果设备是2.0的,那么在设备上电复位时,设备芯片会发送一个chirp信号(硬件实现的)来检测主机hub是否能工作于2.0,如果能就按2.0的速度,否则就按1.1
shentianguo1985
驱动牛犊
驱动牛犊
  • 注册日期2009-10-26
  • 最后登录2009-11-25
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望71点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2009-11-21 14:48
LZ:问题解决没呢,也不贴下
游客

返回顶部