WinUSB使用WinUsb_WritePipe给USB设备写数据
2022-05-11
1502
0
WinUSB 提供了以下用于发送写入请求请求的函数:
- WinUsb_WritePipe
写数据WinUsb_WritePipe
- 分配一个缓冲区并使用要写入到设备的数据进行填充。 如果应用程序未将缓冲区大小设置为管道的策略RAW_IO,则缓冲区大小没有限制。 如有必要,WinUSB 会将缓冲区划分为适当大小的区块。 如果RAW_IO,则缓冲区的大小受 WinUSB 支持的最大传输大小限制。
- 调用 WinUsb_WritePipe ,将缓冲区写入设备。 传递设备的 WinUSB 接口句柄、用于批量传出管道的管道标识符(如本主题的向设备查询 USB 描述符部分所述)和缓冲区。 函数在 bytesWritten 参数中返回实际写入到设备的字节数。 Overlapped 参数设置为 NULL 以请求同步操作。 若要执行异步写入请求,请将 Overlapped 设置为指向 OVERLAPPED 结构的指针。
包含长度为零的数据的写入请求将沿 USB 堆栈向下转发。 如果传输长度大于最大传输长度,则 WinUSB 会将该请求划分成长度为最大传输长度的较小请求,并按顺序提交它们。 下面的代码示例分配一个字符串,并将其发送到设备的批量传出终结点。
BOOL WriteToBulkEndpoint(WINUSB_INTERFACE_HANDLE hDeviceHandle, UCHAR* pID, ULONG* pcbWritten)
{
if (hDeviceHandle==INVALID_HANDLE_VALUE || !pID || !pcbWritten)
{
return FALSE;
}
BOOL bResult = TRUE;
UCHAR szBuffer[] = "Hello World";
ULONG cbSize = strlen(szBuffer);
ULONG cbSent = 0;
bResult = WinUsb_WritePipe(hDeviceHandle, *pID, szBuffer, cbSize, &cbSent, 0);
if(!bResult)
{
goto done;
}
printf("Wrote to pipe %d: %s \nActual data transferred: %d.\n", *pID, szBuffer, cbSent);
*pcbWritten = cbSent;
done:
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