我用的是貴公司提供的打印范例程序,可以獲得設備的配置符,但是在執(zhí)行issue_token函數(shù)時應該產(chǎn)生一個中斷,但是程序就是等不到中斷,我觀察運行到這時endp_and_pid為00011001,請各位幫看看是什么問題
可以不可以將你的配置描述符帖出來看下?還有就是你發(fā)送數(shù)據(jù)給打印機的時候,數(shù)據(jù)符合不符合你打印機的數(shù)據(jù)規(guī)范呢?
這是我讀出來的信息 unsigned char code DevDes[]={ //設備描述符 0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0xF0, 0x03, 0x17, 0x2C, 0x00, 0x01, 0x01, 0x02, 0x02, 0x01 }; unsigned char code ConDes[]={ //配置描述符 0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x00, 0xC0, 0x31, 0x09, 0x04, 0x00, 0x00, 0x02, 0x07, 0x01, 0x02, 0x00, 0x07, 0x05, 0x01, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x81, 0x02, 0x40, 0x00, 0x00 }; 執(zhí)行到issue_token時好像還沒用到要打印的數(shù)據(jù)
上面那個有個小錯誤,這個是對的 unsigned char code DevDes[]={ //設備描述符 0x12, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0xF0, 0x03, 0x17, 0x2C, 0x00, 0x01, 0x01, 0x02, 0x03, 0x01 }; unsigned char code ConDes[]={ //配置描述符 0x09, 0x02, 0x20, 0x00, 0x01, 0x01, 0x00, 0xC0, 0x31, 0x09, 0x04, 0x00, 0x00, 0x02, 0x07, 0x01, 0x02, 0x00, 0x07, 0x05, 0x01, 0x02, 0x40, 0x00, 0x00, 0x07, 0x05, 0x81, 0x02, 0x40, 0x00, 0x00 };
問一下,你是需要實現(xiàn)什么功能而發(fā)送的這個令牌包???這個令牌包是通過端點2獲取數(shù)據(jù)請求
我想用單片機驅(qū)動打印機,這個令牌是根據(jù)程序讀出來的( endp_in_addr << 4 ) | DEF_USB_PID_IN 我是執(zhí)行到unsigned char get_port_status( )這個函數(shù)時過不去了
get_port_status()這個函數(shù)在發(fā)送的時候,應該是通過端點0發(fā)送,而不是端點1發(fā)送的,還有,在這個函數(shù)發(fā)送的時候,建議你在等待中斷的時候需要加一個ABORT的命令,因為這個函數(shù)有的時候需要等待很長時間打印機才會給你返回數(shù)據(jù)。實際我們自己做測試的一款三星的打印機,一般在等待了5分鐘之后才會給我回復數(shù)據(jù),我們在那邊不斷的重試之后才獲取到數(shù)據(jù)。
那個函數(shù)看的不是很明白,我感覺端點0還是1是由程序決定,不知道該怎么改成端點0,請給將將唄,謝了! 你說加一個ABORT是在wait_interrupt里的第一句加嗎
unsigned char get_port_status( ) { /* 查詢打印機端口狀態(tài),返回狀態(tài)碼,如果為0FFH則說明操作失敗 */ /* 返回狀態(tài)碼中: 位5(Paper Empty)為1說明無紙, 位4(Select)為1說明打印機聯(lián)機, 位3(Not Error)為0說明打印機出錯 */ toggle_send( 0 ); /* 下面通過控制傳輸獲取打印機的狀態(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階段,準備接收DATA1 */ if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_IN )==USB_INT_SUCCESS ) { /* DATA階段操作成功 */ rd_usb_data( buffer ); /* 讀出接收到的數(shù)據(jù),通常只有1個字節(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 ); /* 返回操作失敗 */ } 上面的函數(shù)就是獲取狀態(tài)的函數(shù)啊,就是通過端點0獲取的,還有就是加ABORT的命令的時候是在等待中斷的,建議在加上超時,當超時之后就發(fā)送ABORT的命令
謝謝各位的幫助,我已經(jīng)可以驅(qū)動打印機了,但是打印數(shù)據(jù)還是不對,不是我想要的,我在看看
那可能是你的數(shù)據(jù)出現(xiàn)問題的,仔細檢查你發(fā)送的數(shù)據(jù)