写数据的步骤:
1、打开设备:USBDevice->Open(DeviceIndex);
2、获得USB批量传输的断点:OutEndpt = USBDevice->EndPoints;
3、确定设备打开则创建线程函数:AfxBeginThread(XferLoopw, this);
4、打开事件对象:outOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_OUT");
5、开启异步传输并完成数据的传输:BeginDataXfer(data,outlen,&outOvLap);
WaitForXfer(&outOvLap,500);
FinishDataXfer(data, outlen, &outOvLap,outContext);
6、关闭设备:
CloseHandle(outOvLap.hEvent);
delete [] data;
7、注释开始传输的几句语句:
BeginDataXfer是非阻塞式的传输,也就是调用以后马上返回。
只到WaitForXfer得到传输完成信号后,FinishDataXfer才真正的开始写数据。
非阻塞式的传输的好处是不用阻塞其他操作的运行,在这里BeginDataXfer(inbuf,bc,&inOvLap);
开始读取bc个数据到inbuf里,当调用FinishDataXfer(inbuf,bc,&inOvLap,inContext); 时,数据才真正被写到inbuf里,同样对于outbuf也是一样的。
代码的流程就是
UCHAR *inContext = USBDevice->BulkInEndPt->BeginDataXfer(inbuf,bc,&inOvLap);
//开始接收数据到
UCHAR *outContext = USBDevice->BulkOutEndPt->BeginDataXfer
(outbuf,bc,&outOvLap);
//开始发送数据到
USBDevice->BulkOutEndPt->WaitForXfer(&outOvLap,100);
//等待发送完成
USBDevice->BulkInEndPt->WaitForXfer(&inOvLap,100);
//等待接收完成
Success = USBDevice->BulkOutEndPt->FinishDataXfer(outbuf,bc,&outOvLap,outContext);
//这里才真正将outbuf里的数据发送出
Success = USBDevice->BulkInEndPt->FinishDataXfer(inbuf,bc,&inOvLap,inContext);
//这里才真正将接收到的数据存储到inbuf里
CloseHandle(outOvLap.hEvent);
CloseHandle(inOvLap.hEvent);
//关闭句柄,释放资源
8、
刚看到了一个关于overlapped的解释,很经典,就放这了。
OVERLAPPED结构主要在一些重叠IO等异步操作中起作用。
即:你需要操作系统传递一批数据,于是填了一个overlapped的订单,订单上写着从哪里(数据的偏移位置)开始传输,于是你去干别的事去了。系统完成传输就打个电话(激活hEvent)叫你验收,你看到overlapped订单上系统写着的传输的数据数量验收接收的数据
1、打开设备:USBDevice->Open(DeviceIndex);
2、获得USB批量传输的断点:OutEndpt = USBDevice->EndPoints;
3、确定设备打开则创建线程函数:AfxBeginThread(XferLoopw, this);
4、打开事件对象:outOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_OUT");
5、开启异步传输并完成数据的传输:BeginDataXfer(data,outlen,&outOvLap);
WaitForXfer(&outOvLap,500);
FinishDataXfer(data, outlen, &outOvLap,outContext);
6、关闭设备:
CloseHandle(outOvLap.hEvent);
delete [] data;
7、注释开始传输的几句语句:
BeginDataXfer是非阻塞式的传输,也就是调用以后马上返回。
只到WaitForXfer得到传输完成信号后,FinishDataXfer才真正的开始写数据。
非阻塞式的传输的好处是不用阻塞其他操作的运行,在这里BeginDataXfer(inbuf,bc,&inOvLap);
开始读取bc个数据到inbuf里,当调用FinishDataXfer(inbuf,bc,&inOvLap,inContext); 时,数据才真正被写到inbuf里,同样对于outbuf也是一样的。
代码的流程就是
UCHAR *inContext = USBDevice->BulkInEndPt->BeginDataXfer(inbuf,bc,&inOvLap);
//开始接收数据到
UCHAR *outContext = USBDevice->BulkOutEndPt->BeginDataXfer
(outbuf,bc,&outOvLap);
//开始发送数据到
USBDevice->BulkOutEndPt->WaitForXfer(&outOvLap,100);
//等待发送完成
USBDevice->BulkInEndPt->WaitForXfer(&inOvLap,100);
//等待接收完成
Success = USBDevice->BulkOutEndPt->FinishDataXfer(outbuf,bc,&outOvLap,outContext);
//这里才真正将outbuf里的数据发送出
Success = USBDevice->BulkInEndPt->FinishDataXfer(inbuf,bc,&inOvLap,inContext);
//这里才真正将接收到的数据存储到inbuf里
CloseHandle(outOvLap.hEvent);
CloseHandle(inOvLap.hEvent);
//关闭句柄,释放资源
8、
OVERLAPPED结构是什么意思
OVERLAPPED结构类型声明如下:
typedef struct _OVERLAPPED { ULONG_PTR Internal; //操作系统保留,指出一个和系统相关的状态 ULONG_PTR InternalHigh; //指出发送或接收的数据长度 union { struct { DWORD Offset; //文件传送的开始位置 DWORD OffsetHigh; //文件传送的字节偏移量的高位字 }; PVOID Pointer; //指针,指向文件传送位置 }; HANDLE hEvent; //指定一个I/O操作完成后触发的事件 } OVERLAPPED, *LPOVERLAPPED;
刚看到了一个关于overlapped的解释,很经典,就放这了。
OVERLAPPED结构主要在一些重叠IO等异步操作中起作用。
即:你需要操作系统传递一批数据,于是填了一个overlapped的订单,订单上写着从哪里(数据的偏移位置)开始传输,于是你去干别的事去了。系统完成传输就打个电话(激活hEvent)叫你验收,你看到overlapped订单上系统写着的传输的数据数量验收接收的数据