如何编写程序读写USB,实现两台机之间的通信 如题,谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 协议使用X-MODEM就可以了,通讯的读写和串口一样,用createfile, writefile, readfile// 打开USBHANDLE CUSB::SearchUSBDevice(){ HANDLE usb; int nCount;//标记同一设备个数 HDEVINFO hDevInfoSet; BOOL bResult; CString str; usb = NULL; PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail =NULL; // 取得一个该GUID相关的设备信息集句柄 hDevInfoSet = ::SetupDiGetClassDevs((LPGUID)&guidHID_1,//GUID_CLASS_USB_DEVICE, // class GUID NULL, // 无关键字 NULL, // 不指定父窗口句柄 DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); // 目前存在的设备 // 失败... if (hDevInfoSet == INVALID_HANDLE_VALUE) { return NULL; } // 申请设备接口数据空间 nCount = 0; bResult = TRUE; SP_DEVICE_INTERFACE_DATA ifdata; // 设备序号=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) { ULONG predictedLength = 0; ULONG requiredLength = 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 (theApp.m_SysVersion.Compare("winnt")==0) { char ch[18]; for(int i=0;i<17;i++){ ch[i]=*(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, // no security TRUE, // explicit reset req FALSE, // initial event reset NULL ) ; // no name if (READ_OS.hEvent == NULL) { break; } WRITE_OS.hEvent = CreateEvent( NULL, // no security TRUE, // explicit reset req FALSE, // initial event reset NULL ) ; // no name if (NULL == WRITE_OS.hEvent) { CloseHandle( READ_OS.hEvent ); break; } usb=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 (usb != NULL) { break; } } } else { memset( &READ_OS, 0, sizeof( OVERLAPPED ) ) ; memset( &WRITE_OS, 0, sizeof( OVERLAPPED ) ) ; READ_OS.hEvent = CreateEvent( NULL, // no security TRUE, // explicit reset req FALSE, // initial event reset NULL ) ; // no name if (READ_OS.hEvent == NULL) { break; } WRITE_OS.hEvent = CreateEvent( NULL, // no security TRUE, // explicit reset req FALSE, // initial event reset NULL ) ; // no name if (NULL == WRITE_OS.hEvent) { CloseHandle( READ_OS.hEvent ); break; } usb=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 (usb != NULL) { break; } } } } nCount++; } // 释放设备接口数据空间 ::GlobalFree(pDetail); // 关闭设备信息集句柄 ::SetupDiDestroyDeviceInfoList(hDevInfoSet); if (usb != NULL) { return usb; } else { return NULL; }} 写和读ULONG CUSB::WriteUSB(unsigned char * data, int datalength){ BOOL fWriteStat; DWORD dwErrorFlags; DWORD dwError; COMSTAT ComStat; char szError[ 10 ] ; DWORD ret; int len, i, packet; div_t div_result; BYTE sendpacket[65]; if (m_hUSB == NULL) // no usb device(jk100c) { return -1; } div_result = div(datalength, 64); if (div_result.rem == 0) { packet = div_result.quot; } else { packet = div_result.quot+1; } for (i=0; i<packet; i++) { memset(sendpacket, 0, 65); if(i==packet-1) { // end packet if (div_result.rem == 0) { len = 64; } else { len = div_result.rem; } } else { len = 64; } memcpy(sendpacket, data+(i*64), len); Sleep(2); fWriteStat = WriteFile(m_hUSB, sendpacket, len, &ret,/* NULL*/&WRITE_OS); if (!fWriteStat) { if ((dwError=GetLastError()) == ERROR_IO_PENDING) { while (!GetOverlappedResult(m_hUSB,&WRITE_OS,&ret, TRUE )) { dwError = GetLastError(); if(dwError == ERROR_IO_INCOMPLETE) { OutputDebugString("write io pending"); continue; } else { //an error occurred, try to recover wsprintf( szError, "\n\r <CE-%u>", dwError ) ; OutputDebugString(szError); ClearCommError(m_hUSB, &dwErrorFlags, &ComStat ) ; if (dwErrorFlags > 0) { wsprintf( szError, "\n\r <CE-%u>",dwErrorFlags ) ; OutputDebugString(szError); } break; } } } else { // some other error occurred wsprintf( szError, "\n\r <CE-%u>", dwError ) ; OutputDebugString(szError); ClearCommError(m_hUSB,&dwErrorFlags,&ComStat ) ; if (dwErrorFlags>0) { wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags) ; OutputDebugString(szError); } return ( FALSE ); } } }// ResetEvent(WRITE_OS.hEvent); return ret;}int CUSB::ReadUSB(unsigned char * buf, int length){ DWORD dwLength; COMSTAT ComStat; DWORD dwErrorFlags; DWORD dwError; char szError[ 10 ]; if (m_hUSB == NULL) // no usb device(jk100c) { return -1; } ClearCommError(m_hUSB, &dwErrorFlags, &ComStat) ; dwLength = length; int ret = ReadFile(m_hUSB, buf, dwLength, &dwLength,/* NULL*/&READ_OS); if (!ret) { if (GetLastError() == ERROR_IO_PENDING) { OutputDebugString("\n\rIO Pending"); while(!GetOverlappedResult(m_hUSB, &READ_OS, &dwLength, TRUE )) { dwError = GetLastError(); if(dwError == ERROR_IO_INCOMPLETE) { break; } else { // an error occurred, try to recover ClearCommError(m_hUSB,&dwErrorFlags, &ComStat ) ; break; } } } else // end-----if (GetLastError() == ERROR_IO_PENDING) { // some other error occurred dwLength = 0 ; ClearCommError(m_hUSB, &dwErrorFlags, &ComStat ) ; if (dwErrorFlags >0) { wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags ) ; OutputDebugString(szError); } } } // end-----if (!fReadStat) // ResetEvent(READ_OS.hEvent); return dwLength;} X-MODEM协议你看看http://blog.csdn.net/zhangnanonnet/archive/2004/09/01/90670.aspx 一个不规则窗体 如何点击按钮从不规则窗体还原回矩形 关于mime过滤器,Continue方法,死循环 Active Document的一个疑难问题 多文档菜单问题 新手提问:为什么控制字符不见了(读写文本问题)... sql server与access 如何获取系统信息框的路径 GetDefaultConnect()的问题 有关仿真程序的问题,急!! MFC 对话框显示图片问题 安全模式下如何让程序自动运行。 到处都是华为软件外包工程师
HANDLE CUSB::SearchUSBDevice()
{
HANDLE usb; int nCount;//标记同一设备个数
HDEVINFO hDevInfoSet;
BOOL bResult;
CString str;
usb = NULL; PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail =NULL;
// 取得一个该GUID相关的设备信息集句柄
hDevInfoSet = ::SetupDiGetClassDevs((LPGUID)&guidHID_1,//GUID_CLASS_USB_DEVICE, // class GUID
NULL, // 无关键字
NULL, // 不指定父窗口句柄
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); // 目前存在的设备
// 失败...
if (hDevInfoSet == INVALID_HANDLE_VALUE)
{
return NULL;
}
// 申请设备接口数据空间
nCount = 0;
bResult = TRUE;
SP_DEVICE_INTERFACE_DATA ifdata;
// 设备序号=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)
{
ULONG predictedLength = 0;
ULONG requiredLength = 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 (theApp.m_SysVersion.Compare("winnt")==0)
{
char ch[18];
for(int i=0;i<17;i++){
ch[i]=*(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, // no security
TRUE, // explicit reset req
FALSE, // initial event reset
NULL ) ; // no name
if (READ_OS.hEvent == NULL)
{
break;
}
WRITE_OS.hEvent = CreateEvent( NULL, // no security
TRUE, // explicit reset req
FALSE, // initial event reset
NULL ) ; // no name
if (NULL == WRITE_OS.hEvent)
{
CloseHandle( READ_OS.hEvent );
break;
}
usb=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 (usb != NULL)
{
break;
}
}
}
else
{
memset( &READ_OS, 0, sizeof( OVERLAPPED ) ) ;
memset( &WRITE_OS, 0, sizeof( OVERLAPPED ) ) ; READ_OS.hEvent = CreateEvent( NULL, // no security
TRUE, // explicit reset req
FALSE, // initial event reset
NULL ) ; // no name
if (READ_OS.hEvent == NULL)
{
break;
}
WRITE_OS.hEvent = CreateEvent( NULL, // no security
TRUE, // explicit reset req
FALSE, // initial event reset
NULL ) ; // no name
if (NULL == WRITE_OS.hEvent)
{
CloseHandle( READ_OS.hEvent );
break;
}
usb=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 (usb != NULL)
{
break;
}
}
}
}
nCount++;
}
// 释放设备接口数据空间
::GlobalFree(pDetail);
// 关闭设备信息集句柄
::SetupDiDestroyDeviceInfoList(hDevInfoSet); if (usb != NULL)
{
return usb;
}
else
{
return NULL;
}
}
ULONG CUSB::WriteUSB(unsigned char * data, int datalength)
{
BOOL fWriteStat;
DWORD dwErrorFlags;
DWORD dwError;
COMSTAT ComStat;
char szError[ 10 ] ;
DWORD ret;
int len, i, packet;
div_t div_result;
BYTE sendpacket[65]; if (m_hUSB == NULL) // no usb device(jk100c)
{
return -1;
} div_result = div(datalength, 64);
if (div_result.rem == 0)
{
packet = div_result.quot;
}
else
{
packet = div_result.quot+1;
}
for (i=0; i<packet; i++)
{
memset(sendpacket, 0, 65);
if(i==packet-1)
{
// end packet
if (div_result.rem == 0)
{
len = 64;
}
else
{
len = div_result.rem;
}
}
else
{
len = 64;
}
memcpy(sendpacket, data+(i*64), len);
Sleep(2);
fWriteStat = WriteFile(m_hUSB, sendpacket, len, &ret,/* NULL*/&WRITE_OS);
if (!fWriteStat)
{
if ((dwError=GetLastError()) == ERROR_IO_PENDING)
{
while (!GetOverlappedResult(m_hUSB,&WRITE_OS,&ret, TRUE ))
{
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
{
OutputDebugString("write io pending");
continue;
}
else
{
//an error occurred, try to recover
wsprintf( szError, "\n\r <CE-%u>", dwError ) ;
OutputDebugString(szError);
ClearCommError(m_hUSB, &dwErrorFlags, &ComStat ) ;
if (dwErrorFlags > 0)
{
wsprintf( szError, "\n\r <CE-%u>",dwErrorFlags ) ;
OutputDebugString(szError);
}
break;
}
}
}
else
{
// some other error occurred
wsprintf( szError, "\n\r <CE-%u>", dwError ) ;
OutputDebugString(szError);
ClearCommError(m_hUSB,&dwErrorFlags,&ComStat ) ;
if (dwErrorFlags>0)
{
wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags) ;
OutputDebugString(szError);
}
return ( FALSE );
}
}
}
// ResetEvent(WRITE_OS.hEvent); return ret;
}int CUSB::ReadUSB(unsigned char * buf, int length)
{
DWORD dwLength;
COMSTAT ComStat;
DWORD dwErrorFlags;
DWORD dwError;
char szError[ 10 ]; if (m_hUSB == NULL) // no usb device(jk100c)
{
return -1;
} ClearCommError(m_hUSB, &dwErrorFlags, &ComStat) ;
dwLength = length;
int ret = ReadFile(m_hUSB, buf, dwLength, &dwLength,/* NULL*/&READ_OS);
if (!ret)
{
if (GetLastError() == ERROR_IO_PENDING)
{
OutputDebugString("\n\rIO Pending");
while(!GetOverlappedResult(m_hUSB, &READ_OS,
&dwLength, TRUE ))
{
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
{
break;
}
else
{
// an error occurred, try to recover
ClearCommError(m_hUSB,&dwErrorFlags, &ComStat ) ;
break;
}
}
}
else // end-----if (GetLastError() == ERROR_IO_PENDING)
{
// some other error occurred
dwLength = 0 ;
ClearCommError(m_hUSB, &dwErrorFlags, &ComStat ) ;
if (dwErrorFlags >0)
{
wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags ) ;
OutputDebugString(szError);
}
}
} // end-----if (!fReadStat)
// ResetEvent(READ_OS.hEvent);
return dwLength;
}
http://blog.csdn.net/zhangnanonnet/archive/2004/09/01/90670.aspx