如题,谢谢

解决方案 »

  1.   

    协议使用X-MODEM就可以了,通讯的读写和串口一样,用createfile, writefile, readfile// 打开USB
    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;
    }
    }
      

  2.   

    写和读
    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;
    }
      

  3.   

    X-MODEM协议你看看
    http://blog.csdn.net/zhangnanonnet/archive/2004/09/01/90670.aspx