CH372B的HID類鍵盤,如何超時響應(yīng)上位機(jī)?[求助]

CH372 的 USB HID類鍵盤,如果響應(yīng)上位機(jī)?現(xiàn)在子程序執(zhí)行的時間比較長,很容易造成死機(jī),USB HID類鍵盤要求多長時間內(nèi)必須響應(yīng)一次?程序如下:

main( ) { unsigned char i,time,k; unsigned char real_data[11]; //需要上傳的數(shù)據(jù)緩沖區(qū)

unsigned char data_flag=0; //有無數(shù)據(jù)標(biāo)志 unsigned char idata ucsenddata[11]; unsigned char code uckeycode1[11]={ 0x62 //0 ,0x59 //1 ,0x5a //2 ,0x5b //3 ,0x5c //4 ,0x5d //5 ,0x5e //6 ,0x5f //7 ,0x60 //8 ,0x61 //9 ,0x58 //回車 };

Delay50ms( ); // 延時等待CH375初始化完成,如果單片機(jī)由CH375提供復(fù)位信號則不必延時 // //mInitSTDIO( ); CH375_Init( ); // 初始化CH375 // // EA=1;

myprogram(); // 子程序,運(yùn)行的時間可能200毫秒 up_time=0; time=0;k=0; for(i=0;i<8;i++) buf[i]=0;

while(1){ // 主程序 //

if (data_flag==0)//檢測到數(shù)據(jù)輸入,開發(fā)上傳 { real_data[0]=0x62; //0 real_data[1]=0x62; //0 real_data[2]=0x5e; //6 real_data[3]=0x5d; //5 real_data[4]=0x5b; //3 real_data[5]=0x5a; //2 real_data[6]=0x59; //1 real_data[7]=0x5a; //2 real_data[8]=0x5e; //6 real_data[9]=0x61; //9 real_data[10]=0x58; //回迭 data_flag=1; //有按鍵按下,置標(biāo)志1 //goto SEND;

//up_data( ); up_time=0; time=0;k=0; for(i=0;i<8;i++) buf[i]=0; up_data( ); data_flag=0; up_time=0; SPK_P=0; RED_LED=1; GREEN_LED=0; Delay50ms( ); Delay50ms( ); RED_LED=0; GREEN_LED=1; Delay50ms( ); Delay50ms( );

SPK_P=1; //data_flag=1; //有按鍵按下,置標(biāo)志1 //PcdHalt(); //goto SEND; }

if(CH375_INT_WIRE == 0){ mCH375Interrupt( );

if((UPDATA_FLAG==0x01)&&(k<=1)){ //先發(fā)八個字節(jié)的0包,相當(dāng)于確保按鍵的取消 for(i=0;i<8;i++) buf[i]=0; up_data( ); k++; }

else { if((UPDATA_FLAG==0x01)&&(time%2==1)){ //按鍵按下 if(up_time<=10){ // printf("%d\n",(unsigned short)up_time); buf[2]=real_data[up_time]; //發(fā)送八個字節(jié),相當(dāng)于發(fā)送1個按鍵 up_data( ); up_time++; } } else if((UPDATA_FLAG==0x01)&&(time%2==0)){ //按鍵取消 for(i=0;i<8;i++) buf[i]=0; up_data( ); } time++; }

//if(up_time==11) up_time=0; //循環(huán)上傳 if(up_time==11) { up_time=0;} //循環(huán)上傳

} } }

對USB鍵盤的響應(yīng)時間沒有要求, PC端周期性的讀數(shù)據(jù),如果鍵盤有數(shù)據(jù)則上傳數(shù)據(jù),如果沒有數(shù)據(jù)則返回NAK(由CH372自動產(chǎn)生)


不是響應(yīng)的問題。根本不用你MCU去相應(yīng)。有數(shù)據(jù)你就填數(shù)據(jù)就可以了。剩下的事CH372會自己完成。


不對啊, 把 myprogram(); // 子程序,運(yùn)行的時間可能200毫秒 換成 delay(200); //換成200毫秒的演示,你們試試,肯定有問題


我原以為是我的子程序有問題,查了好久,可后來,我用200毫秒的延時函數(shù)替換,就發(fā)現(xiàn)了這個問題,不是子程序的問題


你說的是PC對USB設(shè)備的枚舉階段,這個時間是要有限制的,一般是幾個ms 設(shè)備端就必須要響應(yīng),否則PC會超時退出。


main( ) { Delay50ms( ); // 延時等待CH375初始化完成,如果單片機(jī)由CH375提供復(fù)位信號則不必延時 // CH375_Init( ); // 初始化CH375 // Delay50ms( );Delay50ms( );Delay50ms( );Delay50ms( ); }

CH375_Init( ); 初始化完了,之后如果長時間延時,PC上就提示“無法識別的USB設(shè)備”


main( ) { Delay50ms( ); // 延時等待CH375初始化完成,如果單片機(jī)由CH375提供復(fù)位信號則不必延時 // CH375_Init( ); // 初始化CH375 // Delay50ms( );Delay50ms( );Delay50ms( );Delay50ms( ); }

CH375_Init( ); 初始化完了,之后如果長時間延時,PC上就提示“無法識別的USB設(shè)備”


main( ) { Delay50ms( ); // 延時等待CH375初始化完成,如果單片機(jī)由CH375提供復(fù)位信號則不必延時 // CH375_Init( ); // 初始化CH375 // Delay50ms( );NAK();//響應(yīng) Delay50ms( );NAK();//響應(yīng) Delay50ms( );NAK();//響應(yīng) Delay50ms( );NAK();//響應(yīng) }

CH375_Init( ); 初始化完了,之后如果長時間延時,PC上就提示“無法識別的USB設(shè)備”

能不能像喂狗一樣,在各延時函數(shù)間喂狗,有這樣的指令嗎?


不是說了嗎,PC在對設(shè)備枚舉的時候,有時間要求的,為什么要加那么多的延時? 如果使用CH372的外置固件模式,初始化CH372之后,PC就開始對CH372進(jìn)行枚舉,下位機(jī)要盡快的響應(yīng)PC的請求,否則PC會超時退出,枚舉失敗。沒有其他方法


你加這個延時干嘛?不用加 Delay50ms( );NAK();//響應(yīng) Delay50ms( );NAK();//響應(yīng) Delay50ms( );NAK();//響應(yīng) Delay50ms( );NAK();//響應(yīng) 趕緊去掉。這樣肯定會死機(jī)或者電腦反應(yīng)很慢。


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频