至今的工作中,有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;