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

📄 dlge1mod.cpp

📁 使用vc++技术实现光电机串口通信管理程序
💻 CPP
字号:
// DlgE1Mod.cpp : implementation file
//

#include "stdafx.h"
#include "PCM120.h"
#include "DlgE1Mod.h"
#include "DlgConfig.h"
#include "DlgStateDisplay.h"
#include "CheckState.h"
#include "DlgAllStaSet.h"

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

/////////////////////////////////////////////////////////////////////////////
// CDlgE1Mod dialog


CDlgE1Mod::CDlgE1Mod(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgE1Mod::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgE1Mod)
	m_iMod1 = -1;
	m_iProtect1 = -1;
	m_iMod2 = -1;
	m_iProtect2 = -1;
	m_iMod3 = -1;
	m_iProtect3 = -1;
	m_iMod4 = -1;
	m_iProtect4 = -1;
	m_strCRC1 = _T("CRC校验");
	m_strCRC2 = _T("CRC校验");
	m_strCRC3 = _T("CRC校验");
	m_strCRC4 = _T("CRC校验");
	//}}AFX_DATA_INIT
}


void CDlgE1Mod::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgE1Mod)
	DDX_Radio(pDX, IDC_RADIO1_MOD, m_iMod1);
	DDX_Radio(pDX, IDC_RADIO1_PROTECT, m_iProtect1);
	DDX_Radio(pDX, IDC_RADIO2_MOD, m_iMod2);
	DDX_Radio(pDX, IDC_RADIO2_PROTECT, m_iProtect2);
	DDX_Radio(pDX, IDC_RADIO3_MOD, m_iMod3);
	DDX_Radio(pDX, IDC_RADIO3_PROTECT, m_iProtect3);
	DDX_Radio(pDX, IDC_RADIO4_MOD, m_iMod4);
	DDX_Radio(pDX, IDC_RADIO4_PROTECT, m_iProtect4);
	DDX_Text(pDX, IDC_EDIT_CRC1, m_strCRC1);
	DDX_Text(pDX, IDC_EDIT_CRC2, m_strCRC2);
	DDX_Text(pDX, IDC_EDIT_CRC3, m_strCRC3);
	DDX_Text(pDX, IDC_EDIT_CRC4, m_strCRC4);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgE1Mod, CDialog)
	//{{AFX_MSG_MAP(CDlgE1Mod)
	ON_MESSAGE(WM_COMM_RXCHAR,OnCommunication)
	ON_BN_CLICKED(IDC_BTN_SENT, OnBtnSent)
	ON_BN_CLICKED(IDC_BTN_SEARCH, OnBtnSearch)
	ON_WM_CLOSE()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgE1Mod message handlers
CString m_strRXData;
int iE1ComIndex=-1;//选择的com口的序号;
/*int i1E1ModIndex=-1;
int i2E1ModIndex=-1;
int i3E1ModIndex=-1;
int i4E1ModIndex=-1;
int i1E1FStatIndex =-1;
int i2E1FStatIndex =-1;
int i3E1FStatIndex =-1;
int i4E1FStatIndex =-1;
*/
//CStringArray straE1Source;
//CStringArray straE1Aim;	

CString  CDlgE1Mod::strSent="";
int CDlgE1Mod::iState=0;
CString strSearch;
char btahexdata[512];//最终要发送的内容的十六进制串
CDlgConfig config;


void CDlgE1Mod::OnBtnSent() 
{
	// TODO: Add your control notification handler code here
	CCheckState::bAuto=false;
	CDlgE1Mod::iState=2;
	OrPage();
	////////////////////////读串口信息//////////////////////////////////////////////////
	CDlgAllStaSet dlgalstaset;
	CString strPath;
	char Get[255];
	dlgalstaset.GetModulePath(strPath,NULL);
	strPath+="config.ini";
	GetPrivateProfileString("Com",CDlgStateDisplay::strAddress,"1",Get,255,strPath);
	UINT uiCom=(UINT)atoi(Get);
	//////////////////////////////////////////////////////////////////////////
	OnButtonOpenport(uiCom);
	if(m_Port.m_hComm==NULL)
	{			
		AfxMessageBox("串口在占用,请稍后重试");
		return;
	}
	else
	{		
		char data[512];
		int len=Str2Hex(strSent,data);
		m_Port.WriteToPort(data,len);
		CDlgConfig dlgconfig;
		dlgconfig.WriteConfig(strSent);//把配置内容记入日志;

	}
	m_iMod1 = -1;
	m_iProtect1 = -1;
	m_iMod2 = -1;
	m_iProtect2 = -1;
	m_iMod3 = -1;
	m_iProtect3 = -1;
	m_iMod4 = -1;
	m_iProtect4 = -1;
	UpdateData(false);
}

