USB上位機通信:CyAPI


至今的工作中,有USB接口通信的需求,記錄一下。

建立一個USB設備對象

CCyUSBDevice *USBDevice = new CCyUSBDev(Handle);

打開USB設備

  • 一個USB設備

USBDevice->open(0) //
  • 若干個

if (USBDevice->DeviceCount())   //保證至少有一個USB設備連接
{
  for (i = 0; i < USBDevice->DeviceCount(); i++) //枚舉所有USB設備
   {
    USBDevice
->Open(i); //     m_DeviceListComBox.AddString(USBDevice->DeviceName); //所選擇的當前設備名   }
}

端點設置

int epts = USBDevice->EndPointCount();//獲取端點
CCyUSBEndPoint *endpt;//定義端點指針

for (i=1; i<epts; i++)
{
  endpt = USBDevice->EndPoints[i]; //EndPoints-端點列表,最大16.EndPoints[0]指向控制端點( CCyControlEndPoint)
  //未使用的端點設置為NULL

  if (endpt->Attributes == 2) 
  {
    sprintf(s, "0x%02X", endpt->Address);

    if (endpt->Address & 0x80) //Address--判斷傳輸方向in or out 0x8_-in;0x0_-out
    {
      m_InEndptComBox.AddString(s); //最高位為8,in端點,添加到in組合框
      m_InEndptComBox.SetItemData(m_InEndptComBox.GetCount()-1,i);
    }
    else
    {
      m_OutEndptComBox.AddString(s); //否則,最高位為0,out端點,添加到out組合框
      m_OutEndptComBox.SetItemData(m_OutEndptComBox.GetCount()-1,i);
    }
  }
}

CCyUSBDevice *USBDevice =new CCyUSBDevice(m_hWnd); //USB設備

USBDevice->Open(0); //打開0號設備,

CCyUSBEndPoint *endpt = USBDevice->EndPointOf(0X82); //使用端點2,in傳輸

 

傳輸

  • out控制傳輸發送vendor命令
  • in控制傳輸發送vendor命令
  • 簡易命令:Write(out傳輸)和Read(in傳輸)
  • bulk傳輸:

調用三個函數BeginDataXfer,WaitForXfer,FinishDataXfer。BeginDataXfer發起異步傳輸,BeginDataXfer並不等待,而是直接開始下一次傳輸;

由FinishDataXfer來寫內存,將讀到的數寫到緩沖區indata中。

if (USBDevice->IsOpen()) {
    bLooping = true; //線程循環標志
    XferThread = AfxBeginThread(XferLoop, this); //啟動線程
}
bool success;
dlg->InEndpt->TimeOut = 120;

for (;dlg->bLooping;) {       //線程循環,
   LONG inlen ;
   inlen = 512;
   UCHAR *inContext = dlg->InEndpt>BeginDataXfer(inData,inlen,&inOvLap);
  
    dlg->InEndpt->WaitForXfer(&inOvLap,TimeOut); 
    success = dlg->InEndpt->FinishDataXfer(inData,inlen, &inOvLap,inContext);
     if (!success) {
        dlg->bLooping = false;
    }
}    

注意要釋放對象

CloseHandle(inOvLap.hEvent);
delete [] inData;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM