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

📄 comsetup.cpp

📁 s3c2410 wince bootload update tools
💻 CPP
字号:
// ComSetup.cpp : implementation file
//

#include "stdafx.h"
#include "ARMUpdate.h"
#include "ComSetup.h"


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

/////////////////////////////////////////////////////////////////////////////
// CComSetup dialog


CComSetup::CComSetup(CWnd* pParent /*=NULL*/)
	: CDialog(CComSetup::IDD, pParent)
{
	//{{AFX_DATA_INIT(CComSetup)
	//}}AFX_DATA_INIT
	ConvertRegtoDCB();
	m_Handle=INVALID_HANDLE_VALUE;
}
CComSetup::~CComSetup()
{
	CloseCom();
}


void CComSetup::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CComSetup)
	DDX_Control(pDX, IDC_COMBO3, m_ByteBits);
	DDX_Control(pDX, IDC_COMBO5, m_Xonoff);
	DDX_Control(pDX, IDC_COMBO4, m_StopBits);
	DDX_Control(pDX, IDC_COMBO2, m_BaudRate);
	DDX_Control(pDX, IDC_COMBO1, m_ComNumber);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CComSetup, CDialog)
	//{{AFX_MSG_MAP(CComSetup)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

const char RegName[][20]={"ComNumber","BaudRate","ByteBits","StopBits","Xonoff"};
const long Item[]={IDC_COMBO1,IDC_COMBO2,IDC_COMBO3,IDC_COMBO4,IDC_COMBO5};
const CHAR ActiveKey[]="SoftWare\\LanBo\\";

/////////////////////////////////////////////////////////////////////////////
// CComSetup message handlers

