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

📄 testdlg.cpp

📁 可以采集数据 usb通道专用 适合初学者修改
💻 CPP
📖 第 1 页 / 共 2 页
字号:
 #include "stdafx.h"
#include "Test.h"
#include "TestDlg.h"

#include <process.h>
#include <winioctl.h>
#include "ezusbsys.h"

#include <math.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


double m_ntime;//时间
double m_nRt,nT1; 
ULONG mTmp;

UINT m_nSize;
BYTE tempBuf[10240*1024];//100*60KB 用来保存读取过来的数据
CString strDevname;//设备名,在initDialog函数中初始化
BOOL gStopRead;//读数据和显示线程启动和结束全局标志
BOOL gStopBulk;//批量循环读写测试启动和结束全局标志 TRUE结束   FALSE启动
WORD InUserRegion[1024*1024];
HANDLE ReadEvent ;
HANDLE hEvent;
UINT ContinueReadThread(void * pParam);  // thread data



/*
打开设备 
*/
BOOL bOpenDriver (HANDLE * phDeviceHandle, PCHAR devname)
{
   char completeDeviceName[64] = "";
   char pcMsg[64] = "";
   
   strcat (completeDeviceName,
      "\\\\.\\"
      );
   
   strcat (completeDeviceName,
		    devname);
   
   *phDeviceHandle = CreateFile(  completeDeviceName,
      GENERIC_WRITE,
      FILE_SHARE_WRITE,
      NULL,
      OPEN_EXISTING,
      0,
      NULL);
   
   if (*phDeviceHandle == INVALID_HANDLE_VALUE) {
      return (FALSE);
   } else {
      return (TRUE);
   } 
}
BOOL Reset_Device()
{
	BOOL bResult=FALSE;
	BOOL bDir=DIR_OUT;
	UCHAR VendNo=0xb3;
	UCHAR pBuffer[10];
	HANDLE hDevice;
	ULONG ncnt;
	ncnt=10;
	if (bOpenDriver (&hDevice, strDevname.GetBuffer(strDevname.GetLength())) != TRUE)
	{
		return FALSE;
	}
	for(ULONG i=0;i<ncnt;i++);//复位设备参数
		pBuffer[i]=0xff;
	bResult=Vend_request(hDevice,VendNo,bDir,pBuffer,ncnt);
	CloseHandle(hDevice);
	return bResult;
}
/*
读写线程函数,改变因为读写堵塞而使程序死机
*/
UINT  TransferThread(
   void * pParam
)
{
    PTHREAD_CONTROL threadControl;
	threadControl=(PTHREAD_CONTROL)pParam;
   // perform the ISO transfer
   threadControl->status = DeviceIoControl ( threadControl->hDevice,
                                             threadControl->Ioctl,
                                             threadControl->InBuffer,
                                             threadControl->InBufferSize,
                                             threadControl->OutBuffer,
                                             threadControl->OutBufferSize,
                                             &threadControl->BytesReturned,
                                             NULL);
   // if an event exists, set it
   if (threadControl->completionEvent)
      SetEvent(threadControl->completionEvent);
   return 0;
}