BOOL CDlgE1Mod::OnInitDialog() 
{
	CDialog::OnInitDialog();
//////////////////////////////////////////////////////////////////////////
	
	CString strPath;
	CDlgAllStaSet dlgalstaset;
	dlgalstaset.GetModulePath(strPath,NULL);
	CString strConfigaPath;
	strConfigaPath=strPath+"config.ini";
	char charGedelay[255];
	GetPrivateProfileString("General","延时(毫秒)","1000",charGedelay,255,strConfigaPath);
	idelay=atoi((LPTSTR)charGedelay);
////////////////////////////////////////////////// ////////////////////////	
	CDlgE1Mod::iState=1;
	// TODO: Add extra initialization here
//////////////////////////////////////////////////////////////////////////
	GetLogPath();
	char charGetAlert[128];
	GetPrivateProfileString("default",CDlgStateDisplay::strAddress,"FF FF FF FF",charGetAlert,255,strLogPath);
	CString strTempBin;
	CString strGetWarn;
	strGetWarn=charGetAlert;
	CString strWarn1,strWarn2,strWarn3,strWarn4;
	strWarn1=strGetWarn.Left(2);
	strWarn2=strGetWarn.Mid(3,2);
	strWarn3=strGetWarn.Mid(6,2);
	strWarn4=strGetWarn.Mid(9,2);
	XstrtoBin(strWarn1,strTempBin);
	if(WarnSet(strTempBin))
	{
		m_strCRC1="CRC校验";
	}
	else
	{
		m_strCRC1="无CRC校验";
	}
	XstrtoBin(strWarn2,strTempBin);
	if(WarnSet(strTempBin))
	{
		m_strCRC2="CRC校验";
	}
	else
	{
		m_strCRC2="无CRC校验";
	}
	XstrtoBin(strWarn3,strTempBin);
	if(WarnSet(strTempBin))
	{
		m_strCRC3="CRC校验";
	}
	else
	{
		m_strCRC3="无CRC校验";
	}
	XstrtoBin(strWarn4,strTempBin);
	if(WarnSet(strTempBin))
	{
		m_strCRC4="CRC校验";
	}
	else
	{
		m_strCRC4="无CRC校验";
	}
	UpdateData(false);
//////////////////////////////////////////////////////////////////////////

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}


