ch376連接打印機(jī)獲取描述符出錯(cuò)

我在獲取設(shè)備描述符和設(shè)置設(shè)備地址時(shí)都可以,在獲取配置描述符的時(shí)候出錯(cuò)了,返回的中斷號(hào)是0x17,有大神知道為什么嗎,謝謝

我在連接另外一個(gè)打印機(jī)時(shí)沒有出現(xiàn)這樣的問題,難道是不同打印機(jī)獲取描述符的方法不一樣嗎



原因可能是在接收配置描述符是超過了64字節(jié),導(dǎo)致緩存區(qū)溢出,有大神知道這應(yīng)該怎么處理嗎



這是我的枚舉過程,不知道為什么在獲取配置描述符時(shí)返回的中斷號(hào)就是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字節(jié)緩沖區(qū)中,如果緩沖不夠,此命令會(huì)報(bào)錯(cuò),此時(shí)可以使用4EH ISSUE_TKN_X命令完成描述符獲取。具體如何實(shí)現(xiàn)請(qǐng)參考例程貼5

http://www.findthetime.net/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);//此時(shí)的返回值是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個(gè)字節(jié),我數(shù)了才三十多個(gè)字節(jié),這樣也會(huì)在執(zhí)行ch376_GET_DESCR(2);時(shí) 出現(xiàn)溢出嗎


長度是否被bushound設(shè)置的單包最大長度限制了?

參考完成的控制傳輸,不是這樣發(fā)的??刂苽鬏敺譃槿齻€(gè)傳輸階段 SETUP_Transfer(dataBuf, &len)


jie你好,我根據(jù)您說的現(xiàn)在可以獲得描述符了,枚舉過程也結(jié)束了,但是在我向打印機(jī)發(fā)送數(shù)據(jù)時(shí),中斷返回0x20,這是為什么啊,是不是枚舉之后還需要發(fā)送什么命令才能發(fā)送數(shù)據(jù),

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);

}

}

}



這是我的枚舉過程,是還缺少什么命令沒發(fā)嗎?

#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是發(fā)送,

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


仿照bus hound抓包數(shù)據(jù)發(fā)送。20錯(cuò)誤表示設(shè)備響應(yīng)超時(shí),可能是傳輸?shù)臄?shù)據(jù)包不正確,設(shè)備沒有響應(yīng)。


我用bushood發(fā)送是可以的,能正常打印,就是用程序發(fā)就出現(xiàn)這種情況


而且用這種方法枚舉打印只能枚舉這個(gè)打印機(jī),另外一個(gè)打印機(jī)枚舉的數(shù)據(jù)不全,這是為什么呢


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频