有關(guān)CH375操作不了USB鍵盤的特殊按鍵的問(wèn)題

請(qǐng)教各位大俠: 我用CH375讀取USB鍵盤,按USB鍵盤的一般按鍵都可以讀到其按鍵信息,但是按鍵盤上的特殊功能鍵(如‘MUTE’鍵),CH375就讀不到該鍵的信息。是程式問(wèn)題呢還是本身CH375就讀不出這一類按鍵的信息的呢?請(qǐng)幫忙回復(fù)!非常感謝!!

SUGENG328@YAHOO.COM.CN

 把你的USB 鍵盤的配置描述符貼出來(lái)看看.


程序問(wèn)題,CH375只是一個(gè)USB通道而已,功能都是軟件來(lái)實(shí)現(xiàn)的.你的設(shè)備可能是一個(gè)復(fù)合設(shè)備,需要修改函數(shù)才可以的. 分析配置描述符,看接口號(hào)是不是兩個(gè). 用BUSHOUND抓取數(shù)據(jù),看特殊功能鍵是用第幾個(gè)端點(diǎn)來(lái)傳輸?shù)?然后對(duì)相應(yīng)的端點(diǎn)發(fā)起IN就可以了.


插入鍵盤后讀到的是以下信息: Wait KB connect Usb 12 01 10 01 00 00 00 08 38 0b 03 00 00 01 00 01 00 01 09 02 3b 00 02 01 00 a0 32 config 2 09 02 3b 00 02 01 00 a0 32 09 04 00 00 01 03 01 01 00 09 21 10 01 00 01 22 41 00 07 05 81 03 08 00 0a 09 04 01 00 01 03 01 02 00 09 21 10 01 00 01 22 98 00 07 05 82 03 04 00 0a set idle report 05 01 09 06 a1 01 05 07 19 e0 29 e7 15 00 25 01 75 01 95 08 81 02 95 01 75 08 81 01 95 03 75 01 05 08 19 01 29 03 91 02 95 05 75 01 91 01 95 06 75 08 15 00 26 00 05 05 07 19 00 2a 00 81 00 00 c0 set report


用BUSHOUND也獲取不到‘MUTE’這個(gè)靜音鍵的信息,不過(guò)我在不斷按下這個(gè)鍵的時(shí)候電腦的任務(wù)欄的音量一直在開(kāi)/關(guān)音量之間切換


紅桃六大哥所說(shuō)的“看特殊功能鍵是用第幾個(gè)端點(diǎn)來(lái)傳輸?shù)?然后對(duì)相應(yīng)的端點(diǎn)發(fā)起IN就可以了”,在程式是怎樣修改呢?我程式如下: ////123 /**************************************** ***************************************** ** Copyright (C) W.ch 1999-2004 ** ** Web: http://www.winchiphead.com ** *** * * * * * * * * * * * * * * * * * *** ** USB 1.1 Host Examples for CH375 ** ** KC7.0@MCS-51 ** ***************************************** ****************************************/

/* 用CH375操作HID設(shè)備,比如鍵盤,鼠標(biāo)*/ //#include "intrins.h"

#include "reg52.h" #include "stdio.h" #include "CH375INC.H" #include "lcd.h" #include "CH375.H" #include "TABLE.H"

/************************ 十六進(jìn)制字符 ***********************/ BYTE code aHex[] = "A"; BYTE code bHex[] = "B"; BYTE code cHex[] = "C"; BYTE code dHex[] = "D"; BYTE code eHex[] = "E"; BYTE code fHex[] = "F";

void DsplABCDEF(BYTE DataToABC); int HighBit,LowBit;

/**************************** Checkkey ****************************/ /******************************************************************/ #define BYTE unsigned char bit Checkkey(int StartAdd,BYTE *Table) { int i, flag=1;

for(i=0;i<6;i++) { if(data_buf[i]!=*(Table+StartAdd+i)) flag=0; // if(i==1) // { // CPU2_INT0=0; // delay2us(); // delay2us(); // delay2us(); // delay2us(); // delay2us(); // delay2us(); // delay2us(); // delay2us(); printf("%02x ",(unsigned int)data_buf[i]);//在"%02x"這里之前是" %02x ",表示每位數(shù)值空格隔開(kāi) // printf("%c ",(unsigned int)data_buf[i]);//在"%02x"這里之前是" %02x ",表示每位數(shù)值空格隔開(kāi) // CPU2_INT0=1; // } } //printf(" OK\n"); // printf("K\n"); flag_output=0;

return successflag; } /****************************************************************/