void CDlgE1Mod::OnBtnSearch() 
{
	// TODO: Add your control notification handler code here
		////////////////////////读串口信息//////////////////////////////////////////////////
	CDlgAllStaSet dlgalstaset;
	CString strPath;
	char Get[255];
	dlgalstaset.GetModulePath(strPath,NULL);
	strPath+="config.ini";
	GetPrivateProfileString("Com",CDlgStateDisplay::strAddress,"1",Get,255,strPath);
	UINT uiCom=(UINT)atoi(Get);
	//////////////////////////////////////////////////////////////////////////
	OnButtonOpenport(uiCom);
	CDlgE1Mod::iState=2;
	CCheckState::bAuto=false;	
	OrPage();
	if(m_Port.m_hComm==NULL)
	{			
		AfxMessageBox("串口占用或不存在,请稍后重试");
		return;
	}
	else
	{		
		m_strRXData="";
		char data[512];
		int len=Str2Hex(strSearch,data);
		m_Port.WriteToPort(data,len);	
	}	
	SetTimer(3,idelay,NULL);//等1000毫秒后取接收内容
}
void CDlgE1Mod::OrPage()
{
	UpdateData(true);
	int ilPage=m_iMod1*1+m_iMod2*2+m_iMod3*4+m_iMod4*8;//得到低四位10进制
	int iHPage=m_iProtect1*1+m_iProtect2*2+m_iProtect3*4+m_iProtect4*8;//得到高四位10进制
	CString strlPage;//低四位的串
	CString strHpage;//高四位的串

	TentoString(ilPage,strlPage);
	TentoString(iHPage,strHpage);
	strPage.Format("%s%s",strHpage,strlPage);
	int ileng=config.Str2Hex(strPage,btahexdata);
	strSent.Format("7E 81 %s %s 03 04 %02X %s",CDlgStateDisplay::strAddress,CDlgStateDisplay::strAddress,ileng,strPage);
	
	strSearch.Format("7E 81 %s %s 00 04 00",CDlgStateDisplay::strAddress,CDlgStateDisplay::strAddress);

}
void CDlgE1Mod::TentoString(int inum,CString &str)
{
	if(inum<10)
	{
		str.Format("%d",inum);
	}
	else
	{		
		
		switch(inum) {
			
		case 10:
			str="A";
			break;
		case 11:
			str="B";
			break;
		case 12:
			str="C";
			break;
		case 13:
			str="D";
			break;
		case 14:
			str="E";
			break;
		case 15:
			str="F";
			break;
		}
	}
}

BEGIN_EVENTSINK_MAP(CDlgE1Mod, CDialog)
    //{{AFX_EVENTSINK_MAP(CDlgE1Mod)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()


void CDlgE1Mod::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	if(m_Port.m_hComm!=NULL)
	{
		m_Port.ClosePort();
		CDlgE1Mod::iState=0;
		
	}
	CDlgE1Mod::iState=0;
	CDialog::OnClose();
}

void CDlgE1Mod::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	switch(nIDEvent) {
	case 1:
			KillTimer(1);
			m_Port.ClosePort();
			CDlgE1Mod::iState=1;
		
		if(!m_strRXData.IsEmpty())
		{
			CString strSentTemp;
			strSentTemp=strSent.Right(2)+" ";
			if(strSentTemp.Compare(m_strRXData.Right(3))==0)
			{
				AfxMessageBox("设置成功");
			}
			else
			{
				AfxMessageBox("设置不成功");
			}
			
		}
		break;
	case 2:
		m_Port.ClosePort();
		CDlgE1Mod::iState=1;
	
		break;
	case 3:
			KillTimer(3);
			m_Port.ClosePort();
			CDlgE1Mod::iState=1;
			
		if(!m_strRXData.IsEmpty())
		{
			CString strRXTemp,strRXBin;
			strRXTemp=m_strRXData.Right(3);
			strRXTemp.Replace(" ","");
			
			XstrtoBin(strRXTemp,strRXBin);
			if(strRXBin.Left(1)=="1")
			{
			m_iProtect4 = 1;
			}
			else
			{
			m_iProtect4 = 0;
			}
			if(strRXBin.Mid(1,1)=="1")
			{
			m_iProtect3 = 1;
			}
			else
			{
			m_iProtect3 = 0;
			}
			if(strRXBin.Mid(2,1)=="1")
			{
			m_iProtect2 = 1;
			}
			else
			{
			m_iProtect2 = 0;
			}
			if(strRXBin.Mid(3,1)=="1")
			{
			m_iProtect1 = 1;
			}
			else
			{
			m_iProtect1 = 0;
			}
			if(strRXBin.Mid(4,1)=="1")
			{
			m_iMod4 = 1;
			}
			else
			{
			m_iMod4 = 0;
			}
			if(strRXBin.Mid(5,1)=="1")
			{
			m_iMod3 = 1;
			}
			else
			{
			m_iMod3 = 0;
			}
			if(strRXBin.Mid(6,1)=="1")
			{
			m_iMod2 = 1;
			}
			else
			{
			m_iMod2 = 0;
			}
			if(strRXBin.Mid(7,1)=="1")
			{
			m_iMod1 = 1;
			}
			else
			{
			m_iMod1 = 0;
			}
			UpdateData(false);
		}
		break;
	}
	

		
	CDialog::OnTimer(nIDEvent);
}
int CDlgE1Mod::Str2Hex(CString str, char* data)
{
	int t,t1;
	int rlen=0,len=str.GetLength();
	//data.SetSize(len/2);
	for(int i=0;i<len;)
	{
		char l,h=str[i];
		if(h==' ')
		{
			i++;
			continue;
		}
		i++;
		if(i>=len)
			break;
		l=str[i];
		t=HexChar(h);
		t1=HexChar(l);
		if((t==16)||(t1==16))
			break;
		else 
			t=t*16+t1;
		i++;
		data[rlen]=(char)t;
		rlen++;
	}
	return rlen;

}
char CDlgE1Mod::HexChar(char c)
{
	if((c>='0')&&(c<='9'))
		return c-0x30;
	else if((c>='A')&&(c<='F'))
		return c-'A'+10;
	else if((c>='a')&&(c<='f'))
		return c-'a'+10;
	else 
		return 0x10;
}
LONG CDlgE1Mod::OnCommunication(WPARAM ch,LPARAM port)
{
	if (port <= 0 || port > 4)
		return -1;
	CString str;
	str.Format("%02X ",ch);
	m_strRXData+=str;
	UpdateData(false);
	return 0;
}

