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

作者: gg1122 (99通未接來電)   2013-04-19 23:23:49
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
: : };
作者: ksmrt0123 (ksmrt)   2013-04-20 22:29:00
RX_thread()應該不需要Sleep(1)
作者: gg1122 (99通未接來電)   2013-04-22 10:34:00
請問為什麼不用睡? 開thread不睡覺 這樣不是系統很busy嗎?
作者: ksmrt0123 (ksmrt)   2013-04-22 22:31:00
直接進WaitForSingleObject()等就好, 不會佔太多CPU時間可看Win32API關於這個函數的說明, Remarks部份的第一段另外timeout時間要設長一點, 以你的用法正常狀況不應該發生timeout請看 http://goo.gl/SLsy1 remarks的第一段
作者: gg1122 (99通未接來電)   2013-04-26 11:52:00
謝謝 原來我以前都用錯 = =

Links booklink

Contact Us: admin [ a t ] ucptt.com