WinUSB使用WinUsb_ReadPipe从USB设备读数据
2022-05-11
1065
0
WinUSB 提供了以下用于接收读取请求请求的函数:
- WinUsb_ReadPipe
调用 WinUsb_ReadPipe 从设备的批量终结点读取数据。 传递设备的 WinUSB 接口句柄、用于批量传入终结点的管道标识符,以及适当大小的空缓冲区。 当函数返回时,缓冲区会包含已从设备读取的数据。 已读取的字节数在函数的 bytesRead 参数中返回。 对于读取请求,缓冲区大小必须是最大数据包大小的倍数。
- 长度为零的读取请求会立即完成(结果为成功),并且不会沿堆栈向下发送。
- 如果传输长度大于最大传输长度,则 WinUSB 会将该请求划分成长度为最大传输长度的较小请求,并按顺序提交它们。
- 如果传输长度不是端点的 MaxPacketSize 的倍数,则 WinUSB 会将传输的大小增加到 MaxPacketSize 的下一倍数。
- 如果设备返回的数据多于已请求的数据,WinUSB 将保存多余的数据。
- 如果来自上一个读取请求的数据仍然存在,则 WinUSB 会将其复制到下一个读取请求的开头,并完成请求(如有必要)。
下面的代码示例从设备的批量传入终结点读取数据。
BOOL ReadFromBulkEndpoint(WINUSB_INTERFACE_HANDLE hDeviceHandle, UCHAR* pID, ULONG cbSize)
{
if (hDeviceHandle==INVALID_HANDLE_VALUE)
{
return FALSE;
}
BOOL bResult = TRUE;
UCHAR* szBuffer = (UCHAR*)LocalAlloc(LPTR, sizeof(UCHAR)*cbSize);
ULONG cbRead = 0;
bResult = WinUsb_ReadPipe(hDeviceHandle, *pID, szBuffer, cbSize, &cbRead, 0);
if(!bResult)
{
goto done;
}
printf("Read from pipe %d: %s \nActual data read: %d.\n", *pID, szBuffer, cbRead);
done:
LocalFree(szBuffer);
return bResult;
}
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936