ch376连接打印机获取描述符出错

我在获取设备描述符和设置设备地址时都可以,在获取配置描述符的时候出错了,返回的中断号是0x17,有大神知道为什么吗,谢谢

我在连接另外一个打印机时没有出现这样的问题,难道是不同打印机获取描述符的方法不一样吗



原因可能是在接收配置描述符是超过了64字节,导致缓存区溢出,有大神知道这应该怎么处理吗



这是我的枚举过程,不知道为什么在获取配置描述符时返回的中断号就是0x17

status = ch376_GET_DESCR(1);

if(status == USB_INT_SUCCESS)

{

u3_printf("0000000000000000000000\r\n");

//return 1;

len = ch376_RD_USB_DATA0(buffer);

if ( len<18 || p_dev_descr->bDescriptorType!=1 )   

{

return( 0 );

}

if ( p_dev_descr->bDeviceClass!=0 )   

{

return( 0 );

}

}


ch376_SET_ADDRESS(3);

status = ch376_GET_DESCR(2);//此处的返回值是0x17

if(status == USB_INT_SUCCESS)

{

len = ch376_RD_USB_DATA0(buf);

if ( p_cfg_descr->itf_bInterfaceClass!=7 || p_cfg_descr->itf_bInterfaceSubClass!=1 ) return( 0 ); 


u3_printf("endp_bmAttributes_1 = %x\r\n",p_cfg_descr->endp_bmAttributes_1);

endp_in_addr = endp_out_addr = 0;

}

addr = p_cfg_descr->endp_bEndpointAddress_1;

u3_printf("addr22222 = %x\r\n",addr);

if(addr &0x80) 

{

endp_in_addr = addr & 0x0f;

}

else 

{

endp_out_addr = addr &0x0f;

endp_out_size = p_cfg_descr->endp_wMaxPacketSize_1;

}

if(p_cfg_descr->itf_bInterfaceProtocol <= 1) return 0;

if(endp_out_addr == 0) return 0;

u3_printf("p_cfg_descr->conf_bConfigurationValue = %x\r\n",p_cfg_descr->conf_bConfigurationValue);

ch376_SET_CONFIG(p_cfg_descr->conf_bConfigurationValue);



获取配置描述符,命令码 46H 02H。但是收到的描述符放在64字节缓冲区中,如果缓冲不够,此命令会报错,此时可以使用4EH ISSUE_TKN_X命令完成描述符获取。具体如何实现请参考例程贴5

http://www.wch.cn/bbs/thread-65122-1.html


你说的是这样吗?

ch376_SET_ADDRESS(3);

status = ch376_GET_DESCR(2);//我不知道这句用不用写了,我都试了,还是不行,返回值还是0x17

u3_printf("status_1 = %x\r\n",status);

status = ch376_ISSUE_TKN_X(0x80,0 << 4 | DEF_USB_PID_IN);//此时的返回值是0x22

u3_printf("status_2 = %x\r\n",status);

if(status == USB_INT_SUCCESS)

{

len = ch376_RD_USB_DATA0(buf); 

if ( p_cfg_descr->itf_bInterfaceClass!=7 || p_cfg_descr->itf_bInterfaceSubClass!=1 ) return( 0 ); 

u3_printf("endp_bmAttributes_1 = %x\r\n",p_cfg_descr->endp_bmAttributes_1);

endp_in_addr = endp_out_addr = 0;

}



我用bushood看到的描述符没有大于64个字节,我数了才三十多个字节,这样也会在执行ch376_GET_DESCR(2);时 出现溢出吗


长度是否被bushound设置的单包最大长度限制了?

参考完成的控制传输,不是这样发的。控制传输分为三个传输阶段 SETUP_Transfer(dataBuf, &len)


jie你好,我根据您说的现在可以获得描述符了,枚举过程也结束了,但是在我向打印机发送数据时,中断返回0x20,这是为什么啊,是不是枚举之后还需要发送什么命令才能发送数据,

void ch376_send_data(int len,char *buf)

