[求助]已解决CH375串口操作USB鼠标热插拔问题,但仍有问题需分析

基于论坛上ch375_host_int_para.c程序,用串口操作USB鼠标,在do-while中加上if ( wait_interrupt()==USB_INT_DISCONNECT ){EA=0;break;}或 CH375_WR_CMD_PORT(CMD_TEST_CONNECT )命令均未成功-----希望得到各位论坛朋友的支持分析一下原因,程序如下: do{ if(flag_output==1) {flag_output=0; my_program( );} if ( wait_interrupt()==USB_INT_DISCONNECT ){EA=0;break;} //CH375_WR_CMD_PORT(CMD_TEST_CONNECT );//status = CH375_RD_DAT_PORT( ); //if(status== USB_INT_DISCONNECT ){EA=0;break;} }while (1); 现将判断程序做在中断中可以支持热插拔了,在中断中建立一个flag_USBbreak标志,在do-while中做break处理,中断程序修改如下: void intt0() interrupt 0 { unsigned char len_temp,i; CH375_WR_CMD_PORT( CMD_GET_STATUS ); status=CH375_RD_DAT_PORT(); /******以下为增加的程序********/ if(status==USB_INT_DISCONNECT) { flag_USBbreak=1; } /******************************/ else if(status!=USB_INT_SUCCESS)//&& 。。。。。。同原程序 else 。。。。。。同原程序 } do-while中判断程序: do{ if(flag_USBbreak==1) { flag_USBbreak=0; EA=0; break; } 。。。。。。后面同原程序

这个问题可能原因是在执行wait_interrupt()或者CH375_WR_CMD_PORT(CMD_TEST_CONNECT )函数的时候进入了intt0中断导致自身的中断没等到跳不出do-while循环。 至于并口因为执行速度比较快等到自身中断后跳出了循环所以正常。


再补充一个问题:原来能正常操作鼠标,在do-while中加上if ( wait_interrupt()==USB_INT_DISCONNECT ){EA=0;break;}或 CH375_WR_CMD_PORT(CMD_TEST_CONNECT )命令后,鼠标也不能正常操作了。


鼠标拔出之后再插上能正常工作,必须对它重新枚举。你循环都跳不出,所以不能正常使用。


抱歉,关于第二楼的“再补充一个问题”没有说清楚----再说清楚一点:原来能正常操作鼠标,在do-while中加上if ( wait_interrupt()==USB_INT_DISCONNECT ){EA=0;break;}或 CH375_WR_CMD_PORT(CMD_TEST_CONNECT )命令后,在不拔出鼠标的情况下,鼠标也不能正常操作了----如果这个问题分析清楚了,也就分析出为什么不能在do-while中加上述语句解决热插拔问题了。


void intt0() interrupt 0 这里你用的中断方式来处理中断的。 在do while函数你又去查询中断。会造成程序死在这个函数里。

如果采用中断方式 这边就不要查询中断了。或者全部改成查询的方式。


void intt0() interrupt 0 这里你用的中断方式来处理中断的。 在do while函数你又去查询中断。会造成程序死在这个函数里。

如果采用中断方式 这边就不要查询中断了。或者全部改成查询的方式。


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