WinUsb的同步传输收发
2025-09-15
0
0
这里以USB Gddget- source/sink创建的设备为例,详见:https://www.usbzh.com/article/detail-1581.html
这里的同步端点位于inter=0,alt=1接口描述符下,有端点地址分别为0x02和0x82,PacektSize都为1024
接收例程为:
#define numPackets 10
void CWinUsbToolDlg::TestISORead()
{
INT index = GetDlgItemInt(IDC_EDIT_ALT_INTERFACE);
WINUSB_PIPE_INFORMATION info[4];
for (int i = 0; i < 4; i++)
{
BOOL isok = WinUsb_QueryPipe(m_dev.m_WinusbHandle, index, i, &info[i]);
}
BOOL isok1 = m_dev.SetAlternate(index);
UCHAR buff[1024* numPackets];
WINUSB_ISOCH_BUFFER_HANDLE hIsochBuffer = NULL;
BOOL bResult = WinUsb_RegisterIsochBuffer(m_dev.m_WinusbHandle, 0x82, buff, sizeof(buff), &hIsochBuffer);
USBD_ISO_PACKET_DESCRIPTOR IsoPacketDesc[numPackets];
for (int i = 0; m_IsRcv; i++)
{
OVERLAPPED overlap;
memset(&overlap, 0, sizeof(overlap));
overlap.hEvent = m_dev.m_hEvent;
ResetEvent(m_dev.m_hEvent);
bResult = WinUsb_ReadIsochPipeAsap(hIsochBuffer, 0, sizeof(buff), FALSE, numPackets, IsoPacketDesc, &overlap);
if (!bResult && GetLastError() != ERROR_IO_PENDING)
{
printf("WinUsb_ReadIsochPipe failed immediately. Error: %d\n", GetLastError());
break;
}
// 7. 等待异步操作完成(如果需要同步等待)
DWORD dwBytesTransferred = 0;
bResult = GetOverlappedResult(m_dev.m_WinusbHandle, &overlap, &dwBytesTransferred, TRUE);
if (!bResult)
{
DWORD e = GetLastError();
printf("GetOverlappedResult failed. Error: %d\n", GetLastError());
break;
}
}
if (hIsochBuffer != NULL)
{
WinUsb_UnregisterIsochBuffer(hIsochBuffer);
}
}
发送例程:
void CWinUsbToolDlg::TestISOWrite()
{
INT index = GetDlgItemInt(IDC_EDIT_ALT_INTERFACE);
WINUSB_PIPE_INFORMATION info[4];
for (int i = 0; i < 4; i++)
{
BOOL isok = WinUsb_QueryPipe(m_dev.m_WinusbHandle, index, i, &info[i]);
}
BOOL isok1 = m_dev.SetAlternate(index);
UCHAR buff[1024 * numPackets];
WINUSB_ISOCH_BUFFER_HANDLE hIsochBuffer = NULL;
BOOL bResult = WinUsb_RegisterIsochBuffer(m_dev.m_WinusbHandle, 0x02, buff, sizeof(buff), &hIsochBuffer);
for (int i = 0; m_IsRcv; i++)
{
OVERLAPPED overlap;
memset(&overlap, 0, sizeof(overlap));
overlap.hEvent = m_dev.m_hEvent;
ResetEvent(m_dev.m_hEvent);
memset(buff,i, 1024 * numPackets);
bResult = WinUsb_WriteIsochPipeAsap(hIsochBuffer, 0, sizeof(buff), FALSE, &overlap);
if (!bResult && GetLastError() != ERROR_IO_PENDING)
{
printf("WinUsb_ReadIsochPipe failed immediately. Error: %d\n", GetLastError());
break;
}
// 7. 等待异步操作完成(如果需要同步等待)
DWORD dwBytesTransferred = 0;
bResult = GetOverlappedResult(m_dev.m_WinusbHandle, &overlap, &dwBytesTransferred, TRUE);
if (!bResult)
{
DWORD e = GetLastError();
printf("GetOverlappedResult failed. Error: %d\n", GetLastError());
break;
}
}
}
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936