{

char l,stuse,out;

out = 0x00;

while(len)

{

l = len > endp_out_size ? endp_out_size : len;

u3_printf("l = %d\r\n",l);

ch376_WR_HOST_DATA(l,buf);

stuse = ch376_ISSUE_TKN_X(out,endp_out_addr << 4 | DEF_USB_PID_OUT);//返回0x20

u3_printf("stuse = %x\r\n",stuse);

if(stuse == USB_INT_SUCCESS)

{

u3_printf("send is success");

out = (~out & 0x40);

len -= l;

buf += l;

delay_us(10);

}

}

}



这是我的枚举过程,是还缺少什么命令没发吗?

#definep_dev_descr((PUSH_DEVI_DESCR)buffer)

#definep_cfg_descr((PUSB_CFG_DESCR_LONG)buf)

char buffer[64];

char buf[64];

unsigned short int i, len;

int status,addr;

out = 0x00;

status = ch376_GET_DESCR(1);

if(status == USB_INT_SUCCESS)

{

len = ch376_RD_USB_DATA0(buffer);

u3_printf("len = %x\r\n",len);

u3_printf("p_dev_descr->bDescriptorType = %x\r\n",p_dev_descr->bDescriptorType);

if ( len<18 || p_dev_descr->bDescriptorType!=1 )  

{

u3_printf("error = 1\r\n");

return( 0 );

}

u3_printf("p_dev_descr->bDeviceClass = %x\r\n",p_dev_descr->bDeviceClass);

if ( p_dev_descr->bDeviceClass!=0 )   

{

u3_printf("error = 2\r\n");

return( 0 );

}

max_package = buffer[7];

u3_printf("max_package = %x\r\n",max_package);

}

ch376_mode_reset();

ch376_SET_ADDRESS(5);

Req_buf[0]=0x80;Req_buf[1]=0x06;Req_buf[2]=0x00;Req_buf[3]=0x02;

Req_buf[4]=0x00;Req_buf[5]=0x00;Req_buf[6]=0x04;Req_buf[7]=0x00;

status = SETUP_Transfer(buf, &len);

if(status == USB_INT_SUCCESS)

{

Req_buf[6] = buffer[2];

Req_buf[7] = buffer[3];

status = SETUP_Transfer(buf, &len);

u3_printf("status = %x ",status);

}

if ( p_cfg_descr->itf_bInterfaceClass!=7 || p_cfg_descr->itf_bInterfaceSubClass!=1 ) return( 0 ); 

u3_printf("endp_bmAttributes_1 = %x\r\n",p_cfg_descr->endp_bmAttributes_1);

endp_in_addr = endp_out_addr = 0;

addr = p_cfg_descr->endp_bEndpointAddress_1;

if(addr &0x80) 

{

u3_printf("addr_1 = %x\r\n",addr);

endp_in_addr = addr & 0x0f;

}

else 

{

u3_printf("addr_2 = %x\r\n",addr);

endp_out_addr = addr &0x0f;

endp_out_size = p_cfg_descr->endp_wMaxPacketSize_1;

}

if(p_cfg_descr->itf_bNumEndpoints >= 2)

{

if(p_cfg_descr->endp_bDescriptorType_2 == 5)

{

addr = p_cfg_descr->endp_bEndpointAddress_2;

if(addr &0x80)

{

u3_printf("addr_3 = %x\r\n",addr);

endp_in_addr = addr & 0x0f;

}

else 

{

u3_printf("addr_4 = %x\r\n",addr);

endp_out_addr = addr &0x0f;

endp_out_size = p_cfg_descr->endp_wMaxPacketSize_2;

}

}

}

if(p_cfg_descr->itf_bInterfaceProtocol <= 1) return 0;

if(endp_out_addr == 0) return 0;

ch376_SET_CONFIG(p_cfg_descr->conf_bConfigurationValue);



endp_out_addr的值?以及配置描述符?


endp_out_addr的值是8,我用bushood也是端口8是发送,

配置描述符是QQ图片20171102171406.png


仿照bus hound抓包数据发送。20错误表示设备响应超时,可能是传输的数据包不正确,设备没有响应。


我用bushood发送是可以的,能正常打印,就是用程序发就出现这种情况


而且用这种方法枚举打印只能枚举这个打印机,另外一个打印机枚举的数据不全,这是为什么呢


只有登录才能回复,可以选择微信账号登录