各位前輩好,做了個與底層硬體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;
}
}
經驗不足,找不到問題所在,有前輩能提供點建議的嗎?
uj5u.com熱心網友回復:
可以考慮使用windows的dkk的hid操作庫
uj5u.com熱心網友回復:
GetLastError 先查看下錯誤資訊轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/261145.html
標籤:界面
上一篇:error LNK2005: _DllMain@12 已經在 dllmain.obj 中定義
下一篇:程式不兼容
