⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 liuqiuliangview.cpp

📁 这是一整套USB2.0试验程序
💻 CPP
字号:
// liuqiuliangView.cpp : implementation of the CLiuqiuliangView class
//

#include "stdafx.h"
#include "liuqiuliang.h"

#include "liuqiuliangDoc.h"
#include "liuqiuliangView.h"

#include "CyAPI.h"
#include "cyioctl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//
CCyControlEndPoint  *ept;		//定义控制端点
CFile mFile;					//文件

UINT ReadThreadLoop( LPVOID params ) {	//线程处理
	bool okin;
	CLiuqiuliangView* pView;
	pView = (CLiuqiuliangView*)params;
	OVERLAPPED inOvLap;

	LONG inlen=1024;
	PUCHAR inData = new UCHAR[1024];		//数据缓冲区
	unsigned short* nData =new unsigned short[512];
	ZeroMemory(inData,sizeof(UCHAR)*inlen);
	inOvLap.hEvent   = CreateEvent(NULL, false, false, "CYUSB_IN"); 

//	ept->TimeOut = 0;
	int epCnt=pView->USBDevice->EndPointCount();

	pView->InEndpt=pView->USBDevice->EndPoints[1];
	pView->InEndpt->TimeOut = 1000;
	for (;pView->ReadThreadLooping ;)		//循环
	{
		
		okin = pView->InEndpt-> XferData(inData,inlen);
		int j =0;
		for(int i=0;i<512;i++)
		{
			nData[i] = inData[j];
			j++;
			nData[i] += inData[j]<<8;
			j++;
		}
		//异步读数据
//		UCHAR  *inContext = ept->BeginDataXfer(inData,inlen,&inOvLap);
//		ept->WaitForXfer(&inOvLap,200);
//		okin = ept->FinishDataXfer(inData,inlen, &inOvLap,inContext);
		if (okin)						//如果读取成功,则保存数据
		{
//			mFile.SeekToEnd();
//			mFile.Write(inData,inlen);
			
			pView->m_pCanvas->DrawBack(RGB(0,0,0));
			pView->m_pCanvas->DrawXGrid(RGB(255,255,255),10);
			pView->m_pCanvas->DrawYGrid(RGB(255,255,255),10);
//			pView->InvalidateRect(&pView->m_rcDraw,FALSE);
			
			pView->m_pCanvas->SetXRange(0, 512);
			pView->m_pCanvas->SetYRange(0, 65536);
			pView->m_pCanvas->DrawPoly(nData,512, RGB(255,255,0), 0);
			pView->InvalidateRect(&pView->m_rcDraw,FALSE);
//			pView->UpdateData(FALSE);
		}

	
	} 
	//结束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;
	delete [] nData;
	delete buf;
	pView->ReadThread = NULL;				//线程结束
	
    pView->USBDevice->Close();			//关闭USB设备
	
//	mFile.Flush();						//关闭文件
//	mFile.Close();
	
	return true;
}

/////////////////////////////////////////////////////////////////////////////
// CLiuqiuliangView

IMPLEMENT_DYNCREATE(CLiuqiuliangView, CFormView)

BEGIN_MESSAGE_MAP(CLiuqiuliangView, CFormView)
	//{{AFX_MSG_MAP(CLiuqiuliangView)
	ON_BN_CLICKED(IDC_BUTTON_DRAW, OnButtonDraw)
	ON_BN_CLICKED(IDC_BUTTON_SAVE, OnButtonSave)
	ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnButtonClear)
	ON_BN_CLICKED(IDC_BUTTON_SENDDATA, OnButtonSenddata)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLiuqiuliangView construction/destruction

CLiuqiuliangView::CLiuqiuliangView()
	: CFormView(CLiuqiuliangView::IDD)
{
	//{{AFX_DATA_INIT(CLiuqiuliangView)
	m_nData = 0;
	m_nCounter = 0;
	//}}AFX_DATA_INIT
	// TODO: add construction code here
	m_pCanvas = new CCoordinate();
	DataArray = new unsigned char[512];
}

CLiuqiuliangView::~CLiuqiuliangView()
{
	USBDevice->Close();		//关闭USB设备

	delete m_pCanvas;
	delete DataArray;
}

void CLiuqiuliangView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CLiuqiuliangView)
	DDX_Control(pDX, IDC_EDIT_DATACOUNTER, m_editCounter);
	DDX_Control(pDX, IDC_EDIT_DATA, m_editData);
	DDX_Text(pDX, IDC_EDIT_DATA, m_nData);
	DDX_Text(pDX, IDC_EDIT_DATACOUNTER, m_nCounter);
	//}}AFX_DATA_MAP
}

BOOL CLiuqiuliangView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CFormView::PreCreateWindow(cs);
}

void CLiuqiuliangView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();

	
	
	
/*	((CWnd *)GetDlgItem(IDC_PICTURE))->GetWindowRect(&m_rcDraw);
	ScreenToClient(&m_rcDraw);
	
	m_pCanvas->InitRect(&m_rcDraw);
	
	m_pCanvas->DrawBack(RGB(0,0,0));//pDoc->waveBkColor);
	m_pCanvas->DrawXGrid(RGB(255,255,255),0);
	m_pCanvas->DrawYGrid(RGB(255,255,255),0);*/

	((CWnd *)GetDlgItem(IDC_PICTURE))->GetWindowRect(&m_rcDraw);
	ScreenToClient(&m_rcDraw);
	m_rcDraw.left += 5;
	m_rcDraw.right -=5;
	m_rcDraw.top += 5;
	m_rcDraw.bottom -= 5;
	m_pCanvas->InitRect(&m_rcDraw);
	m_pCanvas->DrawBack(RGB(0,0,0));
	m_pCanvas->DrawXGrid(RGB(255,255,255),10);
	m_pCanvas->DrawYGrid(RGB(255,255,255),10);

	m_nData = 0;
	m_nCounter = 0;
	UpdateData(FALSE);

	m_editData.SetWindowText("");
	m_editData.SetFocus();
	m_editCounter.SetReadOnly(TRUE);

	ReadThread=NULL;
	USBDevice = new CCyUSBDevice(m_hWnd);	//USB设备
	ept = USBDevice->ControlEndPt;			//USB控制端点
	
	m_bStart = FALSE;

	OutEndpt=USBDevice->EndPoints[2];
	OutEndpt->TimeOut = 1000;
}

