CH372B的HID类键盘,如何超时响应上位机?[求助]

CH372 的 USB HID类键盘,如果响应上位机?现在子程序执行的时间比较长,很容易造成死机,USB HID类键盘要求多长时间内必须响应一次?程序如下:

main( ) { unsigned char i,time,k; unsigned char real_data[11]; //需要上传的数据缓冲区

unsigned char data_flag=0; //有无数据标志 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初始化完成,如果单片机由CH375提供复位信号则不必延时 // //mInitSTDIO( ); CH375_Init( ); // 初始化CH375 // // EA=1;

myprogram(); // 子程序,运行的时间可能200毫秒 up_time=0; time=0;k=0; for(i=0;i<8;i++) buf[i]=0;

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

if (data_flag==0)//检测到数据输入,开发上传 { 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; //有按键按下,置标志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; //有按键按下,置标志1 //PcdHalt(); //goto SEND; }

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

if((UPDATA_FLAG==0x01)&&(k<=1)){ //先发八个字节的0包,相当于确保按键的取消 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]; //发送八个字节,相当于发送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; //循环上传 if(up_time==11) { up_time=0;} //循环上传

} } }

对USB键盘的响应时间没有要求, PC端周期性的读数据,如果键盘有数据则上传数据,如果没有数据则返回NAK(由CH372自动产生)


不是响应的问题。根本不用你MCU去相应。有数据你就填数据就可以了。剩下的事CH372会自己完成。


不对啊, 把 myprogram(); // 子程序,运行的时间可能200毫秒 换成 delay(200); //换成200毫秒的演示,你们试试,肯定有问题


我原以为是我的子程序有问题,查了好久,可后来,我用200毫秒的延时函数替换,就发现了这个问题,不是子程序的问题


你说的是PC对USB设备的枚举阶段,这个时间是要有限制的,一般是几个ms 设备端就必须要响应,否则PC会超时退出。


main( ) { Delay50ms( ); // 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 // CH375_Init( ); // 初始化CH375 // Delay50ms( );Delay50ms( );Delay50ms( );Delay50ms( ); }

CH375_Init( ); 初始化完了,之后如果长时间延时,PC上就提示“无法识别的USB设备”


main( ) { Delay50ms( ); // 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 // CH375_Init( ); // 初始化CH375 // Delay50ms( );Delay50ms( );Delay50ms( );Delay50ms( ); }

CH375_Init( ); 初始化完了,之后如果长时间延时,PC上就提示“无法识别的USB设备”


main( ) { Delay50ms( ); // 延时等待CH375初始化完成,如果单片机由CH375提供复位信号则不必延时 // CH375_Init( ); // 初始化CH375 // Delay50ms( );NAK();//响应 Delay50ms( );NAK();//响应 Delay50ms( );NAK();//响应 Delay50ms( );NAK();//响应 }

CH375_Init( ); 初始化完了,之后如果长时间延时,PC上就提示“无法识别的USB设备”

能不能像喂狗一样,在各延时函数间喂狗,有这样的指令吗?


不是说了吗,PC在对设备枚举的时候,有时间要求的,为什么要加那么多的延时? 如果使用CH372的外置固件模式,初始化CH372之后,PC就开始对CH372进行枚举,下位机要尽快的响应PC的请求,否则PC会超时退出,枚举失败。没有其他方法


你加这个延时干嘛?不用加 Delay50ms( );NAK();//响应 Delay50ms( );NAK();//响应 Delay50ms( );NAK();//响应 Delay50ms( );NAK();//响应 赶紧去掉。这样肯定会死机或者电脑反应很慢。


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