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

📄 ch372updowndlg.cpp

📁 WinCE下操作USB,USB芯片为CH372
💻 CPP
字号:
// CH372UpDownDlg.cpp : implementation file
//

#include "stdafx.h"
#include "CH372UpDown.h"
#include "CH372UpDownDlg.h"

#include <dbt.h>

#include "CH372DLL.H"
#pragma comment (lib,"KmyanUsb")


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

HWND WndHandle; //窗体句柄

HANDLE m_hDev;
//VOID CALLBACK CH372NOTIFYROUTINE( ULONG	iEventStatus );  // 设备事件和当前状态: 0=设备拔出事件, 3=设备插入事件

/////////////////////////////////////////////////////////////////////////////
// CCH372UpDownDlg dialog

CCH372UpDownDlg::CCH372UpDownDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCH372UpDownDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CCH372UpDownDlg)
	m_downdata2 = _T("");
	m_downlen2 = 0;
	m_date = _T("Down:0");
	m_time = _T("Up:0");
	m_UpNumb = 0;
	m_hDev = INVALID_HANDLE_VALUE;
	m_DevIndex = 0;
	m_UpNumb = 0;
	m_updata2 = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_HandleUp = INVALID_HANDLE_VALUE;
}

void CCH372UpDownDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCH372UpDownDlg)
	DDX_Text(pDX, IDC_EDIT2_DOWNDATA, m_downdata2);
	DDX_Text(pDX, IDC_EDIT2_DOWNLEN, m_downlen2);
	DDX_Text(pDX, IDC_DownCount, m_date);
	DDX_Text(pDX, IDC_UpCount, m_time);
	DDX_Text(pDX, IDC_EDIT2_UPLEN, m_UpNumb);
	DDX_Text(pDX, IDC_UPDATABuf, m_updata2);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CCH372UpDownDlg, CDialog)
	//{{AFX_MSG_MAP(CCH372UpDownDlg)
	ON_BN_CLICKED(IDC_OpenCH375Device, OnOpenCH375Device)
	ON_BN_CLICKED(IDC_BUTTON2_DOWN, OnButton2Down)
	ON_BN_CLICKED(IDC_ClearU2Data, OnClearU2Data)
	ON_BN_CLICKED(IDC_ClearD2Data, OnClearD2Data)
	ON_BN_CLICKED(IDC_BUTTON2_UP, OnButton2Up)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_DEVICECHANGE,CH372NOTIFYROUTINE)
END_MESSAGE_MAP()



/////////////////////////////////////////////////////////////////////////////
// CCH372UpDownDlg message handlers

BOOL CCH372UpDownDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	UINT i=0;
	BOOL DrvInject = 0;
	// 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

	//初始化下传数据
	m_downdata2 = _T("7E01FB9000001047534B3D494546514C37433F4CF2F247DDE7");
	//m_downdata2 = _T("7E00FA900000107A686A686E403136332E636F6D01000183E7");
	CString csStr = m_downdata2;
	m_downlen2 = (csStr.GetLength())/2;
	WndHandle = this->m_hWnd;
	//UpdateData(false);
	//MessageBox(m_downdata2);
	SetDlgItemText(IDC_EDIT2_DOWNDATA, m_downdata2);



	// TODO: Add extra initialization here
	m_ComboBox = (CComboBox *)GetDlgItem(IDC_DeviceIndex);
	for(i=0;i<16;i++)
	{	
		CString strtem;
		char tem[50]="";
		sprintf(tem,"%d",i);
		strtem = tem;
		m_ComboBox->AddString(strtem);
		//((CComboBox *)GetDlgItem(IDC_DeviceIndex))->AddString(strtem);
		//CCH372UpDownDlg::SendDlgItemMessage(IDC_DeviceIndex,CB_ADDSTRING,0,(LPARAM) (LPCTSTR)str);				
		if(!DrvInject&&CH372OpenDevice(i)!=INVALID_HANDLE_VALUE){//初始化时检测是否有已插入的CH372/CH375设备	
			sprintf(tem,"检测到设备插入");
			strtem=tem;
			CCH372UpDownDlg::SetDlgItemText(IDC_DeviceStatus,strtem);
			/*if (ERROR_SUCCESS != CH372SetDeviceNotify(0,NULL,CH372NOTIFYROUTINE))//启动指定序号设备插拔监视
			{
				MessageBox(_T("设置监控回调函数失败"));
			}
			else MessageBox(_T("设置监控回调函数成功"));*/
			CH372CloseDevice(i);
			m_ComboBox->SetCurSel(i);
			DrvInject = 1; 

		}
	}
	//SendDlgItemMessage(WndHandle,IDC_DeviceIndex,CB_SETCURSEL,0,0); //初始化设备序号选项
	//SendDlgItemMessage(WndHandle,IDC_DeviceIndex,CB_SETCURSEL, 0, 0);
	return TRUE;  // return TRUE  unless you set the focus to a control
}



