usb打印機發(fā)送數(shù)據(jù)問題求助

我用Ch375控制usb打印機,在發(fā)送數(shù)據(jù)時,模擬了沁恒的發(fā)送函數(shù),如下: UINT8 SendUsbData( UINT16 len, UINT8 *buf ) { UINT8 length, rstatus; while(!CheckPrtStatus()) { if(TestConnect() == USB_INT_DISCONNECT) return; DelayNms(10); } while( len ) //連續(xù)輸出數(shù)據(jù)塊給USB打印機 { length = len >= device_info.endp_out_size ? device_info.endp_out_size : len; //單次發(fā)送不能超過端點尺寸 ToggleSend( device_info.tog_send ); WriteUsbData( length, buf ); // 將數(shù)據(jù)先復制到CH375芯片中 rstatus = IssueToken( ( device_info.endp_out_addr << 4 ) | DEF_USB_PID_OUT ); if(rstatus==USB_INT_SUCCESS) { len -= length; // 計數(shù) buf += length; device_info.tog_send = ~ device_info.tog_send; } else {// 操作失敗 SoftRestPrint(); // 打印機出現(xiàn)意外錯誤,軟復位 ClearStall(device_info.endp_out_addr); device_info.tog_send = 0; // 操作失敗 } } } 當我的數(shù)據(jù)大于64B時,調(diào)試沒有任何問題。但是當我的數(shù)據(jù)小于64字節(jié)時,連續(xù)發(fā)送,打印機只能收到一次。請問這是為什么? 例如: for(i=0; i<20; i++) SendUsbData( 32, buf ); 打印機只收到32字節(jié)數(shù)據(jù); for(i=0; i<20; i++) SendUsbData( 128, buf ); 可以收到全部數(shù)據(jù)。

批量傳輸每次都必須以滿包發(fā)送(滿包大小由打印機的批量端點大小決定),只有最后一次可以為非滿包。假如滿包大小為64,若包小于64字節(jié),那么打印機則認為本次傳輸結(jié)束。...(先前解釋有誤,更正: 如果本次傳輸結(jié)束,仍然要切換同步標志,再進行下一次傳輸)


哦,原來如此。可是我改成如下: UINT8 SendUsbData( UINT16 len, UINT8 *buf ) { UINT8 length, rstatus; while(!CheckPrtStatus()) { if(TestConnect() == USB_INT_DISCONNECT) return; DelayNms(10); } while( len ) //連續(xù)輸出數(shù)據(jù)塊給USB打印機 { length = len >= device_info.endp_out_size ? device_info.endp_out_size : len; //單次發(fā)送不能超過端點尺寸 ToggleSend( device_info.tog_send ); WriteUsbData( length, buf ); // 將數(shù)據(jù)先復制到CH375芯片中 rstatus = IssueToken( ( device_info.endp_out_addr << 4 ) | DEF_USB_PID_OUT ); if(rstatus==USB_INT_SUCCESS) { len -= length; // 計數(shù) buf += length; if(len > 0) //如果小于64字節(jié),不發(fā)送DATA1 device_info.tog_send = ~ device_info.tog_send; } else {// 操作失敗 ClearStall(device_info.endp_out_addr); SoftRestPrint(); // 打印機出現(xiàn)意外錯誤,軟復位 device_info.tog_send = 0; // 操作失敗 } } } 怎么還是不可以? 這樣的話,我該如何啟用下一次傳送?


另外,每次發(fā)送前,調(diào)用一次ClearStall(device_info.endp_out_addr);就沒有問題了。 可是這不是個解決問題的好辦法。主要怕量產(chǎn)后穩(wěn)定性差。


都改成這樣了,還是不行。我該怎么辦?幫我想想辦法好嗎? UINT8 SendUsbData( UINT16 len, UINT8 *buf ) { UINT8 length, rstatus; while(!CheckPrtStatus()) { if(TestConnect() == USB_INT_DISCONNECT) return; DelayNms(10); } while( len ) //連續(xù)輸出數(shù)據(jù)塊給USB打印機 { length = len >= device_info.endp_out_size ? device_info.endp_out_size : len; //單次發(fā)送不能超過端點尺寸 //ToggleSend( device_info.tog_send ); ToggleSend( 0); WriteUsbData( length, buf ); // 將數(shù)據(jù)先復制到CH375芯片中 rstatus = IssueToken( ( device_info.endp_out_addr << 4 ) | DEF_USB_PID_OUT ); if(rstatus==USB_INT_SUCCESS) { len -= length; // 計數(shù) buf += length; //device_info.tog_send = ~ device_info.tog_send; } else {// 操作失敗 ClearStall(device_info.endp_out_addr); SoftRestPrint(); // 打印機出現(xiàn)意外錯誤,軟復位 device_info.tog_send = 0; // 操作失敗 } } }


自己頂一下,煩請沁恒多留意一下,快點給個答復。謝謝了!


IssueToken( ( device_info.endp_out_addr << 4 ) | DEF_USB_PID_OUT ); 執(zhí)行完之后,返回的錯誤代碼是什么?對照CH375DS1的說明,分析原因


返回0x14,沒有問題呀,就是打印機只能收到前32個數(shù)據(jù)。你們有試驗過發(fā)送小于64字節(jié)的數(shù)據(jù)嗎? 下面是我用串口返回的數(shù)據(jù): 44 65 76 69 63 65 20 43 6C 61 73 73 3A 0A 0D 75 73 62 20 50 72 69 6E 74 65 72 2E 0A 0D 55 73 62 20 56 65 72 73 69 6F 6E 3A 0A 0D 30 31 2E 31 30 20 0A 0D 54 68 65 20 70 61 63 6B 65 74 20 73 69 7A 65 20 69 73 3A 0A 0D 30 30 34 30 42 79 74 65 0A 0D 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14


怎么沒有人回復呢?


你說的返回的0X14的狀態(tài)碼是哪個給你返回的?還有就是你第一次返回的狀態(tài)碼是多少?你串口發(fā)送的狀態(tài)碼是打印機端的還是主機端的?


哦,是我說的不明白。我是通過超級終端觀察程序運行情況的。實驗板和ouravr上阿永的mp3板(不知道版主是否見過此板,廣東地區(qū)ch375芯片最初應(yīng)該就是阿莫推薦的)ch375部分接法一致,通過并口控制ch375。

我在 rstatus = IssueToken( ( device_info.endp_out_addr << 4 ) | DEF_USB_PID_OUT ); 后加入了 一句putchar(rstatus ); 如下: UINT8 SendUsbData( UINT16 len, UINT8 *buf ) { UINT8 length, rstatus; while(!CheckPrtStatus()) { if(TestConnect() == USB_INT_DISCONNECT) return; DelayNms(10); } while( len ) //連續(xù)輸出數(shù)據(jù)塊給USB打印機 { length = len >= device_info.endp_out_size ? device_info.endp_out_size : len; //單次發(fā)送不能超過端點尺寸 //ToggleSend( device_info.tog_send ); ToggleSend( 0 ); WriteUsbData( length, buf ); // 將數(shù)據(jù)先復制到CH375芯片中 rstatus = IssueToken( ( device_info.endp_out_addr << 4 ) | DEF_USB_PID_OUT ); //==================================================================================== Putchar(rstatus); //此處返回狀態(tài)碼:0x14 //==================================================================================== if(rstatus==USB_INT_SUCCESS) { len -= length; // 計數(shù) buf += length; //device_info.tog_send = ~ device_info.tog_send; } else {// 操作失敗 ClearStall(device_info.endp_out_addr); SoftRestPrint(); // 打印機出現(xiàn)意外錯誤,軟復位 device_info.tog_send = 0; // 操作失敗 } } } 我在ch375并口上也D0到D7也讀到了正確數(shù)據(jù),可打印機就是接受不到。緩沖改為64字節(jié)以上就沒有問題了。 可惜我不能給它分配這么大內(nèi)存。 執(zhí)行這句for(i=0; i<20; i++) SendUsbData( 32, buf );可以得到20個狀態(tài)碼0x14。 懇請幫忙分析一下。


找到答案了,不過好像解釋很牽強,如下 UINT8 SetupStage(flash UINT8 *pag)//設(shè)置事務(wù) { //device_info.tog_send=device_info.tog_recv=0;//復位USB數(shù)據(jù)同步標志 ToggleSend(0);//發(fā)送 WriteUsbFlashData(8,pag);//SETUP數(shù)據(jù)總是8字節(jié) return (IssueToken((0<<4)|DEF_USB_PID_SETUP)); } 刪除此句:device_info.tog_send=device_info.tog_recv=0;//復位USB數(shù)據(jù)同步標志 就沒有問題。故我認為: 1、數(shù)據(jù)DATA0,DATA1切換,不一定要夠64字節(jié)才可以,只要你樂意,發(fā)送一個字換一次都行,我查了usb協(xié)議,沒有提到對DATA0/DATA1切換時包大小的要求(或者我沒有看到); 2、如果批量發(fā)送數(shù)據(jù),發(fā)送完DATA0,就要發(fā)送DATA1,故沁恒提供的設(shè)置同步標志函數(shù)不夠嚴謹,動不動就更改了同步標志;


我的理解不知道是否正確。不知道沁恒有沒有做過類似的試驗?應(yīng)該給個明確的答復??!


你上面的理解沒有任何問題啊,但是我們的程序就是按照你說的那樣寫的啊,你每次寫的時候都需要給一個同步標志的。


你好,我也在做USB打印機的程序,請問一下,你用的是什么型號的打印機? 我的聯(lián)系方法是個人信息保護,已隱藏,希望能夠交流一下


只有登錄才能回復,可以選擇微信賬號登錄

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