📄 comsetup.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 + -