void CDlgE1Mod::OnButtonOpenport(UINT uiCom) 
{
	// TODO: Add your control notification handler code here
/*	////////////////////////读串口信息//////////////////////////////////////////////////
	CDlgAllStaSet dlgalstaset;
	CString strPath;
	char Get[255];
	dlgalstaset.GetModulePath(strPath,NULL);
	strPath+="config.ini";
	GetPrivateProfileString("General","COM","1",Get,255,strPath);
	UINT uiCom=(UINT)atoi(Get);
	//////////////////////////////////////////////////////////////////////////
		CString strStatus;
		*/
		if (m_Port.InitPort(this, uiCom, 2400,'o',8,1,EV_RXFLAG | EV_RXCHAR,2048))
		{
			m_Port.StartMonitoring();		
		}
		else
		{
			AfxMessageBox("没有发现此串口或被占用");
		}
}
void CDlgE1Mod::GetLogPath()
{
	SYSTEMTIME   mySystemTime;
	GetLocalTime(&mySystemTime);
	CString   filetime;
	strCurTime.Format("%d:%d:%d",mySystemTime.wHour,mySystemTime.wMinute,mySystemTime.wSecond);
	//	filetime.Format ("%d-%d-%d     %s%d     %d:%d:%d",mySystemTime.wYear,mySystemTime.wMonth,mySystemTime.wDay,"星期",mySystemTime.wDayOfWeek,mySystemTime.wHour,mySystemTime.wMinute,mySystemTime.wSecond);
	filetime.Format("%d-%d-%d.ini",mySystemTime.wYear,mySystemTime.wMonth,mySystemTime.wDay);
	CDlgAllStaSet dlgalstaset;
	dlgalstaset.GetModulePath(strLogPath,NULL);
	strLogPath=strLogPath+"log\\"+filetime;
}

void CDlgE1Mod::XstrtoBin(CString str,CString &strBin)
{
	str.Replace("0","0000");
	str.Replace("1","0001");
	str.Replace("2","0010");
	str.Replace("3","0011");
	str.Replace("4","0100");
	str.Replace("5","0101");
	str.Replace("6","0110");
	str.Replace("7","0111");
	str.Replace("8","1000");
	str.Replace("9","1001");
	str.Replace("A","1010");
	str.Replace("B","1011");
	str.Replace("C","1100");
	str.Replace("D","1101");
	str.Replace("E","1110");
	str.Replace("F","1111");
	strBin=str;
}
bool CDlgE1Mod::WarnSet(CString strBinValue)
{
	CString strWarning;
	strWarning=strBinValue.Mid(5,1);
	if(strWarning.Compare("1")==0)
	{
			return true;
	}
	else
	{
		return false;
	}

}

⌨️ 快捷键说明

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