請(qǐng)斑竹與高手指點(diǎn)(關(guān)于375A連接打印機(jī)問(wèn)題)

本人使用單片機(jī)與CH375A做USB主機(jī),驅(qū)動(dòng)HP(5438)打印機(jī),能讀取打印機(jī)的配置信息及狀態(tài)。(如打印機(jī)的型號(hào),是否缺紙);目前出現(xiàn)問(wèn)題: 向打印機(jī)寫(xiě)數(shù)據(jù)的時(shí)候返回值不是0X14。請(qǐng)高手指點(diǎn),給在下一段程序,不勝感激!?。。?/p>

你可以下載CH375HST。ZIP的壓縮包,里面有關(guān)于375做主機(jī)操作USB打印機(jī)的例子程序


既然能讀取打印機(jī)的配置信息及狀態(tài)那么應(yīng)該不會(huì)出現(xiàn)你說(shuō)的問(wèn)題啊,應(yīng)該是你寫(xiě)數(shù)據(jù)的程序不對(duì)


謝謝樓上兩位,我是第一次做USB接口的應(yīng)用,對(duì)USB的了解也不是很深,所以現(xiàn)在使用的375A也是現(xiàn)學(xué)現(xiàn)賣(mài),完全參考WCH的列程.出問(wèn)題的程序段如下,請(qǐng)各位為本人指點(diǎn)下謝謝!:

#define USB_INT_RET_NAK 0x2A /* 00101010B,返回NAK */ void send_data( unsigned short len, unsigned char *buf ) { /* 主機(jī)發(fā)送數(shù)據(jù)塊,一次最多64KB */ unsigned char l, s,i; tog_send=1; endp_out_size=64; while( len ) { /* 連續(xù)輸出數(shù)據(jù)塊給USB打印機(jī) */ toggle_send1( tog_send ); /* 數(shù)據(jù)同步 */ l = len>endp_out_size?endp_out_size:len; /* 單次發(fā)送不能超過(guò)端點(diǎn)尺寸 */ printf("%02x ",(unsigned int)l); for(i=0;i!=l;i++) { printf("%02x ",(unsigned int)data_buf[i]); } printf("\n"); wr_usb_data( l, buf ); /* 將數(shù)據(jù)先復(fù)制到CH375芯片中 */ issue_token( ( endp_out_addr << 4 ) | DEF_USB_PID_OUT ); /* 請(qǐng)求CH375輸出數(shù)據(jù) */ s = wait_interrupt(); printf("%02x\n",s); /*S值是0X2E,程序退出*/

if ( s==USB_INT_SUCCESS ) { /* CH375成功發(fā)出數(shù)據(jù) */ tog_send = ~ tog_send; /* 切換DATA0和DATA1進(jìn)行數(shù)據(jù)同步 */ len-=l; /* 計(jì)數(shù) */ buf+=l; /* 操作成功 */ } else if ( s==USB_INT_RET_NAK ) { /* USB打印機(jī)正忙,如果未執(zhí)行SET_RETRY命令則CH375自動(dòng)重試,所以不會(huì)返回USB_INT_RET_NAK狀態(tài) */ /* USB打印機(jī)正忙,正常情況下應(yīng)該稍后重試 */ /* s=get_port_status( ); 如果有必要,可以檢查是什么原因?qū)е麓蛴C(jī)忙 */ } else { /* 操作失敗,正常情況下不會(huì)失敗 */ clr_stall( endp_out_addr ); /* 清除打印機(jī)的數(shù)據(jù)接收端點(diǎn),或者 soft_reset_print() */ /* soft_reset_print(); 打印機(jī)出現(xiàn)意外錯(cuò)誤,軟復(fù)位 */ tog_send = 0; /* 操作失敗 */ } /* 如果數(shù)據(jù)量較大,可以定期調(diào)用get_port_status()檢查打印機(jī)狀態(tài) */ } } [b]文字[/b][b]文字[/b]文字


