对USB设备操作,WriteFile总是出错
我写了个对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;