老是無法正常查詢打印機(jī)端口狀態(tài)。在INIT_PRINT函數(shù)中調(diào)用SET_COFIG函數(shù)中已復(fù)位TOG_RECV為0,在GET_PORT_STATUS函數(shù)中,toggle_recv(TOG_RECV),然后調(diào)用ISSUE_TOKEN,標(biāo)志去反,讀出接受的數(shù)據(jù)??偸菬o法返回長度為1的正確字節(jié)
打印機(jī)初始化是否正常通過?在查詢端口狀態(tài)函數(shù)中,在數(shù)據(jù)階段的同步標(biāo)志要從DATA1開始, toggle_recv(1)
初始化是通過的,但是SET_COFIG函數(shù)中已復(fù)位TOG_RECV為0,那么GET_PORT_STATUS函數(shù)中,toggle_recv(TOG_RECV),就應(yīng)該相當(dāng)于是是toggle_recv(0)啊。
控制傳輸?shù)氖聞?wù)中,數(shù)據(jù)階段的同步標(biāo)志是從DATA1開始的.也就是GET_PORT_STATUS函數(shù)中,必須是toggle_recv(1)
SET_COFIG函數(shù)中并是是復(fù)位了TOG_RECV,TOG_RECV是數(shù)據(jù)傳輸中中用的,并不是控制傳輸中用的,標(biāo)志不是一回事參考程序中并沒有調(diào)用GET_PORT_STATUS函數(shù).你現(xiàn)在要用GET_PORT_STATUS函數(shù),一定要按照USB協(xié)議來處理,如果您對USB協(xié)議不怎么了解,建議您不要修改這些標(biāo)志位,這都符合USB協(xié)議的,如果修改了很可能導(dǎo)致是數(shù)據(jù)不對.
我有點(diǎn)糊涂了:參考程序中有調(diào)用GET_PORT_STATUS函數(shù)的, 函數(shù)開始判斷ENDP_IN_ADDR是否為0,我的程序前面初始化后ENDP_IN_ADDR并不為0,所以執(zhí)行 toggle_recv(TOG_RECV) ;疑問:此時(shí)TOG_RECV在set_config中已經(jīng)復(fù)位為0了吧? IF(ISSUE_TOKEN((ENDP_IN_ADDR<<4)|DEF_USB_PID_IN)==USB_INT_SUCCES) { TOG_RECV=~TOG_RECV ;此時(shí)取反 RD_USB_DATA(BUFFER) RETURN(CHBUFFER[0]) 這段程序因?qū)儆跀?shù)據(jù)傳輸而非控制傳輸吧?執(zhí)行toggle_recv(TOG_RECV)時(shí)TOG_RECV在set_config中已經(jīng)復(fù)位為0了吧?
哦,好象這個(gè)程序不對吧?不知道您是從那里得到這個(gè)程序的. unsigned char get_port_status( ) { /* 查詢打印機(jī)端口狀態(tài),返回狀態(tài)碼,如果為0FFH則說明操作失敗 */ /* 返回狀態(tài)碼中: 位5(Paper Empty)為1說明無紙, 位4(Select)為1說明打印機(jī)聯(lián)機(jī), 位3(Not Error)為0說明打印機(jī)出錯(cuò) */ toggle_send( 0 ); /* 下面通過控制傳輸獲取打印機(jī)的狀態(tài), SETUP階段為DATA0 */ buffer[0]=0xA1; buffer[1]=1; buffer[2]=buffer[3]=buffer[4]=buffer[5]=0; buffer[6]=1; buffer[7]=0; /* SETUP數(shù)據(jù),GET_PORT_STATUS */ wr_usb_data( 8, buffer ); /* SETUP數(shù)據(jù)總是8字節(jié) */ if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_SETUP )==USB_INT_SUCCESS ) { /* SETUP階段操作成功 */ toggle_recv( 1 ); /* DATA階段,準(zhǔn)備接收DATA1 */ if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_IN )==USB_INT_SUCCESS ) { /* DATA階段操作成功 */ rd_usb_data( buffer ); /* 讀出接收到的數(shù)據(jù),通常只有1個(gè)字節(jié) */ toggle_send( 1 ); /* STATUS階段為DATA1 */ wr_usb_data( 0, buffer ); /* 發(fā)送0長度的數(shù)據(jù)說明控制傳輸成功 */ if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_OUT )==USB_INT_SUCCESS ) return( buffer[0] ); /* 返回狀態(tài)碼 */ } } return( 0xFF ); /* 返回操作失敗 */ } 這個(gè)才是函數(shù)的原型.您到在線下載里搜索CH375HST.ZIP,里面有USBPRINT的文件夾,請參考這個(gè)程序.
沒有開始的判斷ENDP_IN_ADDR是否為0嗎?我是在人民郵電出版社的《USB開發(fā)實(shí)例詳解》上看見的。 和CH375HST.ZIP不一樣?
還有個(gè)問題: CH375HST.ZIP里面有g(shù)et_port_status函數(shù)(調(diào)用issue_token函數(shù)),還有g(shù)et_port_status_X函數(shù)(調(diào)用issue_token_X函數(shù),并聲明適用于CH375A)。 問題:那么我用的是CH375B芯片,具體改調(diào)用哪個(gè)函數(shù)
您看到的資料就是從我們網(wǎng)站上拷貝的程序,應(yīng)該是一樣的. 不需要判斷endp_in_addr是否0; 在init_print函數(shù)中初始化了endp_out_addr=endp_in_addr=0;
謝謝,唉我再試試吧