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

📄 testusbcedlg.cpp

📁 EVC 下 USB 通信测试程序
💻 CPP
字号:
// TestUsbCeDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TestUsbCe.h"
#include "TestUsbCeDlg.h"
#include "Public.h"

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

/////////////////////////////////////////////////////////////////////////////
// CTestUsbCeDlg dialog
bool bconnectState = FALSE;   //网络连接状态
const	int deviceCode=20080810;
const	int USB_BUF_LEN = 16384;
BYTE *pFileData = new BYTE[USB_BUF_LEN];
BYTE  *pUSBBuf = new BYTE[USB_BUF_LEN];

CTestUsbCeDlg::CTestUsbCeDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTestUsbCeDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTestUsbCeDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	m_pReadProc = NULL;
}

void CTestUsbCeDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTestUsbCeDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTestUsbCeDlg, CDialog)
	//{{AFX_MSG_MAP(CTestUsbCeDlg)
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestUsbCeDlg message handlers

HANDLE g_hUsbDev = NULL;
BOOL g_exit = FALSE;

#define BUFLEN 512

//------------------------------------------------
// Command define
// Run: 0xfe, 0xfe, 0xfe
// Exit: 0xff, 0xff, 0xff
//------------------------------------------------

BOOL WriteUsb(BYTE* data, int len)
{

	DWORD dwRet = 0;
	BOOL bRet = WriteFile(g_hUsbDev, data, BUFLEN, &dwRet, NULL);	

	if( bRet && dwRet )
		return TRUE;
	else
		return FALSE;
}
  

UINT ReadProc(LPVOID param)
{
	CTestUsbCeDlg* pDlg = (CTestUsbCeDlg*)param;

	DWORD dwLen = 1024;
	DWORD dwRet = 0;
	int len=0;
		len=100;
	while( !g_exit )
	{   
		
		BOOL bRet = ReadFile(g_hUsbDev, pUSBBuf, BUFLEN, &dwRet, NULL);

		if( bRet )
		{   			
			TRACE(_T("Call Back OnRead!\r\n"));
			if(pUSBBuf[0] != 0x68 ) //非正常数据包|| buf[len-1] != 0x16
			{
				;//return 0;
			}
			CString timeStr;
			CTime   thetime   =   CTime::GetCurrentTime();	
			timeStr.Format(_T("C:%2X_L:%d %02d:%02d"),pUSBBuf[6],dwLen,
				thetime.GetMinute(),thetime.GetSecond());
			//pDlg->SetDlgItemText(IDC_STA_TIME,timeStr);
			switch(pUSBBuf[6])
			{
			case 0x01: 
				  //pDlg->SetConnUsbState();
				  pDlg->UsbCommand(0x01,8);
				break;
			case 0x32:
				pDlg->m_intFileSerialNum= pUSBBuf[7];
				pDlg->UsbCommand(0x32,11);
				break;
			case 0x33:  
				pDlg->SaveApplication(pUSBBuf,dwLen);
				break;
			case 0x34:
				pDlg->RenewApplication(pUSBBuf,dwLen);
				break;
			case 0x60:
				
				break;
			default:
				break;
			}
		}		
	}

	return 10;
}

BOOL CTestUsbCeDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	CenterWindow(GetDesktopWindow());	// center to the hpc screen
	
	// 界面设置
	MoveWindow(0,0,320,240);
	SetCursorPos(320,240);
	// TODO: Add extra initialization here
	DirectoryCheck(DIR_PATH + _T("\\APPLICATION"),TRUE);
	DirectoryCheck(DIR_PATH + _T("\\SYSTEM"),TRUE);

	g_hUsbDev = CreateFile(
						_T("RUB1:"), 				//LPCTSTR lpFileName, 
						GENERIC_READ|GENERIC_WRITE, //DWORD dwDesiredAccess, 
						0,							//DWORD dwShareMode, 
						NULL, 						//LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
						OPEN_EXISTING, 				//DWORD dwCreationDispostion, 
						FILE_ATTRIBUTE_NORMAL, 		//DWORD dwFlagsAndAttributes, 
						NULL 						//HANDLE hTemplateFile
						); 
	if( g_hUsbDev == INVALID_HANDLE_VALUE )
	{
		g_hUsbDev = NULL;
		TRACE(_T("Open usb device error.\n"));
		return FALSE;
	}
	
	m_pReadProc = AfxBeginThread(ReadProc, this);
	if( m_pReadProc == NULL )
	{
		AfxMessageBox(_T("AfxBeginThread error"));
		return FALSE;
	}
	else
	{
		TRACE(_T("AfxBeginThread succeed.\n"));
	}

	BYTE cmd[3] = { 0xfe, 0xfe, 0xfe };
	WriteUsb(cmd, 3);
	SetTimer(1,1000,NULL);
	return TRUE;  // return TRUE  unless you set the focus to a control
}



void CTestUsbCeDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	g_exit = TRUE;

	if( m_pReadProc )
	{
		//---------------------------
		// follow code is use for exit ReadUsbThread
		BYTE cmd[3] = { 0xff, 0xff, 0xff };
		WriteUsb(cmd, 3);
		//---------------------------

		WaitForSingleObject(m_pReadProc->m_hThread, 500);
		m_pReadProc = NULL;
	}

	if( g_hUsbDev )
	{
		CloseHandle(g_hUsbDev);
		g_hUsbDev = NULL;
	}
	if(pUSBBuf != NULL)
	{
		delete[]pUSBBuf;
		pUSBBuf = NULL;
	}
	if(pFileData != NULL)
	{
		delete[]pFileData;
		pFileData = NULL;
	}
}

BOOL CTestUsbCeDlg::PreTranslateMessage(MSG* pMsg) 
{
	CString str;
	BYTE out[BUFLEN];
	BOOL bRet;
	int i = 0;
	switch( pMsg->message )
	{
	case WM_KEYDOWN:
		str.Format(_T("Key down, KeyValue = %d\n"), pMsg->wParam);
		TRACE(str);
	
		switch(pMsg->wParam)
		{
		case KEY_BACK:
			UsbCommand(0x01,8);
			keyValue =1;
			break;
		case KEY_LEFT:
			PostMessage(WM_CLOSE, 0, 0);
			keyValue =2;
			break;
		case KEY_UP:
			
			for( i = 0; i < BUFLEN; i++ )
				out[i] = 2*i;
			
			bRet = WriteUsb(out, BUFLEN);
			
			if( bRet )
			{
				TRACE(_T("Write data succeed, len = %d.\n"), BUFLEN);
			}
			else
			{
				TRACE(_T("Write data error, error code is= %d.\n"), GetLastError());
			}
			keyValue =3;
			break;
		case KEY_FAST:
			UpdateApplication();
			break;
		case KEY_DOWN:
			keyValue =4;
			break;
		case KEY_RIGHT:
			keyValue =5;
			break;
		case KEY_FUN:
			keyValue =6;
			break;
		case KEY_OK:
			keyValue =7;
			break;
		case KEY_0:
			//ReadRFID();
			keyValue =0;
			break;
		case KEY_1:
			keyValue =0;
			break;
		case KEY_2:
			keyValue =0;
			break;
		case KEY_3:
			keyValue =0;
			break;
		case KEY_4:
			keyValue =0;
			break;
		case KEY_5:
			keyValue =0;
			break;
		case KEY_6:
			keyValue =0;
			break;
		case KEY_7:
			keyValue =0;
			break;
		case KEY_8:
			keyValue =0;
			break;
		case KEY_9:
			keyValue =0;
			break;
		case KEY_M:
			keyValue =0;   //.  *
			break;
		case KEY_J:
			keyValue =0;   //#
			break;
		default:
			break;
		}		
		break;
	case WM_KEYUP:
		
		break;
	}

	return CDialog::PreTranslateMessage(pMsg);
}

void CTestUsbCeDlg::SetConnUsbState()
{
	// 更换图片
	((CStatic*)GetDlgItem(IDC_PIC_CONN))->SetBitmap(NULL);
	m_bmpConn.DeleteObject();
	m_bmpConn.LoadBitmap(IDB_BITMAP1);
	bconnectState = TRUE;		
}

void CTestUsbCeDlg::UsbCommand(BYTE usbCommand, int usbLength)
{   
	BOOL bRet;
	pFileData[0]=0x68;
	pFileData[1]=deviceCode/1000000;
	pFileData[2]=(deviceCode%1000000)/10000;
	pFileData[3]=(deviceCode%10000)/100;
	pFileData[4]=deviceCode%100;
	pFileData[5]=0x68;	
	pFileData[6]=usbCommand;
	switch(usbCommand)
	{
	case 0x01:    //连接设备
		break;
	case 0x32:
		pFileData[7]=0x01; 
		pFileData[8]=(BYTE)(m_intFileSerialNum>>0);  //发送文件编码
 		pFileData[9]=(BYTE)(m_intFileSerialNum>>8); 
		if(appFile.Open(_T("\\My Documents\\temp.txt"),CFile::modeWrite|CFile::modeCreate))
		{
			appFile.Close();
		}
		break;
	case 0x33:
		pFileData[7]=uReceive; 
		break;
	case 0x34:
		pFileData[7]=uReceive; 
	case 0x60:    //获取设备信息
		break;
	default:
		break;
	}
	pFileData[usbLength-1]=0x16;
	bRet = WriteUsb(pFileData, usbLength);
	if (bRet)
	{    
    	TRACE(_T("Send OK!"));
	}
	else
	{
		TRACE(_T("Send Error!"));
	}
	
}