void CCH372UpDownDlg::OnOpenCH375Device() //打开设备--连接
{
	// TODO: Add your control notification handler code here
	ULONG DeviceID=0;
	char WndTitle[50]="";
	if(m_hDev) {
		CloseHandle(m_hDev);
		m_hDev = INVALID_HANDLE_VALUE;
		m_DevIndex = 0;
	}
	UINT DrvId = m_ComboBox->GetCurSel();
	RETAILMSG(1,(TEXT("Open device:%d \r\n"),DrvId));
	m_hDev = CH372OpenDevice(DrvId);
	m_DevIndex = DrvId;
	if(m_hDev==INVALID_HANDLE_VALUE) {
		CloseHandle(m_hDev);
		MessageBox(L"Open Device Failed!");
	}
	m_HandleUp = AfxBeginThread(mHandleUp2,this,THREAD_PRIORITY_NORMAL,0,0,NULL);
	CString str;
	DeviceID = CH372GetUsbID(DrvId); //获取当前打开的USB设备ID,返回数据中,低16位为厂商ID,高16位为产品ID,错误时返回全0(无效ID)
	sprintf(WndTitle,"VID:%04X,PID:%04X",LOWORD(DeviceID),HIWORD(DeviceID));
	str = WndTitle;
	SetDlgItemText(IDC_DeviceInfor,str);
}



void CCH372UpDownDlg::OnButton2Down() //下传--发送数据
{
	// TODO: Add your control notification handler code here
	//UCHAR cmd[25] = {0x7E ,0x00 ,0xFA ,0x90 ,0x00 ,0x00 ,0x10 ,0x7A ,0x68 ,0x6A ,0x68 ,0x6E ,0x40 ,0x31 ,0x36 ,0x33 ,0x2E ,0x63 ,0x6F, 0x6D ,0x01 ,0x00 ,0x01 ,0x83 ,0xE7	};

	DWORD dwLen = 1024;
	DWORD dwCurLen = 0;
	UCHAR buff[1024] = {0};
	CString tstr;
	//PUCHAR pstr;
	/*UpdateData(TRUE);//将窗口里的数据赋值给个控件的相关变量; 
	str = m_downdata2;
	RETAILMSG(1,(TEXT("Will down data:%s\r\n"), str ));
	if(mLPCTStrtoVal(str,buff,1024)==((DWORD)-1))
			RETAILMSG(1,(TEXT("Error Parameter\r\n")));*/
	if(m_hDev == INVALID_HANDLE_VALUE)	{
		MessageBox(_T("请先打开设备!"),_T("DEBUG372"),MB_OK|MB_ICONSTOP);
		return;			
	}
	UpdateData(TRUE);//将窗口里的数据赋值给个控件的相关变量; 
	tstr = m_downdata2;
	dwLen = mLPCTStrtoVal(tstr,buff,dwLen);
	if(dwLen!=((DWORD)-1)){
		m_downlen2 = dwLen;
		dwCurLen = m_downlen2;
		UpdateData(FALSE);//将各控件关联的变量的数据显示在窗口上;
		if (CH372WriteData(m_DevIndex,buff,&dwCurLen) == ERROR_SUCCESS)
		{
			tstr.Empty();
			tstr.Format(_T("%d"),dwCurLen);
			m_date = tstr;
			UpdateData(FALSE);//将各控件关联的变量的数据显示在窗口上;
		}
		else
			MessageBox(L"USB数据传输错误!");

	}
	else 
		MessageBox(L"数据错误!");
}

//0823  将一个字符串中的2个字符为一个数据转换成数据串
BOOL CCH372UpDownDlg::mLPCTStrtoVal(LPCTSTR str, PUCHAR pDataBuff,DWORD dwBuffLen)
{
	DWORD dwCurLen = 0;
	TCHAR temp[3];
	while (*str&&dwCurLen<dwBuffLen)
	{
		if(*str == _T('0')){
			if (*(str+1)==_T('X')||*(str+1)==_T('x'))  //16进制识别符,去掉
			{
				str+=2;
			} 
			else if (!((_T('0')<=*(str+1) && *(str+1)<=_T('9'))||(_T('a')<=*(str+1) && *(str+1)<=_T('f'))||(_T('A')<=*(str+1) && *(str+1)<=_T('F'))))
			{ //无效字符串
				return (DWORD)-1;
			}
			else{
				temp[0] = *str++;
				temp[1] = *str;
				temp[2] = 0;
				*pDataBuff = (UCHAR)_tcstoul(temp,0,16);
				str++;
				dwCurLen++;
				RETAILMSG(1,(TEXT("%02x  "),*pDataBuff));
				pDataBuff++;
			}
		}
		else if (!((_T('0')<=*str && *str<=_T('9'))||(_T('a')<=*str && *str<=_T('f'))||(_T('A')<=*str && *str<=_T('F'))))
		{  //无效字符串
			str++;
		}
		else //有效字符数据
		{
			if (!((_T('0')<=*(str+1) && *(str+1)<=_T('9'))||(_T('a')<=*(str+1) && *(str+1)<=_T('f'))||(_T('A')<=*(str+1) && *(str+1)<=_T('F'))))
			{ //无效字符串
				return (DWORD)-1;
			}
			else{
				temp[0] = *str++;
				temp[1] = *str;
				temp[2] = 0;
				*pDataBuff = (UCHAR)_tcstoul(temp,0,16);
				str++;
				dwCurLen++;
				RETAILMSG(1,(TEXT("%02x  "),*pDataBuff));
				pDataBuff++;
			}
		}
	}
	return (dwCurLen==dwBuffLen && *str) ? (DWORD)-1:dwCurLen;
}