BOOL CComSetup::OnInitDialog() 
{
	CDialog::OnInitDialog();
	for(int i=0;i<sizeof(Item)/4;i++)
	{	CComboBox *p=(CComboBox*)GetDlgItem(Item[i]);
		if(p)
		{	CRect r;
			p->GetDroppedControlRect(&r);
			r.bottom+=100;
			p->GetParent()->ScreenToClient(&r);
			p->MoveWindow(&r);
		}
	}
	GetCOMRegSetup();
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

BOOL CComSetup::GetCOMRegSetup(void)
{
	DWORD status;
	CRegKey RegKey;
	DWORD pCount=1024;
	char szValue[1024];
	CComboBox *p;

	status=RegKey.Open(HKEY_CURRENT_USER,ActiveKey,KEY_ALL_ACCESS);
	if(status!=ERROR_SUCCESS)
	{
		status=RegKey.Create(HKEY_CURRENT_USER,ActiveKey,0,NULL,REG_OPTION_NON_VOLATILE);
		if(status!=ERROR_SUCCESS)
		{
			return false;
		}
		RegKey.Open(HKEY_CURRENT_USER,ActiveKey,KEY_ALL_ACCESS);
		RegKey.SetValue("COM1",RegName[0]);
		RegKey.SetValue("9600",RegName[1]);
		RegKey.SetValue("8",RegName[2]);
		RegKey.SetValue("1",RegName[3]);
		RegKey.SetValue("NO",RegName[4]);
	}
	else
	{
		memset(szValue,0,sizeof(szValue));
		pCount=1024;
		RegKey.QueryValue(szValue,RegName[0],&pCount);
		if(strlen(szValue)==0)RegKey.SetValue("COM1",RegName[0]);

		memset(szValue,0,sizeof(szValue));
		pCount=1024;
		RegKey.QueryValue(szValue,RegName[1],&pCount);
		if(strlen(szValue)==0) RegKey.SetValue("9600",RegName[1]);

		memset(szValue,0,sizeof(szValue));
		pCount=1024;
		RegKey.QueryValue(szValue,RegName[2],&pCount);
		if(strlen(szValue)==0) RegKey.SetValue("8",RegName[2]);

		memset(szValue,0,sizeof(szValue));
		pCount=1024;
		RegKey.QueryValue(szValue,RegName[3],&pCount);
		if(strlen(szValue)==0) 	RegKey.SetValue("1",RegName[3]);

		memset(szValue,0,sizeof(szValue));
		pCount=1024;
		RegKey.QueryValue(szValue,RegName[4],&pCount);
		if(strlen(szValue)==0) RegKey.SetValue("NO",RegName[4]);
	}
	for(int i=0;i<sizeof(Item)/4;i++)
	{
		p=(CComboBox*)GetDlgItem(Item[i]);
		memset(szValue,0,sizeof(szValue));
		pCount=1024;
		RegKey.QueryValue(szValue,RegName[i],&pCount);
		if(p->GetCount() && p->GetCurSel()==-1)
			p->SetCurSel(p->FindStringExact(0,szValue));
	}
	return true;
}

BOOL CComSetup::SetCOMRegSetup(void)
{
	DWORD status;
	CRegKey RegKey;
	DWORD pCount=1024;
	char szValue[1024];
	CComboBox *p;

	status=RegKey.Open(HKEY_CURRENT_USER,ActiveKey,KEY_ALL_ACCESS);
	for(int i=0;i<sizeof(Item)/4;i++)
	{
		p=(CComboBox*)GetDlgItem(Item[i]);
		p->GetLBText(p->GetCurSel(),szValue);
		RegKey.SetValue(szValue,RegName[i]);
	}
	RegKey.Close();
	ConvertRegtoDCB();
	return true;
}
void CComSetup::ConvertRegtoDCB(void)
{
	DWORD status;
	CRegKey RegKey;
	DWORD pCount=1024;
	char szValue[1024];
	status=RegKey.Open(HKEY_CURRENT_USER,ActiveKey,KEY_ALL_ACCESS);
	if(status!=ERROR_SUCCESS)
	{
		status=RegKey.Create(HKEY_CURRENT_USER,ActiveKey,0,NULL,REG_OPTION_NON_VOLATILE);
		if(status!=ERROR_SUCCESS)
		{
			return;
		}
		RegKey.Open(HKEY_CURRENT_USER,ActiveKey,KEY_ALL_ACCESS);
		RegKey.SetValue("COM1",RegName[0]);
		RegKey.SetValue("9600",RegName[1]);
		RegKey.SetValue("8",RegName[2]);
		RegKey.SetValue("1",RegName[3]);
		RegKey.SetValue("NO",RegName[4]);
	}
	for(int i=0;i<sizeof(Item)/4;i++)
	{
		memset(szValue,0,sizeof(szValue));
		pCount=1024;
		RegKey.QueryValue(szValue,RegName[i],&pCount);
		if(strcmp(RegName[i],"ComNumber")==0)
		{
			strcpy(m_ComName,szValue);
		}
		if(strcmp(RegName[i],"BaudRate")==0)
		{
			m_Dcb.BaudRate=CBR_9600;
			if(strcmp(szValue,"110")==0) m_Dcb.BaudRate=CBR_110;
			if(strcmp(szValue,"300")==0) m_Dcb.BaudRate=CBR_300;
			if(strcmp(szValue,"600")==0) m_Dcb.BaudRate=CBR_600;
			if(strcmp(szValue,"1200")==0) m_Dcb.BaudRate=CBR_1200;
			if(strcmp(szValue,"2400")==0) m_Dcb.BaudRate=CBR_2400;
			if(strcmp(szValue,"4800")==0) m_Dcb.BaudRate=CBR_4800;
			if(strcmp(szValue,"9600")==0) m_Dcb.BaudRate=CBR_9600;
			if(strcmp(szValue,"14400")==0) m_Dcb.BaudRate=CBR_14400;
			if(strcmp(szValue,"19200")==0) m_Dcb.BaudRate=CBR_19200;
			if(strcmp(szValue,"38400")==0) m_Dcb.BaudRate=CBR_38400;
			if(strcmp(szValue,"57600")==0) m_Dcb.BaudRate=CBR_57600;
			if(strcmp(szValue,"115200")==0) m_Dcb.BaudRate=CBR_115200;
			if(strcmp(szValue,"1280000")==0) m_Dcb.BaudRate=CBR_128000;
			if(strcmp(szValue,"2560000")==0) m_Dcb.BaudRate=CBR_256000;
		}
		if(strcmp(RegName[i],"ByteBits")==0)
		{
			m_Dcb.ByteSize=8;
			if(strcmp(szValue,"4")==0) m_Dcb.ByteSize=4;
			if(strcmp(szValue,"5")==0) m_Dcb.ByteSize=5;
			if(strcmp(szValue,"6")==0) m_Dcb.ByteSize=6;
			if(strcmp(szValue,"7")==0) m_Dcb.ByteSize=7;
			if(strcmp(szValue,"8")==0) m_Dcb.ByteSize=8;
		}
		if(strcmp(RegName[i],"StopBits")==0)
		{
			m_Dcb.StopBits=ONESTOPBIT;
			if(strcmp(szValue,"1")==0) m_Dcb.StopBits=ONESTOPBIT;
			if(strcmp(szValue,"1.5")==0)m_Dcb.StopBits=ONE5STOPBITS;
			if(strcmp(szValue,"2")==0)m_Dcb.StopBits=TWOSTOPBITS;
		}
	}
	m_Dcb.fBinary =TRUE;
	m_Dcb.fInX =0;
	m_Dcb.fOutX =0;
	m_Dcb.DCBlength =sizeof(DCB);
	m_Dcb.Parity=NOPARITY;
	m_Dcb.fParity=0;
}

void CComSetup::OnOK() 
{
	// TODO: Add extra validation here
	SetCOMRegSetup();
	CDialog::OnOK();
}
/*************************************************************************
|	功能:	初始化通讯端口
|	参数:	ComName:	如"COM1","COM2","COM3"
|	返回:	成功=0
|	日期:	2004/03/10
\*************************************************************************/
ULONG CComSetup::InitCom(char* ComName)
{
	DWORD xx;
	HANDLE hcom;
	DCB dcb;
	if(m_CurComName.CompareNoCase(ComName)==0)
	{
		return 0; 
	}

	m_CurComName=ComName;
	m_CurComName.MakeUpper();
	if(m_Handle!=INVALID_HANDLE_VALUE) 	::CloseHandle(m_Handle);
	hcom =::CreateFile(ComName, GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
	if (hcom==0||hcom==INVALID_HANDLE_VALUE)
	{	m_Handle=INVALID_HANDLE_VALUE;
		m_CurComName.Empty();
		return 200;
	}
	GetCommState(hcom,&dcb);
	m_Dcb.EofChar =dcb.EofChar;
	m_Dcb.ErrorChar =dcb.ErrorChar;
	m_Dcb.EvtChar=dcb.EvtChar;
	m_Dcb.fAbortOnError=dcb.fAbortOnError;
	m_Dcb.fDsrSensitivity=dcb.fDsrSensitivity;
	m_Dcb.fDtrControl=dcb.fDtrControl;
	m_Dcb.fDummy2=dcb.fDummy2;
	m_Dcb.fNull=dcb.fNull;
	m_Dcb.fOutxCtsFlow=dcb.fOutxCtsFlow;
	m_Dcb.fOutxDsrFlow=dcb.fOutxDsrFlow;
	m_Dcb.fRtsControl=dcb.fRtsControl;
	m_Dcb.fTXContinueOnXoff=dcb.fTXContinueOnXoff;
	m_Dcb.wReserved=dcb.wReserved;
	m_Dcb.wReserved1=dcb.wReserved1;
	m_Dcb.XoffChar=dcb.XoffChar;
	m_Dcb.XoffLim=dcb.XoffLim;
	m_Dcb.XonChar=dcb.XonChar;
	m_Dcb.XonLim=dcb.XonLim;

	if (!::SetCommState(hcom,&m_Dcb))
	{	CloseHandle(hcom);
		m_Handle=INVALID_HANDLE_VALUE;
		m_CurComName.Empty();
		return 200;
	}
	::SetupComm(hcom,1026,1026);				//设置输入和输出缓冲区大小各为1026个字节长
	COMMTIMEOUTS comtime;				//定义通讯失败时的超时值
	comtime.ReadIntervalTimeout=20;
	comtime.ReadTotalTimeoutMultiplier=20;	//接收两个字符之间的超时值(毫秒)
	comtime.ReadTotalTimeoutConstant=20;
	comtime.WriteTotalTimeoutMultiplier=20;	//发送两个字符之间的超时值(毫秒)
	comtime.WriteTotalTimeoutConstant=20;
	SetCommTimeouts(hcom,&comtime);
	m_Handle=hcom;				//成功打开指定的串口,保存打开的串口句柄

	SetCommMask(hcom,EV_RXCHAR);
	GetCommMask(hcom,&xx);

	return 0;
}
/***************************************************************************
|	功能:	关闭通讯端口
|	参数:
|	返回:	成功=0
|	日期:	2004/03/10
\**************************************************************************/
ULONG CComSetup::CloseCom() 
{
	m_CurComName.Empty();
	if(m_Handle==INVALID_HANDLE_VALUE) return 0;
	CloseHandle(m_Handle);
	m_Handle=INVALID_HANDLE_VALUE;
	return 0;
}

⌨️ 快捷键说明

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