VS2019 USB HID通讯有时失败问题
各位前辈好,做了个与底层硬件USB通讯的工具,使用的是API接口函数方式,CreateFile,WriteFile,ReadFile
通讯时会出现失败情况,在不 同的电脑出现的概率不一样, 有的只是偶尔出现,有的电脑很频繁,如下图报错:
int CUsbComm::WriteReport(BYTE _ReportData[])
{
// Send a report to the device
DWORD BytesWritten = 0;
ULONG Result;
int InputLength, OutputLength;
int ByteNumber = 0;
BYTE OutputReport[REPORT_PACK_LEN] = { 0 };
BYTE InputReport[REPORT_PACK_LEN] = { 0 };
//The first byte is the report number
if (m_hWriteHandle != INVALID_HANDLE_VALUE)
{
for (ByteNumber = 0; ByteNumber < m_Capabilities.OutputReportByteLength; ByteNumber++)
{
OutputReport[ByteNumber] = _ReportData[ByteNumber];
}
Result = WriteFile(m_hWriteHandle, OutputReport, m_Capabilities.OutputReportByteLength, &BytesWritten, &m_WriteOverlapped);
Result = WaitForSingleObject(m_WriteOverlapped.hEvent, USB_TIMEOUT);
switch (Result)
{
case WAIT_OBJECT_0:
{
ResetEvent(m_WriteOverlapped.hEvent);
return OK;
break;
}
case WAIT_TIMEOUT:
{
break;
}
default:
{
CloseDevice();
break;
}
}
}
ResetEvent(m_WriteOverlapped.hEvent);
return ERR;
}
int CUsbComm::ReadReport(BYTE* ReportData)
{
DWORD Result;
int tmp;
// int InputLength,OutputLength;
DWORD NumberOfBytesRead;
int ByteNumber = 0;
BYTE InputReport[REPORT_PACK_LEN] = { 0 };
if (m_hReadHandle != INVALID_HANDLE_VALUE)
{
ReadFile(m_hReadHandle, InputReport, m_Capabilities.InputReportByteLength, &NumberOfBytesRead, &m_ReadOverlapped);
// 等待事件触发
Result = WaitForSingleObject(m_ReadOverlapped.hEvent, USB_TIMEOUT);
switch (Result)
{
case WAIT_OBJECT_0:
{
//CHAR ReceivedByte;
for (ByteNumber = 0; ByteNumber < m_Capabilities.InputReportByteLength; ByteNumber++)
{
ReportData[ByteNumber] = InputReport[ByteNumber];
}
ResetEvent(m_ReadOverlapped.hEvent);
return OK;
break;
}
case WAIT_TIMEOUT:
{
break;
}
default:
{
tmp = CloseDevice();
break;
}
}
}
ResetEvent(m_ReadOverlapped.hEvent);
return ERR;
}
int err = m_UsbComm.WriteReport(UsbBuf_s);
if (err != 0)
{
pDlg->m_eidt_mesg.Format(_T("通讯失败"));
goto end;
}
if (m_UsbComm.ReadReport(UsbBuf_r) == 0)
{
if ((UsbBuf_r[1] != 0x11) || (UsbBuf_r[2] != 0x22) || (UsbBuf_r[3] != 0x33))
{
pDlg->m_eidt_mesg.Format(_T("通讯失败"));
goto end;
}
}
经验不足,找不到问题所在,有前辈能提供点建议的吗?