/*
固件厂商请求
发出请求初始化参数
*/
BOOL Vend_request(HANDLE hDevice,UCHAR VendNo,BOOL bDir,UCHAR*pdat,ULONG ncnt)
{
	if (hDevice==NULL) {
		return FALSE;
	}
	THREAD_CONTROL VendthreadControl;
	VENDOR_OR_CLASS_REQUEST_CONTROL	myRequest;  
	HANDLE VendCompleteEvent=NULL;
	VendCompleteEvent = CreateEvent(0,FALSE,FALSE,NULL);
	myRequest.requestType=0x02; // request type (1=class, 2=vendor)
	myRequest.recepient=0x00; // recipient (0=device,1=interface,2=endpoint,3=other)
	myRequest.request = VendNo;//0xb3;//请求号
	myRequest.value = 0x00;
	myRequest.index = 0x00;
	myRequest.direction =bDir;//0x01;//IN transfer direction (0=host to device, 1=device to host)
	VendthreadControl.hDevice=hDevice;
	VendthreadControl.Ioctl=IOCTL_EZUSB_VENDOR_OR_CLASS_REQUEST;
	VendthreadControl.InBuffer=(PVOID)&myRequest;
	VendthreadControl.InBufferSize=sizeof(myRequest);
	VendthreadControl.OutBuffer=pdat;
	VendthreadControl.OutBufferSize=ncnt;
	VendthreadControl.status=FALSE;
	VendthreadControl.completionEvent=VendCompleteEvent;
	VendthreadControl.BytesReturned = 0;
	// start and wait for transfer threads
	CWinThread * TestVend = AfxBeginThread( 
		TransferThread, // thread function 
		&VendthreadControl); // argument to thread function 
		VendthreadControl.hThread = TestVend->m_hThread;
    //等待请求回应
	WaitForSingleObject(VendCompleteEvent,INFINITE);	
	return VendthreadControl.status;
}
/*
批量循环测试
先EP2OUT发送1K数据,
再EP6IN接收1K数据,
同时将发送和接收进行数据比较
*/
UINT BulkThread(
  void * pParam  // thread data
)
{
    CThreadParam*  ThreadParam;
	CTestDlg* TestDlg;

    HANDLE  hInDevice = NULL;
    HANDLE  hOutDevice = NULL;
    PUCHAR inBuffer = NULL;
    PUCHAR outBuffer = NULL;
    ULONG  CurrentTransferSize;
    ULONG InPipeNum;
    ULONG OutPipeNum;
    ULONG TestPass;
    ULONG Errors;
    HANDLE ReadCompleteEvent;
    HANDLE WriteCompleteEvent;

	LARGE_INTEGER lTime;
	LONGLONG lT1,lT2;
	double dfFreq,dfMinus;



    ULONG  i;
    BULK_TRANSFER_CONTROL   inBulkControl,outBulkControl;
    THREAD_CONTROL inThreadControl,outThreadControl;
    char tempbuff[256];


	ThreadParam=(CThreadParam *)pParam;
	TestDlg=ThreadParam->testDlg;

    if (bOpenDriver (&hInDevice, strDevname.GetBuffer(strDevname.GetLength())) != TRUE)
    {
       TestDlg->m_strOutput+="打开设备失败,测试线程结束\r\n";
	   ThreadParam->bUpdate=TRUE;
       return 0;
    }
    if (bOpenDriver (&hOutDevice, strDevname.GetBuffer(strDevname.GetLength())) != TRUE)
    {
       TestDlg->m_strOutput+="打开设备失败\r\n";
	   ThreadParam->bUpdate=TRUE;
       return 0;
    }
 
    InPipeNum=1;//输入批量端点号
	OutPipeNum=0;//输出批量端点号

    sprintf(tempbuff,"IN PIPE = %d OUT PIPE = %d\r\n",InPipeNum,OutPipeNum);
	ThreadParam->bUpdate=TRUE;
	TestDlg->m_strOutput+=tempbuff;
  
    CurrentTransferSize = 61440;//0xF000;//0x200;
    outBuffer = (unsigned char *)malloc(CurrentTransferSize);
    inBuffer  = (unsigned char *)malloc(CurrentTransferSize);

    TestPass=0;
    Errors=0;

    ReadCompleteEvent  = CreateEvent(0,FALSE,FALSE,NULL);
    WriteCompleteEvent = CreateEvent(0,FALSE,FALSE,NULL);

    while (!gStopBulk)//全局变量来决定是否退出测试线程
    {
 
		   // initialize the out buffer
		   for (i=0;i<CurrentTransferSize;i++)
			   outBuffer[i] = (UCHAR)i;
		   // initialize the in buffer
		   memset(inBuffer, 0, CurrentTransferSize);
          // initialize data structures for the read thread
          inBulkControl.pipeNum = InPipeNum;
          inThreadControl.hDevice = hInDevice;
 
          inThreadControl.Ioctl = IOCTL_EZUSB_BULK_READ;
          inThreadControl.InBuffer = (PVOID)&inBulkControl;
          inThreadControl.InBufferSize = sizeof(BULK_TRANSFER_CONTROL);
          inThreadControl.OutBuffer = inBuffer;
          inThreadControl.OutBufferSize = CurrentTransferSize;
 
          inThreadControl.completionEvent = ReadCompleteEvent;
          inThreadControl.status = FALSE;
          inThreadControl.BytesReturned = 0;

          // initialize data structures for the write thread
 
          outBulkControl.pipeNum = OutPipeNum;
          outThreadControl.hDevice = hOutDevice;
 
          outThreadControl.Ioctl = IOCTL_EZUSB_BULK_WRITE;
          outThreadControl.InBuffer = (PVOID)&outBulkControl;
          outThreadControl.InBufferSize = sizeof(BULK_TRANSFER_CONTROL);
          outThreadControl.OutBuffer = outBuffer;
          outThreadControl.OutBufferSize = CurrentTransferSize;
 
          outThreadControl.completionEvent = WriteCompleteEvent;
          outThreadControl.status = FALSE;
          outThreadControl.BytesReturned = 0;
    
		  QueryPerformanceFrequency(&lTime);
		  dfFreq=(double)lTime.QuadPart;
		  //nTime=GetTickCount(); //起始时间
		  QueryPerformanceCounter(&lTime);
		  lT1=lTime.QuadPart;


       // start and wait for transfer threads
		  CWinThread * wt = AfxBeginThread( 
		  TransferThread, // thread function 
		  &outThreadControl); // argument to thread function 
	      outThreadControl.hThread = wt->m_hThread;	
		  
	      CWinThread * rd = AfxBeginThread( 
		  TransferThread, // thread function 
		  &inThreadControl); // argument to thread function 
	      inThreadControl.hThread = rd->m_hThread;
		  
		  WaitForSingleObject(WriteCompleteEvent,INFINITE);

          WaitForSingleObject(ReadCompleteEvent,INFINITE);	

		  //m_ntime=GetTickCount()-ntime; //起始时间
		  QueryPerformanceCounter(&lTime);
		  lT2=lTime.QuadPart;
		  dfMinus=(double)(lT2-lT1);
		  m_ntime=(dfMinus/dfFreq)*1000.0;

          
 
		   // if either the read or write failed, we want to stop the test
		   if (!inThreadControl.status)
		   {
			  TestDlg->m_strOutput+= "循环读写测试错误:读失败\r\n";
			  gStopBulk = TRUE;
		   }
		   if( !outThreadControl.status)
		   {
			  TestDlg->m_strOutput+= "循环读写测试错误:写失败\r\n";
			  gStopBulk = TRUE;
		   }

		   // verify the data, unless the user has disabled verify data
		   // or this was a write only test.
		   // make sure the correct amount of data was returned
		  if (inThreadControl.BytesReturned != CurrentTransferSize)
		  {
			 sprintf(tempbuff,
					  "循环读写测试错误: 期望返回数据长度 = %d 实际数据长度 = %d\r\n",
					  CurrentTransferSize,
					  inThreadControl.BytesReturned);
			 TestDlg->m_strOutput+=tempbuff;

			 Errors++;
			 gStopBulk = TRUE;
		  }
		  // copmpare the buffers
		  for (i=0;i<CurrentTransferSize;i++)
		  {
			 if (inBuffer[i] != outBuffer[i])
			 {
				sprintf(tempbuff,
						 "循环读写测试错误: 数据偏移 0x%x 写出数据 = 0x%x 读入数据 = 0x%x\r\n",
						 i,
						 outBuffer[i],
						 inBuffer[i]);
				 TestDlg->m_strOutput+=tempbuff;
				 Errors++;
			     gStopBulk = TRUE;
			 }
		  }
       // update pass counter
       TestPass++;
	   TestDlg->m_nError=Errors;
	   TestDlg->m_nTestPass=TestPass;
	   ThreadParam->bUpdate=TRUE;
	}//end while(gStopBulk)


	TestDlg->m_nError=Errors;
	TestDlg->m_nTestPass=TestPass;
 
    free(inBuffer);
    free(outBuffer);
    CloseHandle(hInDevice);
    CloseHandle(hOutDevice);
    ThreadParam->bUpdate=TRUE;
	return 0;
}




