我寫了個對USB設備就行讀寫的程式,WriteFile總是失敗,呼叫GetLastError回傳是87,我看過網上很多人的回復,按照他們的方法處理過了,但是還是不行;我用USB除錯助手給設備發送命令,設備回傳來的資料我的程式也能接收到,所有我斷定是發送資料出了問題,下面是代碼,希望各位大神能夠幫忙看看,問題到底出現在哪里?
初始化函式:
BOOL CUSBAPI::Init(USHORT VID, USHORT PID)//初始化設備
{
bool bArrival = false;
HDEVINFO hDevInfo = SetupDiGetClassDevs(&guidHID,NULL,NULL,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);
DWORD dwIndex = 0;
while (true)
{
SP_DEVICE_INTERFACE_DATA devInterfaceData;
devInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
BOOL bRet = SetupDiEnumDeviceInterfaces(hDevInfo,NULL,&guidHID,dwIndex,&devInterfaceData);
if (!bRet)
{
//if (GetLastError() == ERROR_NO_MORE_ITEMS)
{
break;
}
}
if (bRet)
{
DWORD dwSize = 0;
BOOL bStatus = SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInterfaceData,NULL,0,&dwSize,NULL);
PSP_DEVICE_INTERFACE_DETAIL_DATA pDevInterfaceDetail =
(PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(dwSize);
pDevInterfaceDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
SP_DEVINFO_DATA devInfoData;
devInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
bStatus = SetupDiGetDeviceInterfaceDetail(hDevInfo,&devInterfaceData,pDevInterfaceDetail,dwSize,
&dwSize,&devInfoData);
m_hCom = CreateFile(pDevInterfaceDetail->DevicePath,GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,
(LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
HIDD_ATTRIBUTES devAttributes;
devAttributes.Size = sizeof(HIDD_ATTRIBUTES);
HidD_GetAttributes(m_hCom,&devAttributes);
if (devAttributes.VendorID==VID&&devAttributes.ProductID==PID)
{
HIDP_CAPS Capabilities;
PHIDP_PREPARSED_DATA PreparsedData;
HidD_GetPreparsedData(m_hCom,&PreparsedData);
HidP_GetCaps(PreparsedData,&Capabilities);
dwInQuery = Capabilities.InputReportByteLength;
dwOutQuery = Capabilities.OutputReportByteLength;
HidD_FreePreparsedData(PreparsedData);
strDevName = pDevInterfaceDetail->DevicePath;
free(pDevInterfaceDetail);
bArrival = true;
break;
}
free(pDevInterfaceDetail);
CloseHandle(m_hCom);
}
dwIndex++;
}
SetupDiDestroyDeviceInfoList(hDevInfo);
if (bArrival)
{
return TRUE;
}
return FALSE;
}
發送命令函式:
void CUSBAPI::Send(char* pStrOut)//發送資料
{
if (m_hCom!=INVALID_HANDLE_VALUE)
{
OVERLAPPED m_osWrite;
memset(&m_osWrite,0,sizeof(OVERLAPPED));
m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
char lpOutBuffer[512] = {'\0'};
memcpy(lpOutBuffer,pStrOut,dwOutQuery);
DWORD dwBytesWrite = 0;
BOOL bWriteStat=WriteFile(m_hCom,lpOutBuffer,dwOutQuery,&dwBytesWrite,&m_osWrite);
if(!bWriteStat)
{
int x = GetLastError();
DWORD m;
BOOL b = GetOverlappedResult(m_hCom,&m_osWrite,&m,FALSE);
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(m_osWrite.hEvent,500);
}
}
}
}
接收資料函式:
void CUSBAPI::Receive(char* pStrIn)//接收資料
{
if (m_hCom!=INVALID_HANDLE_VALUE)
{
OVERLAPPED m_osRead;
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
memset(&m_osRead,0,sizeof(OVERLAPPED));
char lpInBuffer[256] = {'\0'};
DWORD dwBytesRead = 0;
BOOL bReadStat=ReadFile(m_hCom,lpInBuffer,
dwInQuery,&dwBytesRead,&m_osRead);
if(!bReadStat)
{
if(GetLastError()==ERROR_IO_PENDING)//GetLastError()函式回傳ERROR_IO_PENDING,表明串口正在進行讀操作
{
WaitForSingleObject(m_osRead.hEvent,500);
//使用WaitForSingleObject函式等待,直到讀操作完成或延時已達到
//當串口讀操作進行完畢后,m_osRead的hEvent事件會變為有信號
}
}
memcpy(pStrIn,lpInBuffer,dwInQuery);
}
}
主函式中呼叫:
CUSBAPI m_USBHID;
m_USBHID.Init(m_VID,m_PID);
m_USBHID.Send(sCmd);
Sleep(10);
m_USBHID.Receive(sRes);
其中sCmd和sRes是個字符陣列,m_VID和m_PID是USB設備的硬體ID;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/94364.html
標籤:網絡及通訊開發
上一篇:flutter安卓端熱更新詳細教程-附原始碼 超簡單
下一篇:小女子求大神幫忙
