关于PC端的中断的问题?

怎么我向端点1发送数据要发送8次(一共64个字节),PC才响应一次中断(发每一帧数据的时间间隔大于1分钟)?

发送的代码: USBWriteCMD( CMD_WR_USB_DATA5 ); cnt = 8; // 首先写入后续数据长度 USBWriteData( cnt ); // 将缓冲区中的数据发出 if ( cnt ) { // 指向缓冲区 buf = UsbBuffer; do { // 写入数据到CH375 USBWriteData( (*buf) ); buf ++; } while ( -- cnt ); }

PC响应函数:

// // 接收到USB中断 // // 中断服务程序是由CH375驱动程序中断后通过DLL在应用层模拟调用的 VOID CALLBACK mInterruptEvent( // 中断服务程序 PUCHAR iBuffer ) // 指向一个缓冲区,提供当前的中断特征数据 { // CH375产生中断后,产生一个消息通知主程序 SendMessage( mCNCHWND, WM_COMM_RXUSB , 0 , 0 ); // }

你上位机端点1每次接收的长度是多少,假如是64字节,肯定要等8次。


我用的是WCH的中断.还没有到读取这一步呢!


补充: 下位也接收到了8次端点1上传成功的中断. 我用 debug372 程序试用了,也是要下位机发8帧(一共64个字节),PC才能收到一帧(8个字节).


那看来上位机还是每次接收64字节,你每次发少于8个试试.肯定会每次都返回.


我用的PC端用的是 WCH 说的那种中断,在中断前我没有执行读端点1的操作也.在哪里指定端点1接发到指定的字节数中断也?

嘿嘿.


是这样,假如PC机每次接收的数据大于端点的缓冲区,那麽上位机直到收满数据,或这遇到不满缓冲区的数据才会返回.这样假如上位机要求接收64字节,因为端点1上传缓冲区大小为8字节,是需要8次才返回,假如你每次PC机接收少于或等于缓冲区大小,那肯定每次都会返回.


上位机的中断服务程序每次读取64字节,如果您发8个8字节,它会一起收到,应用层1次中断。 如果您发8个7字节(0到7个字节),那么它每次接收7字节后提前结束,共读取8次,应用层8次中断。


嘿嘿. usbxf tech 都是WCH的吧. 可惜DATASHEET没有说你们说的这一种情况.我本来是想发送一次8个字节发生一次中断.看来只能发送7个字节来一次中断了. 刚才改为一次发7个字节,真的发生你们的模拟中断,可惜程序就没有响应了,你们开的那一个中断线程还在运行.重启计算机了.


告诉我.我要当端点1接收到8个字节就发生一次中断怎么办?


可能是编译器的版本不一样.用VC++6.0编译的就可以退出中断线程. 现在将就着一次发7个字节,这样来解决问题算了.

多谢,多谢.


usbxf和tech当然都是WCH的,看看发的其它帖子就知道了,tech是WCH的技术支持公用帐号。 我调了CH372驱动程序和DLL的C源程序看了,是DLL源程序中始终读取64字节,所以如果将它改为8字节, 就可以只收取8字节产生中断了。编译器版本应该没关系,因为VC/VB/BC等都能用,何况是同一语言呢。 顺便提醒在C语言中写USB中断服务程序时,一定要加CALLBACK关键字,因为它是回调子程序。 中断服务程序是高优先级线程,不宜进行USB传输,通常只是发个消息或者置个全局变量通知主程序处理。


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