用VC++实现USB接口读写数据的程序.docx
《用VC++实现USB接口读写数据的程序.docx》由会员分享,可在线阅读,更多相关《用VC++实现USB接口读写数据的程序.docx(13页珍藏版)》请在冰豆网上搜索。
用VC++实现USB接口读写数据的程序
用VC++实现USB接口读写数据的程序
2009-08-1511:
55
用VC++实现USB接口读写数据的程序
使用一个GUIDguidHID_1查找并打开一个USB设备
extern"C"intPASCALSearchUSBDevice()
{
HANDLEhUsb;
intnCount,i,j;//标记同一设备个数
HDEVINFOhDevInfoSet;
BOOLbResult;
PSP_DEVICE_INTERFACE_DETAIL_DATApDetail=NULL;
memset(m_sysversion,0,20);
GetSysVersion(m_sysversion);
//检索相关GUID的USB设备总设备个数
if(!
GetUSBList())
{
return0;
}
//取得一个该GUID相关的设备信息集句柄
hDevInfoSet=:
:
SetupDiGetClassDevs((LPGUID)&guidHID_1,//GUID_CLASS_USB_DEVICE,//classGUID
NULL,//无关键字
NULL,//不指定父窗口句柄
DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);//目前存在的设备
//失败...
if(hDevInfoSet==INVALID_HANDLE_VALUE)
{
returnNULL;
}
//申请设备接口数据空间
nCount=0;
bResult=TRUE;
for(i=0;i<34;i++)
{
bDeviceOpen=FALSE;
memset(m_DeviceDesc,0,256);
}
SP_DEVICE_INTERFACE_DATAifdata;
//设备序号=0,1,2...逐一测试设备接口,到失败为止
while(bResult)
{
ifdata.cbSize=sizeof(ifdata);
//枚举符合该GUID的设备接口
bResult=:
:
SetupDiEnumDeviceInterfaces(
hDevInfoSet,//设备信息集句柄
NULL,//不需额外的设备描述
(LPGUID)&guidHID_1,//GUID_CLASS_USB_DEVICE,//GUID
(ULONG)nCount,//设备信息集里的设备序号
&ifdata);//设备接口信息
if(bResult)
{
ULONGpredictedLength=0;
ULONGrequiredLength=0;
//取得该设备接口的细节(设备路径)
bResult=SetupDiGetInterfaceDeviceDetail(
hDevInfoSet,//设备信息集句柄
&ifdata,//设备接口信息
NULL,//设备接口细节(设备路径)
0,//输出缓冲区大小
&requiredLength,//不需计算输出缓冲区大小(直接用设定值)
NULL);//不需额外的设备描述
//取得该设备接口的细节(设备路径)
predictedLength=requiredLength;
//if(pDetail)
//{
//pDetail=NULL;
//}
pDetail=(PSP_INTERFACE_DEVICE_DETAIL_DATA):
:
GlobalAlloc(LMEM_ZEROINIT,predictedLength);
pDetail->cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
bResult=SetupDiGetInterfaceDeviceDetail(
hDevInfoSet,//设备信息集句柄
&ifdata,//设备接口信息
pDetail,//设备接口细节(设备路径)
predictedLength,//输出缓冲区大小
&requiredLength,//不需计算输出缓冲区大小(直接用设定值)
NULL);//不需额外的设备描述
if(bResult)
{
//复制设备路径到输出缓冲区
//:
:
strcpy(pszDevicePath[nCount],pDetail->DevicePath);
if(strcmp(m_sysversion,"winnt")==0)
{
charch[18];
for(i=0;i<17;i++){
ch=*(pDetail->DevicePath+8+i);
}
ch[17]='\0';
if(strcmp(ch,"vid_0471&pid_0666")==0)//比较版本号,防止意外出错
{
memset(&READ_OS,0,sizeof(OVERLAPPED));
memset(&WRITE_OS,0,sizeof(OVERLAPPED));
READ_OS.hEvent=CreateEvent(NULL,//nosecurity
TRUE,//explicitresetreq
FALSE,//initialeventreset
NULL);//noname
if(READ_OS.hEvent==NULL)
{
break;
}
WRITE_OS.hEvent=CreateEvent(NULL,//nosecurity
TRUE,//explicitresetreq
FALSE,//initialeventreset
NULL);//noname
if(NULL==WRITE_OS.hEvent)
{
CloseHandle(READ_OS.hEvent);
break;
}
hUsb=CreateFile(pDetail->DevicePath,//&guidHID_1,//
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL/*|
FILE_FLAG_OVERLAPPED*/,
NULL);
if(hUsb!
=NULL)
{
//比较定位找到的USB在哪个USBPORT上
charid[30];
memset(id,0,30);
i=0;
do
{
id=*(pDetail->DevicePath+26+i);
i++;
}
while(id!
='#');
id='\0';
for(j=0;j<34;j++)
{
if(strcmp(id,m_USBList[j])==0)
{
sprintf(m_DeviceDesc[j+1],"%s",pDetail->DevicePath);
m_USBPositionMap[nCount]=j+1;
break;
}
}
CloseHandle(hUsb);
nCount++;
//break;
}
}//比较驱动版本
}//比较操作系统版本
else
{
memset(&READ_OS,0,sizeof(OVERLAPPED));
memset(&WRITE_OS,0,sizeof(OVERLAPPED));
READ_OS.hEvent=CreateEvent(NULL,//nosecurity
TRUE,//explicitresetreq
FALSE,//initialeventreset
NULL);//noname
if(READ_OS.hEvent==NULL)
{
break;
}
WRITE_OS.hEvent=CreateEvent(NULL,//nosecurity
TRUE,//explicitresetreq
FALSE,//initialeventreset
NULL);//noname
if(NULL==WRITE_OS.hEvent)
{
CloseHandle(READ_OS.hEvent);
break;
}
hUsb=CreateFile(pDetail->DevicePath,//&guidHID_1,//
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL/*|
FILE_FLAG_OVERLAPPED*/,
NULL);
if(hUsb!
=NULL)
{
if(strcmp(pDetail->DevicePath,m_USBList[j])==0)
{
sprintf(m_DeviceDesc[j+1],"%s",pDetail->DevicePath);
m_USBPositionMap[nCount]=j+1;
break;
}
CloseHandle(hUsb);
nCount++;
//break;
}
}
}
}
}
//释放设备接口数据空间
:
:
GlobalFree(pDetail);
//关闭设备信息集句柄
:
:
SetupDiDestroyDeviceInfoList(hDevInfoSet);
iDeviceCount=nCount;
returnnCount;
}
//写
BOOLWritestr(char*buf,intbuflen,intindex)
{
BOOLfWriteStat;
DWORDdwErrorFlags;
DWORDdwError;
COMSTATComStat;
charszError[10];
DWORDret;
intlen,i,j,packet;
div_tdiv_result;
BYTEsendpacket[65];
BYTExorcode="0x00";
if(m_gphdCom[index]==NULL)//nousbdevice(jk100c)
{
return-1;
}
div_result=div(buflen,58);
if(div_result.rem==0)
{
packet=div_result.quot;
}
else
{
packet=div_result.quot+1;
}
for(i=0;i{
memset(sendpacket,0,65);
if(i==packet-1)
{
//endpacket
if(div_result.rem==0)
{
len=58;
}
else
{
len=div_result.rem;
}
}
else
{
len=58;
}
sendpacket[0]=0x13;
sendpacket[1]=3+len;
sendpacket[2]=0x01;
sendpacket[3]=packet*16+i+1;
memcpy(sendpacket+4,buf+(i*58),len);
for(j=0;j{
xorcode^=sendpacket[j+1];
}
sendpacket[len+4]=(char)xorcode;
sendpacket[len+5]=0x23;
PurgeComm(m_gphdCom[index],PURGE_RXCLEAR|PURGE_TXCLEAR);
//Sleep(10);
fWriteStat=WriteFile(m_gphdCom[index],sendpacket,len+6,&ret,NULL);
if(!
fWriteStat)
{
if(GetLastError()==ERROR_IO_PENDING)
{
dwError=GetLastError();
//anerroroccurred,trytorecover
wsprintf(szError,"\n\r",dwError);
OutputDebugString(szError);
ClearCommError(m_gphdCom[index],&dwErrorFlags,&ComStat);
if(dwErrorFlags>0)
{
wsprintf(szError,"\n\r",dwErrorFlags);
OutputDebugString(szError);
}
}
else
{
//someothererroroccurred
ClearCommError(m_gphdCom[index],&dwErrorFlags,&ComStat);
if(dwErrorFlags>0)
{
wsprintf(szError,"\n\r",dwErrorFlags);
OutputDebugString(szError);
}
returnFALSE;
}
}
if(i!
=packet-1)
{
//shouldbereceiveack
if(ReceivePacketAnswer(index)!
=0)
{
returnFALSE;
}
}
}
returnTRUE;
}
//读
intReadstr(char*buf,intnMaxLength,intindex)
{
BOOLfReadStat;
COMSTATComStat;
DWORDdwErrorFlags;
DWORDdwLength;
DWORDdwError;
charszError[10];
if(fCOMMOpened==0)
{
returnFALSE;//串口未打开
}
//onlytrytoreadnumberofbytesinqueue
ClearCommError(m_gphdCom[index],&dwErrorFlags,&ComStat);
//dwLength=min((DWORD)nMaxLength,ComStat.cbInQue);
dwLength=nMaxLength;
if(dwLength>0)
{
if(olap==TRUE)
{
fReadStat=ReadFile(m_gphdCom[index],buf,dwLength,&dwLength,&READ_OS);
if(!
fReadStat)
{
if(GetLastError()==ERROR_IO_PENDING)
{
OutputDebugString("\n\rIOPending");
while(!
GetOverlappedResult(m_gphdCom[index],&READ_OS,
&dwLength,TRUE))
{
dwError=GetLastError();
if(dwError==ERROR_IO_INCOMPLETE)continue;
else
{
//anerroroccurred,trytorecover
ClearCommError(m_gphdCom[index],&dwErrorFlags,&ComStat);
break;
}
}
}
else//end-----if(GetLastError()==ERROR_IO_PENDING)
{
//someothererroroccurred
dwLength=0;
ClearCommError(m_gphdCom[index],&dwErrorFlags,&ComStat);
if(dwErrorFlags>0)
{
wsprintf(szError,"\n\r",dwErrorFlags);
OutputDebugString(szError);
}
}
}//end-----if(!
fReadStat)
}//end-----if(olap==TRUE)
else
{
fReadStat=ReadFile(m_gphdCom[index],buf,dwLength,&dwLength,NULL);
if(!
fReadStat)
{
dwError=GetLastError();
ClearCommError(m_gphdCom[index],&dwErrorFlags,&ComStat);
if(dwErrorFlags>0)
{
wsprintf(szError,"\n\r",dwErrorFlags);
OutputDebugString(szError);
}
}
PurgeComm(m_gphdCom[index],PURGE_RXCLEAR|PURGE_TXCLEAR);
}
}
returndwLength;