15,471
社区成员
发帖
与我相关
我的任务
分享
UINT ReadThreadLoop( LPVOID params ) { //线程处理
bool okin;
CMySampleDlg *dlg = (CMySampleDlg *) params;
OVERLAPPED inOvLap; //是一个包含了用于异步输入输出的信息的结构体
PUCHAR inData = new UCHAR[512]; //数据缓冲区
ZeroMemory(inData,1024); //ZeroMemory用0填充一片内存,第一个参数是起始地址,第二个参数是长度
inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN");
dlg->InEndpt->TimeOut = 0;
for (;dlg->ReadThreadLooping ;) //循环
{
LONG inlen=512;
//异步读数据
UCHAR *inContext = dlg->InEndpt->BeginDataXfer(inData,inlen,&inOvLap);
dlg->InEndpt->WaitForXfer(&inOvLap,200);
okin = dlg->InEndpt->FinishDataXfer(inData,inlen, &inOvLap,inContext);
if (okin) //如果读取成功,则保存数据
{
mFile.SeekToEnd();
mFile.Write(inData,inlen);
}
}
//结束Start
ept->Target = TGT_DEVICE;
ept->ReqType = REQ_VENDOR;
ept->Direction = DIR_TO_DEVICE;
ept->ReqCode = 0xAB; //请求码
ept->Value = 0;
ept->Index = 0;
PUCHAR buf=new UCHAR[2];
ZeroMemory(buf, 2);
LONG buflen = 2;
buf[0]=0xAB;
buf[1]=0x00; //结束Start
ept->XferData(buf,buflen);
CloseHandle(inOvLap.hEvent);
delete [] inData;
dlg->ReadThread = NULL; //线程结束
dlg->USBDevice->Close(); //关闭USB设备
mFile.Flush(); //关闭文件
mFile.Close();
return true;
}
void CMySampleDlg::OnButton4()
{
// TODO: Add your control notification handler code here
if (ReadThread)
{
ReadThreadLooping = false;
ReadThread=NULL; //线程结束
SetDlgItemText(IDC_EDIT2,"传输完毕!");
}
else
{
if (USBDevice->IsOpen()) { //检测USB是否打开
ReadThreadLooping = true;
ReadThread = AfxBeginThread(ReadThreadLoop, this); //开启线程
SetDlgItemText(IDC_EDIT2,"正在传输!");
}
}
}
CMySampleDlg(CWnd* pParent = NULL); // standard constructor
CCyUSBDevice *USBDevice;
CWinThread *ReadThread;
CCyUSBEndPoint *InEndpt;
BOOL ReadThreadLooping;
CMySampleDlg(CWnd* pParent = NULL); // standard constructor
CCyUSBDevice *USBDevice;
CWinThread *ReadThread;
CCyUSBEndPoint *InEndpt;
BOOL ReadThreadLooping;