Re: [問題] HID Endpoint跟Report Desc關係

看板ASM作者 (99通未接來電)時間11年前 (2013/04/19 23:23), 編輯推噓2(207)
留言9則, 2人參與, 最新討論串3/4 (看更多)
G大說的沒錯 可是我MCU哪邊送出去 不管InputReportLength(<=32)設多少 都有Padding長度到EP1長度32Byte 在1次全部送出去 但是目前的點卡在當我改了Report Desc的InputRepotLenth變0x10 封包長度變短 可是在PC哪邊waitforSingle 莫名奇妙就狂Timeout掉了 加Timeout時間也沒用 去讀的封包變短做的時間反而更夠才對 反而造成Process有問題?? 今天更妙了 我將二邊EP1 EP2 都變成0x10 DecRepot二個長度哪邊也調成0x10 然後把Timeout的時間加長變1ms(會掉)20ms全又收的到了 @@ 目前我是想可能哪邊的process有卡到吧 之前經驗用Rs232 也用過Timer去丟command MCU哪邊也會卡到某個鬼地方 後來PC端Tx也開thread用Event去跟Rx sync就好了 但是現在比較弔詭的是 收短才會出事 想不出來到底是什麼問題... 還麻煩各位如果有想法 還不吝於指教 非常謝謝 測試流程為 1.PC端:每1ms秒送32byte去MCU 2.MCU端:(EP Polling time 1ms)收到資料 丟ACK回PC 但是PC不管MCU回什麼都是定時1ms去丟資料 PC端部份程式如下 USB_GetData(unsigned char *Msg) { DWORD Result=0; Result = ReadFile (ReadHandle, InputReport, Capabilities.InputReportByteLength, //0x21->0x11 有問題 &NumberOfBytesRead, (LPOVERLAPPED) &HIDOverlapped_Read); Result = WaitForSingleObject(HIDOverlapped_Read.hEvent,1); switch(Result) { case WAIT_OBJECT_0: { Result=1; break; } case WAIT_TIMEOUT: { Result=false; break; } default: { Result=false; break; } } // // // // 省略.... } RX_thread() { while(1) { sleep(1); if(USB_GetData(RxMsg,32)==true) { Handle_Receive(RxMsg);//parse packet //do something } } } ※ 引述《govert ( )》之銘言: : Endpoint的大小是跟USB硬體有關, : 你改那個值沒有意義, 反而會造成問題. : 那個值是Max Packet Size, : 也就是一次Transfer最多能傳多少值. : 你回傳0x11個byte, 就是Short Packet, : 沒有什麼差別的. : ※ 引述《gg1122 (99通未接來電)》之銘言: : : hi 各位先進 想請教 Endpoint 跟Repot descriptor 大小的對應關係 : : 我目前拿到一個範例 是正常work沒問題 : : 但是我只要去改EP1或2的大小 或者是Report Count 就會收不到資料 : : 二邊都要絕對定義32個byte(如下列程式) 上層AP Refile 才收的幾乎不會掉 : : 我將input length 改為0x10 資料就會掉的很兇 約只有二成收的到 : : 我的想法為EP buffer這邊32byte 實際定義上只有丟16Byte+1byte(Usage ID) : : 上面AP也讀回0x11 所以變小應該沒關係吧 但是就一直Timeout掉 : : 看了一些其他的範例 但是還是看不出二個參數相對應的關係 : : 還麻煩各位先進能夠 分享這方面的經驗 : : 謝謝 : : //AP : : InputReportByteLength 0x11 //Report ID 0x10 +Report ID 0x01 : : //EP config : : #define EP0_PACKET_SIZE 64 //buffer size of endpoint 0 : : #define EP1_PACKET_SIZE 32 //buffer size of endpoint 1 //for in : : #define EP2_PACKET_SIZE 32 //buffer size of endpoint 2 //for out : : code unsigned char ReportDesc[] = : : { : : 0x06, 0x00, 0xFF,// ; Usage Page : : 0x09, 0x01,// ; Usage : : 0xA1, 0x01, // ; Collection : : 0x09, 0x01,// ; Usage : : 0x95, 0x20,//**change 0x10 ; Report Count //**input length : : 0x75, 0x08,// ; Report Size : : 0x15, 0x00,// ; Logical Minimum : : 0x26, 0xFF, 0x00,// ; Logical Maximum : : 0x81, 0x02,// ; Input : : 0x09, 0x02,// ; Usage : : 0x95, 0x20,// ; Report Count//**output length : : 0x75, 0x08,// ; Report Size : : 0x91, 0x02,// ; Output : : 0xC0 : : }; -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.161.162.71

04/20 22:29, , 1F
RX_thread()應該不需要Sleep(1)
04/20 22:29, 1F

04/22 10:34, , 2F
請問為什麼不用睡? 開thread不睡覺 這樣不是系統很busy嗎?
04/22 10:34, 2F

04/22 22:31, , 3F
直接進WaitForSingleObject()等就好, 不會佔太多CPU
04/22 22:31, 3F

04/22 22:32, , 4F
時間
04/22 22:32, 4F

04/22 22:34, , 5F
可看Win32API關於這個函數的說明, Remarks部份的第一段
04/22 22:34, 5F

04/22 22:35, , 6F
另外timeout時間要設長一點, 以你的用法正常狀況不應該
04/22 22:35, 6F

04/22 22:35, , 7F
發生timeout
04/22 22:35, 7F

04/22 22:50, , 8F
請看 http://goo.gl/SLsy1 remarks的第一段
04/22 22:50, 8F

04/26 11:52, , 9F
謝謝 原來我以前都用錯 = =
04/26 11:52, 9F
文章代碼(AID): #1HSM68EW (ASM)
討論串 (同標題文章)
文章代碼(AID): #1HSM68EW (ASM)