請熟悉USB鍵盤鼠標(biāo)的朋友講解一下USB鍵盤鼠標(biāo)的數(shù)據(jù)格式是怎樣的。如按下鼠標(biāo)的“A”鍵,用CH374芯片的接收緩沖區(qū)會收到什么樣的數(shù)據(jù)結(jié)構(gòu),按其他鍵又是怎樣的那?謝謝!
這個是有規(guī)律的,例如按下鍵盤的空格鍵,那么,發(fā)送的數(shù)據(jù)就是00 00 2c 00 00 00 00 00 放開之后,發(fā)送8個00就可以了,具體的你可以參考下表:UploadImages/200810611465195.rar
謝謝!對于鼠標(biāo)又是怎樣的情況那?
標(biāo)準(zhǔn)的鍵盤如樓上回答的, 多鍵按下的時候從第3個數(shù)據(jù)到第8個都是鍵值最多可以同時按6個按鍵.你到網(wǎng)上下載BUSHOUND軟件.抓一下數(shù)據(jù)看看就明白了.另外還有Num Lock,Caps Lock,Scroll Lock等是三個特殊的案件.控制鍵的數(shù)據(jù)也不同,你用軟件抓一下是如何通訊的.
鼠標(biāo)的通信和鍵盤的類似,至于具體的協(xié)議你可以去下載鼠標(biāo)的數(shù)據(jù)格式協(xié)議。
我將CH374的HID例程測試了一下。HUB1接上USB鼠標(biāo) Start CH374 Host Wait Device In HUB 1 have device HUB 1 have device GetDeviceDescr: 12 01 00 02 00 00 00 08 6D 04 16 C0 40 03 01 02 00 01 SetUsbAddress: HUB_PORT_NUMBER=01
GetConfigDescr: 09 02 22 00 09 02 22 00 01 01 00 A0 32 09 04 00 00 01 03 01 02 00 09 21 10 01 00 01 22 34 00 07 05 81 03 04 00 0A hid_des_leng=34 endp_in_addr=00 endp_out_addr=02 09 02 22 00 01 01 00 A0 32 09 04 00 00 01 03 01 02 00 09 21 10 01 00 01 22 34 00 07 05 81 03 04 00 0A SetUsbConfig: Set_Idle Set_idle success Get_Hid_Des HID_Desc: 05 01 09 02 a1 01 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 75 01 95 03 81 02 75 05 95 01 81 01 05 01 09 30 09 31 09 38 15 81 25 7f 75 08 95 03 81 06 c0 c0 HUB 01 Success No device need Setconfig 重插: Configure_Flag=01 Flag=00 ccDevice of HUB 1 out Configure_Flag=02 Flag=00 ccDevice of HUB 1 out HUB 1 have device Come GetDeviceDescr: 12 01 00 02 00 00 00 08 6D 04 16 C0 40 03 01 02 00 01 SetUsbAddress: HUB_PORT_NUMBER=01
GetConfigDescr: 09 02 22 00 09 02 22 00 01 01 00 A0 32 09 04 00 00 01 03 01 02 00 09 21 10 01 00 01 22 34 00 07 05 81 03 04 00 0A hid_des_leng=34 endp_in_addr=00 endp_out_addr=02 09 02 22 00 01 01 00 A0 32 09 04 00 00 01 03 01 02 00 09 21 10 01 00 01 22 34 00 07 05 81 03 04 00 0A SetUsbConfig: Set_Idle Set_idle success Get_Hid_Des HID_Desc: 05 01 09 02 a1 01 09 01 a1 00 05 09 19 01 29 03 15 00 25 01 75 01 95 03 81 02 75 05 95 01 81 01 05 01 09 30 09 31 09 38 15 81 25 7f 75 08 95 03 81 06 c0 c0 串口軟件得以上數(shù)據(jù)。 為得到鼠標(biāo)使用過程中發(fā)出的數(shù)據(jù),我在程序CH374HUB.C下的子程序 UINT8 HostCtrlTransfer374( PUINT8 ReqBuf, PUINT8 DatBuf, PUINT8 RetLen )中添加了一句 while ( len ) { mDelayuS( 200 ); s = WaitHostTransact374( 0, DEF_USB_PID_IN, tog, 200 ); // IN數(shù)據(jù) if ( s != USB_INT_SUCCESS ) break; count = Read374Byte( REG_USB_LENGTH ); Read374Block( RAM_HOST_RECV, count, DatBuf ); //此處添加 for(i=0;i DatBuf += count; if ( count <= len ) len -= count; else len = 0; if ( count & ( UsbDevEndpSize - 1 ) ) break; // 短包,證明數(shù)據(jù)已經(jīng)發(fā)送完畢 tog = tog ? FALSE : TRUE; } 重新下載運(yùn)行,移動鼠標(biāo),除以上數(shù)據(jù)外,又得到了一下數(shù)據(jù) 00 00 ff 00 00 00 ff 00 00 00 fe 00 00 fe fd 00 00 ff fd 00 00 fe fe 00 00 ff fd 00 00 fe fe 00 00 fd fe 00 不知道,添加到該位置是否合理,因后來又稍改了一處,就得不到鼠標(biāo)的數(shù)據(jù)了,改回去,鼠標(biāo)再怎么移動都沒有數(shù)據(jù)送到串口了,請熟悉的朋友幫忙分析一下,謝謝!
for(i=0;i請不要這樣添加,時間會很長,有可能導(dǎo)致鼠標(biāo)鍵盤的兼容性不強(qiáng).還有這里打印的數(shù)據(jù)是沒有什么意義的. 是控制傳輸?shù)玫降囊恍?shù)據(jù).這個函數(shù)請不要修改.
謝謝!請問我該如何修改才能獲得鼠標(biāo)使用過程中的相應(yīng)數(shù)據(jù)那?
你現(xiàn)在的程序不要修改就可以獲取啊,這樣吧,如果您的程序無法獲取,請發(fā)郵件到lht@wch.cn郵箱,我給你回復(fù)一個程序,是用的CH374U吧?
是的,好的!謝謝,我通過郵箱向您請教!
已經(jīng)發(fā)過去啦
00 00 ff 00 00 00 ff 00 00 00 fe 00 00 fe fd 00 00 ff fd 00 00 fe fe 00 00 ff fd 00 00 fe fe 00 00 fd fe 00 按照格式來說這個就是鼠標(biāo)的數(shù)據(jù) 函數(shù)是這樣來運(yùn)行的: Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_TRANSFER ); // 清中斷標(biāo)志 Write374Block( RAM_HOST_RECV, 20, INT ); // 清空緩沖區(qū) s=Interrupt_Data_Trans(buf); if(s==USB_INT_SUCCESS) { for(i=0;i!=LEN;i++) printf(" %02x",(unsigned short)buf[i]); printf("\n");
}
發(fā)起IN事務(wù)后,如果成功的話就通過printf語句來打印出來的.
現(xiàn)在看懂了,可是現(xiàn)在收不到 00 00 ff 00 00 00 ff 00 00 00 fe 00 00 fe fd 00 00 ff fd 00 00 fe fe 00 00 ff fd 00 00 fe fe 00 00 fd fe 00 數(shù)據(jù)了。執(zhí)行到串口收到 HUB 01 Success No device need Setconfig 但接下來移動鼠標(biāo)就沒有反應(yīng)了,不知道是什么原因
s=Interrupt_Data_Trans(buf); if(s==USB_INT_SUCCESS)//程序在這出現(xiàn)問題,s=0x20,USB_INT_SUCCESS=0x14,所以一直沒有數(shù)據(jù)輸出 { for(i=0;i!=LEN;i++) printf(" %02x",(unsigned short)buf); printf("\n");
}
這主要和延時有關(guān)系,我們是C51下面的程序,而你的程序用AVR速度比51快很多,請修改相關(guān)的US MS延時函數(shù).
好的,明天再試試,謝謝!