[求助]关于用CH375S控制佳能打印机BJC-85

各位大虾帮帮小弟吧,有谁做过类似项目的能否帮帮我: 我所使用的打印机是佳能的BJC-55,这个打印机既有并口,又有USB接口,去年我曾通过并口顺利的打印出了数据,但现在改成USB后,无法打印。

去年通过并口打印的程序如下所示:

/*并口发送数据*/

void SendChar(unsigned char character) { BUSY=1; while (BUSY==1) ; STROBE=1; //Delay(2); PrintPort=character; // Delay(2); STROBE=0; Delay(2); STROBE=1; } //一个测试打印的程序,在主程序中调用

unsigned char code InitByte[2]={0x1b,0x40}; void testprint() { unsigned char i; for (i=0;i<2;i++) SendChar(InitByte[i]);//打印机初始化的命令 SendChar(0x1b);//这条语句及下条语句的作用我忘了 SendChar(0x54);

SendChar(0x31);//打印数字1 SendChar(0x32);//打印数字2 SendChar(0x33);//打印数字3 SendChar(0x0c);//打印结束的命令

} 这款打印机基本上还是采用的是ESC指令,但和EPSON的还是有一点区别。通过这个testprint,就可以打印出123出来,但我将这部分程序移植到USB程序时,却没能打印出来,USB的程序如下所示(关于USB的程序都是采用贵公司ch375prt.c中的程序):

unsigned char sss;

unsigned char m[2];

unsigned char code InitByte[2]={0x1b,0x40};

sss=set_usb_mode( 7 ); /* 复位USB设备,CH375向USB信号线的D+和D-输出低电平 */ if (sss==1) ShowChar(1,220,"reset true",1);//如果复位正常,则在液晶上显示reset true else ShowChar(1,220,"reset false",1); //如果复位不正常,则在液晶上显示reset false Delay( 10 ); /* 复位时间不少于1mS,建议为10mS */ sss=set_usb_mode( 6 ); /* 结束复位 */ if (sss==1) ShowChar(1,220,"host true",1);//如果设置主机方式成功,则在液晶上显示host true else ShowChar(1,220,"host false",1);//如果设置主机方式失败,则在液晶上显示host false Delay( 100 );

while ( wait_interrupt()!=USB_INT_CONNECT ); /* 等待复位之后的设备端再次连接上来 */ Delay( 200 ); sss=init_print(); //soft_reset_print(); //不管有没有此函数,都不打印,而且如果加上此函数,去掉下一行的初始化命令,也没有打印 send_data( 2, InitByte ); //象并口一样,发送初始化命令

m[0]=0x1b;

m[1]=0x54;

send_data(2, m);//象并口一样,在发送完初始化命令后,发送0x1b,0x54 m[0]=0x31; m[1]=0x32; send_data(2, m);//准备打印数字1和2 m[0]=0x0c;

send_data(1,m);//发送打印结束命令

此程序在运行后,到init_print语句都一切正常,说明单片机的数据已经通过375到达了打印机,但打印机就是不能打印,只能听到打印机发出声音,而且在从打印机的指示灯不停的闪烁来看,确实也收到了数据(或命令),但打印纸就是一动也不动。我估计硬件上应该没什么问题了,毕竟通过液晶,我能看到从375返回的数据表明都操作成功了,但对于发出去的控制命令,也不说石沉大海一般,打印机的喷头好象是在运动,但就是不打印。

不知道各位大虾有何意见?不甚感激

可以不可以让我看下send_data()程序啊?


send_data()也是用的是ch375prt.c中的程序,既然你想看看,那我也就贴出来吧。

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; /* 操作成功 */ ShowChar(1,220,"sent sucessful",1); } else if ( s==USB_INT_RET_NAK ) { ShowChar(1,220,"printer busy",1); /* USB打印机正忙,如果未执行SET_RETRY命令则CH375自动重试,所以不会返回USB_INT_RET_NAK状态 */ /* USB打印机正忙,正常情况下应该稍后重试 */ /* s=get_port_status( ); 如果有必要,可以检查是什么原因导致打印机忙 */ } else { /* 操作失败,正常情况下不会失败 */ ShowChar(1,220,"sent failure",1); clr_stall( endp_out_addr ); /* 清除打印机的数据接收端点,或者 soft_reset_print() */ /* soft_reset_print(); 打印机出现意外错误,软复位 */ tog_send = 0; /* 操作失败 */ } //Watchdog(); /* 如果数据量较大,可以定期调用get_port_status()检查打印机状态 */ } }

感谢关注!


你的程序在第一个发送的数据也就是send_data( 2, InitByte ); 发送初始化命令; 这个在USB打印机中是不需要的,因为你上面的init_print()已经进行枚举初始化了,就不需要在加上send_data( 2, InitByte );了


我按照你说的,把这个send_data(2,InitByte)去掉了,也没有打印。是不是还得加上一些指令呢?


首先你要知道你写的打印机的语言对不对,如果不对的话打印机没办法识别.也就没办法打印了啊~~


这个打印语言是正确的,因为我用上面并口的程序在这台打印机上已经成功打印了123出来。但到了USB的话,会不会还要额外添加什么命令呢?


USB打印机和并口打印机命令是一样的吗?


USB的数据打印格式应该不同于并口的吧,把并口的照搬过来应该不对


USB的数据打印格式和并口不一样啊?我想只是发送命令的方式不同而且已啊,一个是通过USB,一个是通过并口,命令怎么会不一样呢?哪位大虾遇到过这样的情况呢?


感谢各位大虾的帮助,小弟终于调试出来了。现在得出的结论如下: 1.USB的打印命令和在并口下的打印命令是一样的 2.ch375prt.c的结构定义中有点问题,所以才导致我调试了很久未果,一定要用新的ch375prt.c 3.在调试USB方面的东东时,可以使用bus hound来帮助,可以先将命令通过bus hound直接发过去,如果能行,那么说明你的命令是没有问题的,如果有问题,肯定是在375上。

现在我还要做CH375驱动EPSON 的C67,欢迎大家相互交流


好!值得借鉴


大哥,我现在也很想做一个USB驱动打印机的程序,不过是用单片机做的,能不能向你请教一下啊?


我正在做单片机驱动打印机的项目,能帮我一下吗?我的email:个人信息保护,已隐藏


suntop你能告诉我你的邮箱吗?


我也正在做单片机驱动打印机的项目,能帮我一下吗?我的email:个人信息保护,已隐藏


只有登录才能回复,可以选择微信账号登录