void main() { unsigned char i,c; mInitSTDIO( ); delaymsm(100); delaymsm(250); // delaymsm(250); // delaymsm(250); // delaymsm(250); printf("Wait KB connect Usb\n"); set_usb_mode( 6 ); // 設(shè)置USB主機(jī)模式, 如果設(shè)備端是CH37X, 那么5和6均可

while(1) { while ( wait_interrupt()!=USB_INT_CONNECT ); // 等待設(shè)備端連接上來(lái) //USB_INT_CONNECT=0X15,為USB連接事件 delaymsm(5); reset_device(); delaymsm(5); CH375_WR_CMD_PORT(0x15); CH375_WR_DAT_PORT(0x07); //復(fù)位總線 delaymsm(20); CH375_WR_CMD_PORT(0x15); CH375_WR_DAT_PORT(0x06); //復(fù)位完成i set_freq(); //降主頻 /***********************************************************/

Request.Req.bmRequestType=0x80; Request.Req.bRequest =0x06; Request.Req.wValue =0x0001; Request.Req.wIndex =0x0000; Request.Req.wLength =0x1200; if(get_descr_ex()==1) { for(i=0;i!=data_buf[0];i++) printf("%02x ",(unsigned int)data_buf[i]); printf("\n"); } else printf("get device descr failed\n");

set_addr(5); //設(shè)置地址

printf("config\n"); Request.Req.bmRequestType=0x80; Request.Req.bRequest =0x06; Request.Req.wValue =0x0002; Request.Req.wIndex =0x0000; Request.Req.wLength =0x0900;

if(get_descr_ex()==1) { for(i=0;i!=data_buf[0];i++) printf("%02x ",(unsigned int)data_buf[i]); printf("\n"); if(data_buf[4]!=0x01)flag_interface_2=1;//有多個(gè)接口 } else printf("get config descr failed\n");

printf("config 2\n"); if(data_buf[2]>0x09) { flag_config_2=1; Request.Req.bmRequestType=0x80; Request.Req.bRequest =0x06; Request.Req.wValue =0x0002; Request.Req.wIndex =0x0000; Request.Req.wLength =0x0000|((unsigned int)data_buf[2]<<8);

if(get_descr_ex()==1) { for(i=0;i!=data_buf[2];i++) printf("%02x ",(unsigned int)data_buf[i]); printf("\n"); flag_config_2=0; } else printf("get device descr again failed\n"); }

parse_config_descr(); //保存描述符中一些值

set_config(config_value);//設(shè)置配置

printf("set idle\n");

if(set_idle()!=1) printf("set idle failed\n");

printf("report\n");

Request.Req.bmRequestType=0x81; Request.Req.bRequest=0x06; Request.Req.wValue =0x0022; Request.Req.wIndex =0x0000; Request.Req.wLength =0x0000|((unsigned int)(report_descr_len+0x40)<<8); if(get_report_descr_ex()==1) { for(i=0;i!=report_cou;i++) printf("%02x ",(unsigned int)data_buf[i]); printf("\n");

} else printf("get report descr failed\n");

printf("set report\n"); //對(duì)于鍵盤這一步,是點(diǎn)亮指示燈 EA=1;

get_int_in(); //發(fā)送從中斷端點(diǎn)讀數(shù)據(jù)的令牌 printf("YYY");

do{ if (flag_output==1) { for(i=0;i!=4;i++) data_in[i]=data_buf[i]; Checkkey(start*8,CodeTable); }

}while(1); } while ( wait_interrupt()!=USB_INT_DISCONNECT ); }


你這個(gè)設(shè)備是個(gè)復(fù)合的設(shè)備.兩個(gè)接口.你只所以沒(méi)有檢測(cè)到數(shù)據(jù),可能是因?yàn)锽USHOUND里面沒(méi)有選擇這個(gè)設(shè)備.理論上來(lái)說(shuō)肯定有這個(gè)設(shè)備的. 另外你按照BUSHOUND看一下PC怎么枚舉的,先把前面的枚舉過(guò)程做完.最起碼獲取HID報(bào)表描述要獲取兩個(gè)接口的. 然后在對(duì)不同端點(diǎn)發(fā)起IN


不過(guò)我在BUSHOUND里讀其它的鍵都有信息的,只是這個(gè)鍵沒(méi)有讀得出來(lái),您說(shuō)在BUSHOUND里面沒(méi)有選擇這個(gè)設(shè)備,是要選擇兩個(gè)的嗎


是的,你看一下設(shè)備管理器里面是不是當(dāng)你插上這個(gè)設(shè)備的時(shí)候,會(huì)出現(xiàn)兩個(gè)設(shè)備.選擇兩個(gè)才可以的.


紅桃六大哥您說(shuō)這個(gè)是復(fù)合設(shè)備,那要怎樣修改CH375的函數(shù)才可以讀得到這個(gè)鍵呢


我選上了,現(xiàn)在BUSHOUND里也可以讀得出來(lái)這個(gè)信息了,BUSHOUND里顯示的是: 26 DI 01 e2 00 ... 28.1.0 26 DI 01 00 00 ... 28.1.0


發(fā)郵件到lht@wch.cn索取操作復(fù)合設(shè)備的參考程序.


上面BUSHOUND里讀出的數(shù)據(jù),您能知道它是哪個(gè)端口發(fā)出的嗎?


我已發(fā)郵件到lht@wch.cn了,麻煩您發(fā)一份操作復(fù)合設(shè)備的參考程序給我,謝謝


郵件已經(jīng)給您回復(fù),請(qǐng)注意查收!


哦,有看到郵件了,非常感謝!我先看一下了,有問(wèn)題再請(qǐng)教.多謝了!


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

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