BOOL CCH372UpDownDlg::mValtoLPCTStr(TCHAR *str,PUCHAR pDataBuff,DWORD dwCurLen)
{
	DWORD i;
	if ( pDataBuff && dwCurLen)
	{
		for (i=0;i<dwCurLen;i++)
		{
			swprintf(str+i*2,_T("%02x"),*pDataBuff++);
		}
		swprintf(str+dwCurLen*2,_T(" "));
		RETAILMSG(1,(TEXT("mValtoLPCTStr:%s\r\n"),str));
		return ERROR_SUCCESS;
	} 
	else
	{
		RETAILMSG(1,(TEXT("mValtoLPCTStr:ERROR PARAMETER(\r\n")));
		return (DWORD)-1;
	}
	
	
}


void CCH372UpDownDlg::OnClearU2Data() //清空上传区数据
{
	// TODO: Add your control notification handler code here
	CString str;
	str="";
	SetDlgItemText(IDC_UPDATABuf,str);//0823
}

//0827
void CCH372UpDownDlg::OnClearD2Data() 
{
	// TODO: Add your control notification handler code here
	//m_downlen2 =m_downdata2.GetLengt);
	//UpdateData(false);
}


//0830
void CCH372UpDownDlg::OnButton2Up() 
{
	if (m_hDev)
	{
		if (m_HandleUp == INVALID_HANDLE_VALUE)
		{
			m_HandleUp = AfxBeginThread(mHandleUp2,0,THREAD_PRIORITY_NORMAL,0,0,NULL);
			GetDlgItem(IDC_BUTTON2_UP)->EnableWindow(FALSE);
		}
	}
	else
	{
		MessageBox(_T("请先打开设备!"),_T("DEBUG372"),MB_OK|MB_ICONSTOP);
	}
}

/* 设备事件通知回调程序,在此程序里不宜作过多的操作,主要是因为中断服务程序优先级高,
不宜进行USB传输,通常只是发个消息或者置个全局变量通知主程序处理。*/
void CCH372UpDownDlg::CH372NOTIFYROUTINE( UINT message, WPARAM wParam, LPARAM lParam ){  //设备事件和当前状态: 0=设备拔出事件, 3=设备插入事件	
	
	RETAILMSG(1,(TEXT("message:%x wParam:%x lParam:%x\r\n"),message,wParam,lParam));
	if ( message == WM_DEVICECHANGE ) 
	{   
		switch (wParam) 
		{ 
		case DBT_DEVICEARRIVAL: //U盘插进来 
			{ 
				
			} 
			break; 
			
		case DBT_DEVICEREMOVECOMPLETE: 
			break; 
		default: 
			break; 
		} 
	} 
}


UINT mHandleUp2( LPVOID pParam )
{
	ULONG len;
	UCHAR buff[1024] = {0};
	TCHAR Strtemp [1024]= {0};
	DWORD StrIndex=0;
	BOOL err;
	CCH372UpDownDlg * mUpDownDlg = (CCH372UpDownDlg *)pParam;
	
	while (1)
	{	len = 1024;
		if (CH372ReadData(mUpDownDlg->m_DevIndex, buff, &len) == ERROR_SUCCESS)
		{
			RETAILMSG( 1,(TEXT("CurrentReadNum: %d\r\n"),len));
			if ((1024-StrIndex)<((len+1)*2))
			{
				StrIndex = 0;
			}
			err = mUpDownDlg->mValtoLPCTStr(Strtemp+StrIndex,buff,len);
			if (err == ERROR_SUCCESS)
			{
				StrIndex = StrIndex+(len*2)+1;
				if (StrIndex>1023)
				{
					StrIndex=0;
					mUpDownDlg->m_updata2.Empty();
				}  
				CString Strt = "";
				RETAILMSG(1,(TEXT("mHandleUp2:%s\r\n"),Strtemp));
				RETAILMSG(1,(TEXT("StrIndex:%d\r\n"),StrIndex));
				mUpDownDlg->m_updata2 = Strtemp;
				Strt.Format(_T("%d"),len);
				mUpDownDlg->m_time = Strt;
				mUpDownDlg->UpdateData(FALSE);
			}
		}
		Sleep(100);
	}
	mUpDownDlg->m_HandleUp = INVALID_HANDLE_VALUE;
	return 0;
}


⌨️ 快捷键说明

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