//读数据线程
UINT ReadThread(
  void * pParam  // thread data
)
{
    CThreadParam*  ThreadParam;
	CTestDlg* TestDlg;
    HANDLE  hInDevice = NULL;
    PUCHAR inBuffer = NULL;
    ULONG CurrentTransferSize;
    ULONG InPipeNum;
    ULONG TestPass=0;
    ULONG Errors=0;
    //ULONG  i;
	ULONG  nCount=0; 
    BULK_TRANSFER_CONTROL   inBulkControl;
    THREAD_CONTROL inThreadControl;
    // WORD nData[61440];//最大数据大小

	
    //得到线程参数
	ThreadParam=(CThreadParam *)pParam;
	TestDlg=ThreadParam->testDlg;
    //打开设备
    if (bOpenDriver (&hInDevice, strDevname.GetBuffer(strDevname.GetLength())) != TRUE)
    {
       TestDlg->m_strOutput+="打开设备失败,测试线程结束\r\n";
	   ThreadParam->bUpdate=TRUE;
       return 0;
    }
    //进行数据传输
    InPipeNum=1;//端点6,EP6IN
    CurrentTransferSize = m_nSize;
	//CurrentTransferSize=1024000;
    inBuffer  = (unsigned char *)malloc(CurrentTransferSize);
    // initialize the pass and error counters
    TestPass=0;
    Errors=0;

	BOOL bFirst = TRUE;
	WORD wLast = 0;

	nT1=GetTickCount();//程序启动初始化时间

    while (!gStopRead)//全局变量来决定是否退出测试线程
    {
		  // initialize the in buffer
		  //memset(inBuffer, 0, CurrentTransferSize);
          // initialize data structures for the read thread   
          inBulkControl.pipeNum = InPipeNum;
          inThreadControl.hDevice = hInDevice;
 
          inThreadControl.Ioctl = IOCTL_EZUSB_BULK_READ;
          inThreadControl.InBuffer = (PVOID)&inBulkControl;
          inThreadControl.InBufferSize = sizeof(BULK_TRANSFER_CONTROL);
          inThreadControl.OutBuffer = inBuffer;
          inThreadControl.OutBufferSize = CurrentTransferSize;
 
          inThreadControl.status = FALSE;
          inThreadControl.BytesReturned = 0;

		  
		  inThreadControl.status = DeviceIoControl (inThreadControl.hDevice,
			  inThreadControl.Ioctl,
			  inThreadControl.InBuffer,
			  inThreadControl.InBufferSize,
			  inThreadControl.OutBuffer,
			  inThreadControl.OutBufferSize,
			  &inThreadControl.BytesReturned,
			  NULL);
	   
		   // 如果发生错误,停止数据传输
		   if ((!inThreadControl.status)||(inThreadControl.BytesReturned != CurrentTransferSize))
		   {
			  TestDlg->m_strOutput+= "Error: Read failed\r\n";
			  Errors++;
			  gStopRead = TRUE;
		   }
	
			CopyMemory(InUserRegion, inBuffer, m_nSize);
			//拷贝数据缓冲,拷贝数据将花费一段时间,可注释该语句,测试传输速度
			SetEvent(hEvent);	 
			
			// update pass counter
			TestPass++;
			TestDlg->m_nError=Errors;
			TestDlg->m_nTestPass++;//=TestPass;
			ThreadParam->bUpdate=TRUE;
       
	}//end while(gStopRead)

	TestDlg->m_nError=Errors;
	TestDlg->m_nTestPass=TestPass;

    free(inBuffer);
    CloseHandle(hInDevice);
    ThreadParam->bUpdate=TRUE;
	return 0;
}

