打印

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

[复制链接]
2667|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个数据包

使用特权

评论回复
5
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呢?

使用特权

评论回复
6
sz_kd| | 2011-1-24 11:43 | 只看该作者
呵呵,不好意思,应该是你主机在下一个OUT包的时候在次输出,个人意见,你试试吧。

使用特权

评论回复
7
tom_2_2|  楼主 | 2011-1-24 11:46 | 只看该作者
6楼
上面我已经贴出了所有的源代码,你帮我斧正一下吧!

使用特权

评论回复
8
sz_kd| | 2011-1-24 11:49 | 只看该作者
回LS,不好意思,我只是知道点USB传输的过程,对你的程序我也不懂,帮不了,抱歉!

使用特权

评论回复
9
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

使用特权

评论回复
10
sz_kd| | 2011-1-24 14:37 | 只看该作者
你用USB分析器就能很清楚分析为什么canceled,你是用BUS HOUND抓的数据吧。
我猜可能是你设备没有ACK应答主机。

使用特权

评论回复
11
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

使用特权

评论回复
12
peigang| | 2011-1-24 16:47 | 只看该作者
发一个应答位
128字节数据发送完了回一个应答信号

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

319

帖子

1

粉丝