你這個(gè)程序在發(fā)送令牌之后有在等中斷這是不對(duì)的,因?yàn)樵诎l(fā)送令牌的子程序中已經(jīng)有等待中斷了,所以你才出現(xiàn)不了成功的中斷: void send_data( unsigned short len, unsigned char *buf ) { /* 主機(jī)發(fā)送數(shù)據(jù)塊,一次最多64KB */ unsigned char l, s; while( len ) { /* 連續(xù)輸出數(shù)據(jù)塊給USB打印機(jī) */ toggle_send( tog_send ); /* 數(shù)據(jù)同步 */ l = len>endp_out_size?endp_out_size:len; /* 單次發(fā)送不能超過(guò)端點(diǎn)尺寸 */ wr_usb_data( l, buf ); /* 將數(shù)據(jù)先復(fù)制到CH375芯片中 */ s = issue_token( ( endp_out_addr << 4 ) | DEF_USB_PID_OUT ); /* 請(qǐng)求CH375輸出數(shù)據(jù) */ if ( s==USB_INT_SUCCESS ) { /* CH375成功發(fā)出數(shù)據(jù) */ tog_send = ~ tog_send; /* 切換DATA0和DATA1進(jìn)行數(shù)據(jù)同步 */ len-=l; /* 計(jì)數(shù) */ buf+=l; /* 操作成功 */ } else if ( s==USB_INT_RET_NAK ) { /* USB打印機(jī)正忙,如果未執(zhí)行SET_RETRY命令則CH375自動(dòng)重試,所以不會(huì)返回USB_INT_RET_NAK狀態(tài) */ /* USB打印機(jī)正忙,正常情況下應(yīng)該稍后重試 */ /* s=get_port_status( ); 如果有必要,可以檢查是什么原因?qū)е麓蛴C(jī)忙 */ } else { /* 操作失敗,正常情況下不會(huì)失敗 */ clr_stall( endp_out_addr ); /* 清除打印機(jī)的數(shù)據(jù)接收端點(diǎn),或者 soft_reset_print() */ /* soft_reset_print(); 打印機(jī)出現(xiàn)意外錯(cuò)誤,軟復(fù)位 */ tog_send = 0; /* 操作失敗 */ } /* 如果數(shù)據(jù)量較大,可以定期調(diào)用get_port_status()檢查打印機(jī)狀態(tài) */ } } 這樣就可以了


忘告訴前輩,其實(shí)我上面的發(fā)送令牌子程序中的等待中斷我去掉了.


如果是這樣的話,那你的程序是沒(méi)什么問(wèn)題的,可能你發(fā)下去的數(shù)據(jù),打印機(jī)沒(méi)給你返回?cái)?shù)據(jù),也就是說(shuō)你發(fā)下去的數(shù)據(jù)符合打印機(jī)的規(guī)范嗎?


目前我沒(méi)有考慮打印機(jī)語(yǔ)言的規(guī)范;但有一點(diǎn),就是所發(fā)給打印機(jī)的數(shù)據(jù),我是通過(guò)BUS HOUND驗(yàn)證過(guò)的.例如,通過(guò)BUS HOUND的端點(diǎn)1,BULK,OUT發(fā)0x31?。埃常薄。埃常薄。埃常薄。埃常薄。埃埃帷。埃埃?,打印機(jī)就能打印5個(gè)"1".目前我是使用HP打印機(jī)做實(shí)驗(yàn).請(qǐng)問(wèn)前輩,通過(guò)單片機(jī)發(fā)給打印機(jī)的數(shù)據(jù)非得遵循打印機(jī)的數(shù)據(jù)規(guī)范嗎?請(qǐng)指點(diǎn),謝謝!


發(fā)給打印機(jī)的數(shù)據(jù)當(dāng)然要符合打印機(jī)的規(guī)范啊,不然的話是沒(méi)辦法打印的


hcn,能否給我一小段向打印機(jī)寫(xiě)打印數(shù)據(jù)的實(shí)列?還有我使用的是外置固件的方法讀打印機(jī)配置的,那寫(xiě)數(shù)據(jù)呢怎樣做?再之BULK?。希眨缘亩它c(diǎn)怎樣確認(rèn)?是否與BUS?。龋希眨危娘@示的一致?


我們這邊沒(méi)有關(guān)于打印數(shù)據(jù)的的例子程序,只有將USB枚舉成功,之后的就要由用戶(hù)自己寫(xiě)



我今天讓打印機(jī)可以打印了:)


恭喜,是自己寫(xiě)的數(shù)據(jù)嗎??


謝謝!是的!


snake,你怎么樣讓打印機(jī)打印的呀?我弄到現(xiàn)在都還不行呢!


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

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