HID是Human Interface Device的缩写,由其名称可以了解HID设备是直接与人交互的设备,例如键盘、鼠标与游戏杆等。不过HID设备并不一定要有人机接口,只要符合HID类别规范的设备都是HID设备。HID设备一般只有两种传输:中断传输和控制传输。一般自己定义的使用是中断传输,(肯定有个控制端点和IN端点,也可以拥有OUT端点)一个HID包最大为64个字节。这就意味着我们自己定义的协议如果超过64个字节,那么就要多个包发送。
g_HID_au8DeviceReportDescriptor[] =
{
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x00, // USAGE (0)
0xA1, 0x01, // COLLECTION (Application)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0xFF, // LOGICAL_MAXIMUM (255)
0x19, 0x01, // USAGE_MINIMUM (1)
0x29, 0x08, // USAGE_MAXIMUM (8)
0x95, MAX_PACKET_SIZE_INT_OUT, // REPORT_COUNT (8)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x19, 0x01, // USAGE_MINIMUM (1)
0x29, 0x08, // USAGE_MAXIMUM (8)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
0xC0 // END_COLLECTION
};
上面是我下位机USB设备报告描述符,这个关于具体发送格式,这个具体怎么用,我也不知道,因为是自定义协议,我也没有去管理。以后有时间在分析。
关于如何操作HID,这个可以使用HID先关的API,先关头文件和库在DDK或者WDK包里面,请自己去下载。我主要讲讲如何读写设备。关于读写设备windows为我们提供了相关函数ReadFile()和WriteFile()。但是有一点要住,读写一定要HID包大小去操作。
INT CHidUsb::WriteDevice(HANDLE hUsbDevice, const CHAR *lpszBuf, INT nSize, BOOL bNeedRead)
{
DWORD dwSizeWritten;
OVERLAPPED OverLapped;
DWORD dwErrCode;
INT nWriteSize;
INT nNeedWriteSize;
CHAR szHidBuf[HID_PACKAGE_SIZE + 1];
nNeedWriteSize = nSize;
nWriteSize = 0;
// 只能已HID包的格式发送
memset(&OverLapped, 0, sizeof(OverLapped));
OverLapped.hEvent = m_hWriteEvent;
while (1)
{
if (nSize < 0)
{
break;
}
nNeedWriteSize = HID_PACKAGE_SIZE;
if (nNeedWriteSize > nSize)
{
nNeedWriteSize = nSize;
}
nSize -= nNeedWriteSize;
memset(szHidBuf, 0xff, HID_PACKAGE_SIZE + 1);
<span style="color:#ff0000;">szHidBuf[0] = 0</span>;// 这里一定不要忘记,这个是ID,定义为0,所以加上64个字节,所以一次操作为65个字节
memcpy(szHidBuf + 1, lpszBuf, nNeedWriteSize);
lpszBuf += nNeedWriteSize;
<span style="color:#ff0000;">if (!::WriteFile(m_hUsbDevice, szHidBuf, HID_PACKAGE_SIZE + 1, &dwSizeWritten, &OverLapped))</span>
{
dwErrCode = GetLastError();
break;
}
assert(dwSizeWritten == HID_PACKAGE_SIZE + 1);
nWriteSize += dwSizeWritten;
}
if (bNeedRead)
{
SetEvent(m_hWaitEvent);
}
return nWriteSize;
}
这个是我封装写函数,注意事项有注明,关于USB设备还有很多不是很明白,太复杂了。有时间还得继续研究。如果想看USB数据发送和接受,可以使用bus hound。