对USB设备操作,WriteFile总是出错

yy1124 2015-08-20 12:44:20
我写了个对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;
...全文
345 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