求解如何实现采用控制传输发送多个数据包的办法?

[复制链接]
4309|11
 楼主| tom_2_2 发表于 2011-1-24 10:24 | 显示全部楼层 |阅读模式
控制传输一般只用来发送简单的命令,实际有时也可能用来发送,命令+若干数据的情况,所以我参考书上的例程改写了一下,下面就是PC机的程序,不过当数据长度是64字节时,下位机可以收到的,就是不知到如何再发一个64字节的数据包!

ept->Target    = TGT_DEVICE;
    ept->ReqType   = REQ_VENDOR; //自定义请求
    ept->Direction = DIR_TO_DEVICE; //方向 主机->设备
    ept->ReqCode   = 0xBD;  //自定义请求码
    ept->Value     = 0;  
    ept->Index     = 0;
PUCHAR buf=new UCHAR[128]; //数据长度64+64,也就是发2个数据包
    ZeroMemory(buf, 128);
    LONG buflen =  128;
memset(buf,0x5a,buflen);
//buf[0]=0xbd;
ept->XferData(buf,buflen);
 楼主| tom_2_2 发表于 2011-1-24 10:27 | 显示全部楼层
对了,要在一次控制传输中完成,多个数据发送哦!
sz_kd 发表于 2011-1-24 10:31 | 显示全部楼层
应该是下一个IN包的时候再发送。
 楼主| tom_2_2 发表于 2011-1-24 11:22 | 显示全部楼层
我问的是主机输出,怎样连续发2个数据包
 楼主| tom_2_2 发表于 2011-1-24 11:43 | 显示全部楼层
完整程序
PC机端程序:
ept->Target    = TGT_DEVICE;//固定用法
    ept->ReqType   = REQ_VENDOR; //自定义请求
    ept->Direction = DIR_TO_DEVICE; //方向 主机->设备
    ept->ReqCode   = 0xBD;  //自定义请求码
    ept->Value     = 0;
    ept->Index     = 0;
    PUCHAR buf=new UCHAR[64];
     ZeroMemory(buf, 64);
     LONG buflen =  64;
        memset(buf,0x5a,buflen);
        //buf[0]=0xbd;
        ept->XferData(buf,buflen);//发送数据0x5a

        ZeroMemory(buf, buflen);
        memset(buf,0x6a,buflen);
        ept->XferData(buf,buflen);//发送数据0x6a


下位机程序:
BOOL DR_CONTRLTEST(void)
{
    unsigned int i;
   for(i=0;i<128;i++)
    {
        SendByte(EP0BUF[i]);//通过串口返回USB接收的数据
        EZUSB_Delay(10);
    }
  EP0BCH=0;
  EP0BCL=128;
  EP0CS |= bmHSNAK;
   return(TRUE);
}


串口调试助手显示的返回结果:
6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A CF BB D9 FF 97 7F 78 C7 EF DF 6F EF FF EF DF CF BD EE 0D A7 FD F7 FF 8F BF F7 EE BB FB EB 7F 3F 76 39 AB B6 77 F2 FB CF 61 7F 51 F5 7E EE FF 34 BD DF F7 F5 9F BF DF FF AB 33 FA 7F BF 9E CB B7 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A CF BB D9 FF 97 7F 78 C7 EF DF 6F EF FF EF DF CF BD EE 0D A7 FD F7 FF 8F BF F7 EE BB FB EB 7F 3F 76 39 AB B6 77 F2 FB CF 61 7F 51 F5 7E EE FF 34 BD DF F7 F5 9F BF DF FF AB 33 FA 7F BF 9E CB B7

不知道为什么,先发的是0x5a,后发0x6a。这里怎么先显示ox6a呢?
sz_kd 发表于 2011-1-24 11:43 | 显示全部楼层
呵呵,不好意思,应该是你主机在下一个OUT包的时候在次输出,个人意见,你试试吧。
 楼主| tom_2_2 发表于 2011-1-24 11:46 | 显示全部楼层
6楼
上面我已经贴出了所有的源代码,你帮我斧正一下吧!
sz_kd 发表于 2011-1-24 11:49 | 显示全部楼层
回LS,不好意思,我只是知道点USB传输的过程,对你的程序我也不懂,帮不了,抱歉!
 楼主| tom_2_2 发表于 2011-1-24 13:10 | 显示全部楼层
抓包数据,为什么会最后canceled
Dev  Phase  Data         Info           Time   Cmd.Phase.Ofs     
---  -----  -----------  -------------  -----  ------------------
21  USTS   00 00 01 c0  canceled         4us         2.3.0        
21  CTL    40 bd 00 00  VENDOR         4.5sc         3.1.0        
            00 00 80 00                               3.1.4        
21  DO     5a 5a 5a 5a  ZZZZ           9.9sc         3.2.0        
            5a 5a 5a 5a  ZZZZ                         3.2.4        
            5a 5a 5a 5a  ZZZZ                         3.2.8        
            5a 5a 5a 5a  ZZZZ                         3.2.12      
            5a 5a 5a 5a  ZZZZ                         3.2.16      
            5a 5a 5a 5a  ZZZZ                         3.2.20      
            5a 5a 5a 5a  ZZZZ                         3.2.24      
            5a 5a 5a 5a  ZZZZ                         3.2.28      
21  USTS   00 00 01 c0  canceled         4us         3.3.0
sz_kd 发表于 2011-1-24 14:37 | 显示全部楼层
你用USB分析器就能很清楚分析为什么canceled,你是用BUS HOUND抓的数据吧。
我猜可能是你设备没有ACK应答主机。
 楼主| tom_2_2 发表于 2011-1-24 16:16 | 显示全部楼层
USB分析器,是软件吗?
下面我重新调整了一下代码,问题是同样是发128字节数据,前64个数据是0x5a,剩下的发0x6a,串口调试助手先返回的是0x6a,后返回的是0x5a,更发送的循序矛盾!看来我对这个还是没有理解透,导致不会灵活应用这个控制传输!
       int PACKLEN=128;
       ept->Target    = TGT_DEVICE;//固定用法
    ept->ReqType   = REQ_VENDOR; //自定义请求
    ept->Direction = DIR_TO_DEVICE; //方向 主机->设备
    ept->ReqCode   = 0xBD;  //自定义请求码
    ept->Value     = 0;  
    ept->Index     = 0;
        PUCHAR buf=new UCHAR[128]; //PACKLEN=128
              ZeroMemory(buf, 128);
             LONG buflen =  128;
        memset(buf,0x5a,64);//前64字节初始化为0x5a
        memset(buf+64,0x6a,64);//后64字节初始化为0x6a
        ept->XferData(buf,buflen);

下位机:
unsigned int i;
    i=0;
    for(i=0;i<64;i++)
    {
        SendByte(EP0BUF[i]);//串口发送的串口调试助手
        //EZUSB_Delay(10);
    }
    EP0BCH=0;
    EP0BCL=64;
    //EP0CS |= bmHSNAK;
    for(i=0;i<64;i++)
    {
        SendByte(EP0BUF[i]);//串口发送的串口调试助手
        //EZUSB_Delay(10);
    }
     EP0BCH=0;
     EP0BCL=64;
     EP0CS |= bmHSNAK;
串口调试助手显示:
6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 6A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A 5A
peigang 发表于 2011-1-24 16:47 | 显示全部楼层
发一个应答位
128字节数据发送完了回一个应答信号
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

319

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部