作者gg1122 (99通未接来电)
看板ASM
标题Re: [问题] HID Endpoint跟Report Desc关系
时间Fri Apr 19 23:23:49 2013
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
1F:推 ksmrt0123:RX_thread()应该不需要Sleep(1) 04/20 22:29
2F:→ gg1122:请问为什麽不用睡? 开thread不睡觉 这样不是系统很busy吗? 04/22 10:34
3F:推 ksmrt0123:直接进WaitForSingleObject()等就好, 不会占太多CPU 04/22 22:31
4F:→ ksmrt0123: 时间 04/22 22:32
5F:→ ksmrt0123:可看Win32API关於这个函数的说明, Remarks部份的第一段 04/22 22:34
6F:→ ksmrt0123:另外timeout时间要设长一点, 以你的用法正常状况不应该 04/22 22:35
7F:→ ksmrt0123:发生timeout 04/22 22:35
9F:→ gg1122:谢谢 原来我以前都用错 = = 04/26 11:52