(1)USB连接
1.首先要建立一个USB设备对象,
CCyUSBDevice *USBDevice = new CCyUSBDev(Handle);
Handle是USB所关联对象的句柄,一般在MFC中直接就是m_hwnd。
2.然后就该是打开USB设备了,可以用到两个函数open();isopen()
这两个都可以用来打开USB设备,isopen()还可以判断能否获得USB设备句柄
一般来说,如果只有一个USB设备连接,可以这样打开:
USBDevice->open(0) //打开0号USB设备
如果要判断,可以:
if(! USBDevice->open(0)) //打开失败
{messagebox("USB未连接");}
如果连接有多个USB设备,那么可以枚举所有的USB,用到DeviceCount()函数;执行USBDevice->DeviceCount()后,返回所连接的USB设备个数:
if (USBDevice->DeviceCount()) //保证至少有一个USB设备连接
{
for (i = 0; i < USBDevice->DeviceCount(); i++) //枚举所有USB设备
{
USBDevice->Open(i); //打开第i号USB设备
m_DeviceListComBox.AddString(USBDevice->DeviceName);//所选择的当前设备名
}
}
(2)其他USB属性获取
获取USB其他属性,这里列出经常使用的几个,具体的可参考cyapi的文档,在CCyUSBDevice和CCyUSBEndPoint这两个类里可查询到。
USBDevice->DeviceCount() //返回连接到电脑的USB设备个数,从0,1,2.。开始命名
USBDevice->DeviceName() //返回USB设备名称,也就是固件中StringDscr2: 字段字符串
USBDevice->VendorID //返回USB设备VID
USBDevice->ProductID //返回USB设备PID
(3)bulk传输
线程中的处理,在这里上位机用异步接收,创建异步事件:
OVERLAPPED inOvLap;
inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN");
LONG inlen ;
inlen = 512;
UCHAR *inContext = dlg->InEndpt->BeginDataXfer(inData,inlen,&inOvLap);
dlg->InEndpt->WaitForXfer(&inOvLap,TimeOut);
dlg->InEndpt->FinishDataXfer(inData,inlen, &inOvLap,inContext);
主要是三步,调用三个函数BeginDataXfer,WaitForXfer,FinishDataXfer。按照手册上说的,BeginDataXfer发起异步传输,并且立即返回。也就是说,发起此次的inlen后,并不会等inlen传输完,而是立即开始下一次inlen字节传输;WaitForXfer,异步传输最大等待时间;FinishDataXfer,到这里才开始真正的写内存,将读到的数写到缓冲区indata中。
(BeginDataXfer是非阻塞式的传输,也就是调用以后马上返回。只到WaitForXfer得到传输完成信号后,FinishDataXfer才真正的开始写数据。非阻塞式的传输的好处是不用阻塞其他操作的运行,在这里BeginDataXfer(inbuf,bc,&inOvLap); 开始读取bc个数据到inbuf里,当调用FinishDataXfer(inbuf,bc,&inOvLap,inContext); 时,数据才真正被写到inbuf里,同样对于outbuf也是一样的)
最后,完了别忘记释放对象:
CloseHandle(inOvLap.hEvent);
delete [] inData;