我用的是贵公司提供的打印范例程序,可以获得设备的配置符,但是在执行issue_token函数时应该产生一个中断,但是程序就是等不到中断,我观察运行到这时endp_and_pid为00011001,请各位帮看看是什么问题
可以不可以将你的配置描述符帖出来看下?还有就是你发送数据给打印机的时候,数据符合不符合你打印机的数据规范呢?
这是我读出来的信息 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 }; 执行到issue_token时好像还没用到要打印的数据
上面那个有个小错误,这个是对的 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 };
问一下,你是需要实现什么功能而发送的这个令牌包啊?这个令牌包是通过端点2获取数据请求
我想用单片机驱动打印机,这个令牌是根据程序读出来的( endp_in_addr << 4 ) | DEF_USB_PID_IN 我是执行到unsigned char get_port_status( )这个函数时过不去了
get_port_status()这个函数在发送的时候,应该是通过端点0发送,而不是端点1发送的,还有,在这个函数发送的时候,建议你在等待中断的时候需要加一个ABORT的命令,因为这个函数有的时候需要等待很长时间打印机才会给你返回数据。实际我们自己做测试的一款三星的打印机,一般在等待了5分钟之后才会给我回复数据,我们在那边不断的重试之后才获取到数据。
那个函数看的不是很明白,我感觉端点0还是1是由程序决定,不知道该怎么改成端点0,请给将将呗,谢了! 你说加一个ABORT是在wait_interrupt里的第一句加吗
unsigned char get_port_status( ) { /* 查询打印机端口状态,返回状态码,如果为0FFH则说明操作失败 */ /* 返回状态码中: 位5(Paper Empty)为1说明无纸, 位4(Select)为1说明打印机联机, 位3(Not Error)为0说明打印机出错 */ toggle_send( 0 ); /* 下面通过控制传输获取打印机的状态, SETUP阶段为DATA0 */ buffer[0]=0xA1; buffer[1]=1; buffer[2]=buffer[3]=buffer[4]=buffer[5]=0; buffer[6]=1; buffer[7]=0; /* SETUP数据,GET_PORT_STATUS */ wr_usb_data( 8, buffer ); /* SETUP数据总是8字节 */ 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 ); /* 读出接收到的数据,通常只有1个字节 */ toggle_send( 1 ); /* STATUS阶段为DATA1 */ wr_usb_data( 0, buffer ); /* 发送0长度的数据说明控制传输成功 */ if ( issue_token( ( 0 << 4 ) | DEF_USB_PID_OUT )==USB_INT_SUCCESS ) return( buffer[0] ); /* 返回状态码 */ } } return( 0xFF ); /* 返回操作失败 */ } 上面的函数就是获取状态的函数啊,就是通过端点0获取的,还有就是加ABORT的命令的时候是在等待中断的,建议在加上超时,当超时之后就发送ABORT的命令
谢谢各位的帮助,我已经可以驱动打印机了,但是打印数据还是不对,不是我想要的,我在看看
那可能是你的数据出现问题的,仔细检查你发送的数据