本人使用单片机与CH375A做USB主机,驱动HP(5438)打印机,能读取打印机的配置信息及状态。(如打印机的型号,是否缺纸);目前出现问题: 向打印机写数据的时候返回值不是0X14。请高手指点,给在下一段程序,不胜感激!!!!
你可以下载CH375HST。ZIP的压缩包,里面有关于375做主机操作USB打印机的例子程序
既然能读取打印机的配置信息及状态那么应该不会出现你说的问题啊,应该是你写数据的程序不对
谢谢楼上两位,我是第一次做USB接口的应用,对USB的了解也不是很深,所以现在使用的375A也是现学现卖,完全参考WCH的列程.出问题的程序段如下,请各位为本人指点下谢谢!:
#define USB_INT_RET_NAK 0x2A /* 00101010B,返回NAK */ void send_data( unsigned short len, unsigned char *buf ) { /* 主机发送数据块,一次最多64KB */ unsigned char l, s,i; tog_send=1; endp_out_size=64; while( len ) { /* 连续输出数据块给USB打印机 */ toggle_send1( tog_send ); /* 数据同步 */ l = len>endp_out_size?endp_out_size:len; /* 单次发送不能超过端点尺寸 */ 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 ); /* 将数据先复制到CH375芯片中 */ issue_token( ( endp_out_addr << 4 ) | DEF_USB_PID_OUT ); /* 请求CH375输出数据 */ s = wait_interrupt(); printf("%02x\n",s); /*S值是0X2E,程序退出*/
if ( s==USB_INT_SUCCESS ) { /* CH375成功发出数据 */ tog_send = ~ tog_send; /* 切换DATA0和DATA1进行数据同步 */ len-=l; /* 计数 */ buf+=l; /* 操作成功 */ } else if ( s==USB_INT_RET_NAK ) { /* USB打印机正忙,如果未执行SET_RETRY命令则CH375自动重试,所以不会返回USB_INT_RET_NAK状态 */ /* USB打印机正忙,正常情况下应该稍后重试 */ /* s=get_port_status( ); 如果有必要,可以检查是什么原因导致打印机忙 */ } else { /* 操作失败,正常情况下不会失败 */ clr_stall( endp_out_addr ); /* 清除打印机的数据接收端点,或者 soft_reset_print() */ /* soft_reset_print(); 打印机出现意外错误,软复位 */ tog_send = 0; /* 操作失败 */ } /* 如果数据量较大,可以定期调用get_port_status()检查打印机状态 */ } } [b]文字[/b][b]文字[/b]文字
你这个程序在发送令牌之后有在等中断这是不对的,因为在发送令牌的子程序中已经有等待中断了,所以你才出现不了成功的中断: void send_data( unsigned short len, unsigned char *buf ) { /* 主机发送数据块,一次最多64KB */ unsigned char l, s; while( len ) { /* 连续输出数据块给USB打印机 */ toggle_send( tog_send ); /* 数据同步 */ l = len>endp_out_size?endp_out_size:len; /* 单次发送不能超过端点尺寸 */ wr_usb_data( l, buf ); /* 将数据先复制到CH375芯片中 */ s = issue_token( ( endp_out_addr << 4 ) | DEF_USB_PID_OUT ); /* 请求CH375输出数据 */ if ( s==USB_INT_SUCCESS ) { /* CH375成功发出数据 */ tog_send = ~ tog_send; /* 切换DATA0和DATA1进行数据同步 */ len-=l; /* 计数 */ buf+=l; /* 操作成功 */ } else if ( s==USB_INT_RET_NAK ) { /* USB打印机正忙,如果未执行SET_RETRY命令则CH375自动重试,所以不会返回USB_INT_RET_NAK状态 */ /* USB打印机正忙,正常情况下应该稍后重试 */ /* s=get_port_status( ); 如果有必要,可以检查是什么原因导致打印机忙 */ } else { /* 操作失败,正常情况下不会失败 */ clr_stall( endp_out_addr ); /* 清除打印机的数据接收端点,或者 soft_reset_print() */ /* soft_reset_print(); 打印机出现意外错误,软复位 */ tog_send = 0; /* 操作失败 */ } /* 如果数据量较大,可以定期调用get_port_status()检查打印机状态 */ } } 这样就可以了
忘告诉前辈,其实我上面的发送令牌子程序中的等待中断我去掉了.
如果是这样的话,那你的程序是没什么问题的,可能你发下去的数据,打印机没给你返回数据,也就是说你发下去的数据符合打印机的规范吗?
目前我没有考虑打印机语言的规范;但有一点,就是所发给打印机的数据,我是通过BUS HOUND验证过的.例如,通过BUS HOUND的端点1,BULK,OUT发0x31 0x31 0x31 0x31 0x31 0x0a 0x0d,打印机就能打印5个"1".目前我是使用HP打印机做实验.请问前辈,通过单片机发给打印机的数据非得遵循打印机的数据规范吗?请指点,谢谢!
发给打印机的数据当然要符合打印机的规范啊,不然的话是没办法打印的
hcn,能否给我一小段向打印机写打印数据的实列?还有我使用的是外置固件的方法读打印机配置的,那写数据呢怎样做?再之BULK OUT的端点怎样确认?是否与BUS HOUND显示的一致?
我们这边没有关于打印数据的的例子程序,只有将USB枚举成功,之后的就要由用户自己写
哦
我今天让打印机可以打印了:)
恭喜,是自己写的数据吗??
谢谢!是的!
snake,你怎么样让打印机打印的呀?我弄到现在都还不行呢!