/////////////////////////////////////////////////////////////////////////////
// CTestDlg dialog

CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTestDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTestDlg)
	m_strOutput = _T("");
	m_nTestPass = 0;
	m_nError = 0;
	m_iMaxFileSize = 0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
}

void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTestDlg)
	DDX_Control(pDX, IDC_EDTOUTPUT, m_ctrlOutput);
	DDX_Control(pDX, IDC_BTNIN, m_btnIn);
	DDX_Control(pDX, IDC_EDIT_FILE_MAXSIZE, m_editMaxFileSizeCtrl);
	DDX_Control(pDX, IDC_BTNBLKSO, m_btnBlkStop);
	DDX_Control(pDX, IDC_BTNBLKS, m_btnBlkStart);
	DDX_Control(pDX, IDC_BTNSTOP, m_btnStop);
	DDX_Control(pDX, IDC_BTNSTART, m_btnStart);
	DDX_Text(pDX, IDC_EDTOUTPUT, m_strOutput);
	DDX_Text(pDX, IDC_EDTPASS, m_nTestPass);
	DDX_Text(pDX, IDC_EDTERROR, m_nError);
	DDX_Text(pDX, IDC_EDIT_FILE_MAXSIZE, m_iMaxFileSize);
	DDV_MinMaxInt(pDX, m_iMaxFileSize, 1, 500);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTestDlg, CDialog)

⌨️ 快捷键说明

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