void CTestUsbCeDlg::SaveApplication(PBYTE buf,DWORD len)
{
	int length;
	if(!appFile.Open(_T("\\My Documents\\temp.txt"),CFile::modeWrite))
	{			
		uReceive = 0;
		UsbCommand(0x33,9);
		return;	
	}
	length = Byte4ToInt(&buf[9]);
	appFile.SeekToEnd();
	appFile.Write(&buf[15],length-16);
	appFile.Close();
	uReceive = 1;	
	Sleep(4);
	UsbCommand(0x33,9);
}

void CTestUsbCeDlg::RenewApplication(PBYTE buf,DWORD len)
{
	int fileLength;
	int programLength;
	BYTE p[6];
	BOOL bRet;

	memcpy(p,&buf[9],4);
	programLength = Byte4ToInt(p);
	switch(m_intFileSerialNum)
	{
	case 1:
		m_strFileName=_T("\\NandFlash\\APPLICATION\\AnGang.exe");
		break;
	case 2:
		m_strFileName=_T("\\NandFlash\\Device.bmp");
		break;
	default:
		m_strFileName.Format(_T("EC%d.txt"),m_intFileSerialNum);
		break;
	}
	if(appFile.Open(_T("\\My Documents\\temp.txt"),CFile::modeRead))
	{
		fileLength = appFile.GetLength();
		appFile.Close();
		if(fileLength == programLength)
		{
			
			bRet = CopyFile(_T("\\My Documents\\temp.txt"),m_strFileName,FALSE);
			if(bRet)
			{
				uReceive = 1;
				bRet = DeleteFile(_T("\\My Documents\\temp.txt"));	
			}
			else
			{
				uReceive = 0;
			}		
		}
		else
		{
			bRet = DeleteFile(_T("\\My Documents\\temp.txt"));
			uReceive = 0;
		}
	}
	else
	{
		
		uReceive = 0;
	}
	UsbCommand(0x34,9);
}
void CTestUsbCeDlg::IntTo4Byte(char *p,int nIndex)
{
	p[0] = static_cast<char>(nIndex>>0);
	p[1] = static_cast<char>(nIndex>>8);
	p[2] = static_cast<char>(nIndex>>16);
	p[3] = static_cast<char>(nIndex>>24);
}
int CTestUsbCeDlg::Byte4ToInt(const BYTE *p)
{
	int result;
	result = (p[0]<<0)+(p[1]<<8)+(p[2]<<16)+(p[3]<<24);
	return result;
}
int CTestUsbCeDlg::Byte2ToInt(const BYTE *p)
{
	int result;
	result = p[1]<<8;
	result += p[0];
	return result;
}
void CTestUsbCeDlg::MainGoDirection() 
{
	TRACE(_T("MainGoDirection.\n"));
}

void CTestUsbCeDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	SetConnUsbState();
}
void CTestUsbCeDlg::UpdateApplication() //更新应用程序。
{

	PROCESS_INFORMATION pi;
	BOOL bRet =	CreateProcess(_T("\\Windows\\StartUp.exe"), _T("\\Windows\\cplmain.cpl,13"),
		NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pi);
	if(bRet)
	{
		PostMessage(WM_CLOSE,0,0);
	}

}

void CTestUsbCeDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	TimeDisplay();
	CDialog::OnTimer(nIDEvent);
}
void CTestUsbCeDlg::TimeDisplay()
{
	CString timeStr;
	CTime   thetime   =   CTime::GetCurrentTime();	
	timeStr.Format(_T("%02d-%02d %02d:%02d:%02d"),
		thetime.GetMonth(),thetime.GetDay(),thetime.GetHour(),
		thetime.GetMinute(),thetime.GetSecond());
	if(lastSecond != thetime.GetSecond())
	{
		SetDlgItemText(IDC_Time,timeStr);
	}
	lastSecond = thetime.GetSecond();
}

⌨️ 快捷键说明

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