用VC++实现USB接口读写数据的程序.docx

上传人:b****0 文档编号:12541700 上传时间:2023-04-20 格式:DOCX 页数:13 大小:16.99KB
下载 相关 举报
用VC++实现USB接口读写数据的程序.docx_第1页
第1页 / 共13页
用VC++实现USB接口读写数据的程序.docx_第2页
第2页 / 共13页
用VC++实现USB接口读写数据的程序.docx_第3页
第3页 / 共13页
用VC++实现USB接口读写数据的程序.docx_第4页
第4页 / 共13页
用VC++实现USB接口读写数据的程序.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

用VC++实现USB接口读写数据的程序.docx

《用VC++实现USB接口读写数据的程序.docx》由会员分享,可在线阅读,更多相关《用VC++实现USB接口读写数据的程序.docx(13页珍藏版)》请在冰豆网上搜索。

用VC++实现USB接口读写数据的程序.docx

用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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1