/////////////////////////////////////////////////////////////////////////////
// CLiuqiuliangView printing

BOOL CLiuqiuliangView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CLiuqiuliangView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CLiuqiuliangView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

void CLiuqiuliangView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
{
	// TODO: add customized printing code here
}

/////////////////////////////////////////////////////////////////////////////
// CLiuqiuliangView diagnostics

#ifdef _DEBUG
void CLiuqiuliangView::AssertValid() const
{
	CFormView::AssertValid();
}

void CLiuqiuliangView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}

CLiuqiuliangDoc* CLiuqiuliangView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLiuqiuliangDoc)));
	return (CLiuqiuliangDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CLiuqiuliangView message handlers

void CLiuqiuliangView::OnButtonDraw() 
{
	// TODO: Add your control notification handler code here
/*	if(m_nCounter>1)
	{
		int max = -10000;//求出输入数据的最大值
		int min = 10000;
		for(int i =0;i<m_nCounter;i++)
		{
			if(DataArray[i]>max)
				max = DataArray[i];
			if(DataArray[i]<min)
				min = DataArray[i];
			
		}
		m_pCanvas->SetXRange(0, m_nCounter);
		m_pCanvas->SetYRange(min, max);
		m_pCanvas->DrawPoly(DataArray, m_nCounter, RGB(255,255,0), 0);
		InvalidateRect(&m_rcDraw,FALSE);
		m_nCounter = 0; 
		UpdateData(FALSE);
		m_editData.SetWindowText("");
	}*/
	m_bStart = !m_bStart;
	if(m_bStart)
	{
		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]=0x01;				//启动Start
		
		ept->XferData(buf,buflen);  //自定义数据传输
		delete buf;
	}
	else
	{
		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);
		delete buf;
	}
	
	
//	mFile.Open("FileRecevieTest.txt",CFile::modeWrite|CFile::modeCreate);
	//打开文件
//	mFile.SetLength(0);			//文件清空
}

void CLiuqiuliangView::OnButtonSave() 
{
	// TODO: Add your control notification handler code here
	if(USBDevice->IsOpen())			//USB是否打开
		SetDlgItemText(IDC_STATIC,"USB设备已经连接!");
	else
		SetDlgItemText(IDC_STATIC,"未连接USB设备!");
	
	int vID,pID;
	CString str;
	vID=USBDevice->VendorID;		//读取VID
	pID=USBDevice->ProductID;		//读取PID
	str.Format("VendorID=0x%x",vID);
	SetDlgItemText(IDC_STATIC1,str);
	str.Format("ProductID=0x%x",pID);
	SetDlgItemText(IDC_STATIC2,str);
	
	PCHAR dn=new CHAR[256];
	dn=USBDevice->DeviceName;		//读取设备名称
	str.Format("设备名称:%s",dn);
	SetDlgItemText(IDC_STATIC3,str);
}

/*void CLiuqiuliangView::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	CWnd* pWnd=GetDlgItem(IDC_PICTURE);
	CDC* pControlDC = pWnd->GetDC();
	//	pWnd->Invalidate();
	//	pWnd->UpdateWindow();
	//	pControlDC->SelectStockObject(WHITE_BRUSH);
	//	pControlDC->Rectangle(0,0,10,10);
	DisplayCanvas(pControlDC);
	pWnd->ReleaseDC(pControlDC);
	// Do not call CFormView::OnPaint() for painting messages
}*/
void CLiuqiuliangView::DisplayCanvas(CDC* pDC)
{
	m_pCanvas->BitBlt(pDC,&m_rcDraw);		
}

void CLiuqiuliangView::OnDraw(CDC* pDC) 
{
	// TODO: Add your specialized code here and/or call the base class
	DisplayCanvas(pDC);
}



void CLiuqiuliangView::OnButtonClear() 
{
	// TODO: Add your control notification handler code here
/*	m_pCanvas->DrawBack(RGB(0,0,0));
	m_pCanvas->DrawXGrid(RGB(255,255,255),10);
	m_pCanvas->DrawYGrid(RGB(255,255,255),10);
	InvalidateRect(&m_rcDraw,FALSE);*/
	if (ReadThread)
	{
		ReadThreadLooping = false;
		ReadThread=NULL;					//线程结束
		SetDlgItemText(IDC_EDIT1,"传输完毕!");
	} 
	else 
	{
		if (USBDevice->IsOpen()) {			//检测USB是否打开
			ReadThreadLooping = true;
			ReadThread = AfxBeginThread(ReadThreadLoop, this);	//开启线程
			SetDlgItemText(IDC_EDIT1,"正在传输!");
		}
	}
}

void CLiuqiuliangView::OnButtonSenddata() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	char bytes=m_nData;
	long len =512;
	for(int i=0;i<len;i++)
		DataArray[i]=bytes;
	bool okout = OutEndpt->XferData(DataArray,len);
	if(okout)
		MessageBox("ok");
	else
		MessageBox("out failed");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -