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

📄 vcsampledlg.cpp

📁 modbus通讯
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	FreeLibrary(m_hInst);
	if(m_pComFile!=NULL)
	{
		delete m_pComFile;
		m_pComFile=NULL;
	}
	CDialog::OnCancel();
}
/*
*	打开串口
*/
void CVcSampleDlg::OnOK() 
{
	// TODO: Add extra validation here
	//返回值
	int nResult=0;
	CString msg,oldMsg;
	int nOverTime=0;
	int nTimes=0;
	int nDataBit=0;
	int nParity=2;
	int nStopBit=0;	
	int nBps=0;
	int checkRtu=0;
	char commName[6]={0};
	char chOverTime[6]={0};
	char chTimes[6]={0};
	char chDataBit[2]={0};
	char chStopBit[4]={0};
	char chBps[7]={0};
	m_cmbCommName.GetWindowText(commName,6);  
	//获取串口名称
	m_nCommName=m_cmbCommName.GetCurSel()+1;
	nParity=m_cmbParityBit.GetCurSel();
	//获取超时时间
	m_EdOverTime.GetWindowText(chOverTime,6);
	nOverTime=atoi(chOverTime);
	//获取重发次数
	m_CmbTimes.GetWindowText(chTimes,6);
	nTimes=atoi(chTimes);
	//获取数据位
	m_cmbDataBit.GetWindowText(chDataBit,2);
	nDataBit=atoi(chDataBit);
	//获取停止位
	CString strTemp;
	m_cmbSTopBit.GetWindowText(strTemp);
	if(strTemp=="1")
	{
		nStopBit=0;
	} else if(strTemp=="1.5")
	{
		nStopBit=1;
	}else if(strTemp=="2")
	{
		nStopBit=2;
	}
	//获取波特率
	m_cmbBps.GetWindowText(chBps,7);
	nBps=atoi(chBps);
	//获取通信口 0:ASCII 1:RTU begin
	CButton *pRTU=NULL;
	pRTU=(CButton*)GetDlgItem(IDC_RTU);
	if(pRTU->GetCheck())
	{
		checkRtu=1;
	}
	//获取通信口 0:ASCII 1:RTU end
	//判断Dll句柄是否为空

	if(m_hInst)
	{
		//获取打开串口函数的指针
		OpenComm openComm=(OpenComm)::GetProcAddress(m_hInst,"OpenSerial");
		if(openComm)
		{
			//调用DLL打开串口函数
			nResult=openComm(m_nCommName,nBps,nDataBit,nStopBit,nParity,checkRtu,nTimes,nOverTime);
			if (nResult !=0)
			{				
				m_BtnExit.EnableWindow(false);
				m_EdMsg.GetWindowText(oldMsg);				
				msg.Format("\r\n打开COM%d 失败,错误代码:%d,错误消息:%s.%s",m_nCommName,nResult,getAckMsg(nResult),oldMsg);
				m_EdMsg.SetWindowText(msg);
				return ;
			}
			//按钮、输入框设置有效
			m_EdMsg.GetWindowText(oldMsg);				
			msg.Format("\r\n打开COM%d 成功!%s",m_nCommName,oldMsg);
			m_EdMsg.SetWindowText(msg);
			OpenCommSuccess(true);
			m_edNum.SetWindowText("256");
			m_BtnExit.EnableWindow(true);	
			m_btnOk.EnableWindow(false);
		}		
	}
}
/*
*	关闭串口
*/
void CVcSampleDlg::OnExit() 
{
	// TODO: Add your control notification handler code here
	CString msg,oldMsg;
	int nResult=0;
	if(m_hInst)
	{
		//获取关闭串口的函数指针
		CloseComm close=(CloseComm)::GetProcAddress(m_hInst,"CloseSerial");
		if(close)
		{ 
			//调用DLL关闭串口函数
			nResult=close(m_nCommName);
			if (nResult !=0)
			{				
				m_EdMsg.GetWindowText(oldMsg);				
				msg.Format("\r\n关闭COM%d 失败,错误代码:%d,错误消息:%s!%s",m_nCommName,nResult,getAckMsg(nResult),oldMsg);
				m_EdMsg.SetWindowText(msg);			
				return ;
			}
			m_EdMsg.GetWindowText(oldMsg);				
			msg.Format("\r\n关闭COM%d 成功!%s",m_nCommName,oldMsg);
			m_EdMsg.SetWindowText(msg);	

		}		
		m_BtnExit.EnableWindow(false);
		m_btnOk.EnableWindow(true);
		//按钮、输入框设置无效
		OpenCommSuccess();
	}
}

/*
*	判断是否为RTU 如,RTU最大的波特率可以为38400
*/
void CVcSampleDlg::OnSelchangeCombo2() 
{
	// TODO: Add your control notification handler code here
	CString msg;
	char chBps[7]={0};
	int nBps=0;
	//获取波特率
	m_cmbBps.GetWindowText(chBps,7);
	nBps=atoi(chBps);
	/*
	*	判断是否选择ASCII
	*/
	CButton *pRdAscII=NULL; 
	pRdAscII =(CButton*) GetDlgItem(IDC_ASCII);
	if (pRdAscII->GetCheck() == BST_CHECKED)
	{
		if (nBps ==MAX_BPS)
		{			
			msg.Format("ASCII的最大波特率不能为:%dbps?,请重新选择",nBps);
			MessageBox(msg,"提示框",MB_ICONERROR);
			return ;
		}

	}

}
/*
*	读多个线圈操作控制
*/
void CVcSampleDlg::OnRdMultiBit() 
{
	// TODO: Add your control notification handler code here
	/*
	*	控制元件类型、输入框的有效性
	*/
	AddItem(0);
	VwCrlComponet(0);
	m_nOperIndex=0;
	m_edNum.SetWindowText("256");
	m_edValue.SetWindowText("");

}
/*
*	控制增加不用元件类型
* 输入值 0、读多个线圈1、读多个寄存器2、写单个线圈3、写多个线圈4、写单个寄存器
*        5、写多个寄存器 6、回送诊断校验
*/
void CVcSampleDlg::AddItem(int operationID)
{
	/*
	*	清除元件类型的数据
	*/
	int nCount=0;
	nCount=m_cmbItem.GetCount();
	for (int i=0;i <nCount;i++)
	{
		m_cmbItem.DeleteString( 0 );
	}
	nCount=m_cmbVerftyCode.GetCount();
	for (int j=0;j <nCount;j++)
	{
		m_cmbVerftyCode.DeleteString( 0 );
	}
	switch(operationID) {
case 0 :
	m_cmbItem.AddString("Y");
	m_cmbItem.AddString("X");
	m_cmbItem.AddString("M");
	m_cmbItem.AddString("SM");
	m_cmbItem.AddString("S");
	m_cmbItem.AddString("T");
	m_cmbItem.AddString("C");
	m_cmbItem.SetCurSel(0);
	break;
case 1:
	m_cmbItem.AddString("D");
	m_cmbItem.AddString("SD");
	m_cmbItem.AddString("Z");
	m_cmbItem.AddString("T");
	m_cmbItem.AddString("C");
	m_cmbItem.SetCurSel(0);
	break;
case 2:
	m_cmbItem.AddString("Y");
	m_cmbItem.AddString("X");
	m_cmbItem.AddString("M");
	m_cmbItem.AddString("SM");
	m_cmbItem.AddString("S");
	m_cmbItem.AddString("T");
	m_cmbItem.AddString("C");
	m_cmbItem.SetCurSel(0);
	break;
case 3:
	m_cmbItem.AddString("Y");
	m_cmbItem.AddString("X");
	m_cmbItem.AddString("M");
	m_cmbItem.AddString("SM");
	m_cmbItem.AddString("S");
	m_cmbItem.AddString("T");
	m_cmbItem.AddString("C");
	m_cmbItem.SetCurSel(0);
	break;
case 4:
	m_cmbItem.AddString("D");
	m_cmbItem.AddString("SD");
	m_cmbItem.AddString("Z");
	m_cmbItem.AddString("T");
	m_cmbItem.AddString("C");
	m_cmbItem.SetCurSel(0);
	break;
case 5:
	m_cmbItem.AddString("D");
	m_cmbItem.AddString("SD");
	m_cmbItem.AddString("Z");
	m_cmbItem.AddString("T");
	m_cmbItem.AddString("C");
	m_cmbItem.SetCurSel(0);
	break;
case 6:
	m_cmbVerftyCode.AddString("0x00");
	m_cmbVerftyCode.AddString("0x01");
	m_cmbVerftyCode.AddString("0x04");
	m_cmbVerftyCode.AddString("0x0a");
	m_cmbVerftyCode.AddString("0x0b");
	m_cmbVerftyCode.AddString("0x0c");
	m_cmbVerftyCode.AddString("0x0d");
	m_cmbVerftyCode.AddString("0x0e");
	m_cmbVerftyCode.AddString("0x0f");
	m_cmbVerftyCode.AddString("0x12");
	m_cmbVerftyCode.SetCurSel(0);
	break;
default:
	break;
	} 

}
/*
*	控制输入框、按钮等控件的有效性
*输入值:True 打开串口成功False 关闭串口或打开串口失败 默认值False
*/
void CVcSampleDlg::OpenCommSuccess(BOOL successFlag)
{
	if (successFlag)
	{
		CButton *pRdEnabled=NULL; 
		pRdEnabled =(CButton*) GetDlgItem(IDC_RdMultiBit);
		pRdEnabled->EnableWindow(true);
		pRdEnabled =(CButton*) GetDlgItem(IDC_RdMultiWord);
		pRdEnabled->EnableWindow(true);
		pRdEnabled =(CButton*) GetDlgItem(IDC_WrtOneBit);
		pRdEnabled->EnableWindow(true);
		pRdEnabled =(CButton*) GetDlgItem(IDC_WrtMultBit);
		pRdEnabled->EnableWindow(true);
		pRdEnabled =(CButton*) GetDlgItem(IDC_WrtOneWord);
		pRdEnabled->EnableWindow(true);
		pRdEnabled =(CButton*) GetDlgItem(IDC_WrtMultWord);
		pRdEnabled->EnableWindow(true);

		pRdEnabled =(CButton*) GetDlgItem(IDC_VerfityCode);
		pRdEnabled->EnableWindow(true);

		pRdEnabled =(CButton*) GetDlgItem(IDC_ResetBtn);
		pRdEnabled->EnableWindow(true);
		pRdEnabled =(CButton*) GetDlgItem(IDC_OpertionBtn);
		pRdEnabled->EnableWindow(true);

		m_cmbVerftyCode.EnableWindow(true);
		m_cmbVerftyCode.ShowWindow(SW_HIDE);

		CStatic *tVergtyCode=NULL;
		tVergtyCode =(CStatic *) GetDlgItem(IDC_stVertfyCode);
		tVergtyCode->ShowWindow(SW_HIDE);

		m_edValue.EnableWindow(false);
		m_edStartAddr.EnableWindow(true);
		m_edNum.EnableWindow(true);
		m_cmbItem.EnableWindow(true);
		m_cmbSationNo.EnableWindow(true);

	}else
	{
		CButton *pRdEnabled=NULL; 
		pRdEnabled =(CButton*) GetDlgItem(IDC_RdMultiBit);
		pRdEnabled->EnableWindow(false);
		pRdEnabled =(CButton*) GetDlgItem(IDC_RdMultiWord);
		pRdEnabled->EnableWindow(false);
		pRdEnabled =(CButton*) GetDlgItem(IDC_WrtOneBit);
		pRdEnabled->EnableWindow(false);
		pRdEnabled =(CButton*) GetDlgItem(IDC_WrtMultBit);
		pRdEnabled->EnableWindow(false);
		pRdEnabled =(CButton*) GetDlgItem(IDC_WrtOneWord);
		pRdEnabled->EnableWindow(false);
		pRdEnabled =(CButton*) GetDlgItem(IDC_WrtMultWord);
		pRdEnabled->EnableWindow(false);

		pRdEnabled =(CButton*) GetDlgItem(IDC_VerfityCode);
		pRdEnabled->EnableWindow(false);

		pRdEnabled =(CButton*) GetDlgItem(IDC_ResetBtn);
		pRdEnabled->EnableWindow(false);
		pRdEnabled =(CButton*) GetDlgItem(IDC_OpertionBtn);
		pRdEnabled->EnableWindow(false);

		m_cmbVerftyCode.EnableWindow(false);
		m_cmbVerftyCode.ShowWindow(SW_HIDE);

		CStatic *tVergtyCode=NULL;
		tVergtyCode =(CStatic *) GetDlgItem(IDC_stVertfyCode);
		tVergtyCode->ShowWindow(SW_HIDE);

		m_edValue.EnableWindow(false);
		m_edStartAddr.EnableWindow(false);
		m_edNum.EnableWindow(false);
		m_cmbItem.EnableWindow(false);
		m_cmbSationNo.EnableWindow(false);
	}
}
/*
*	读多个寄存器控制操作
*/
void CVcSampleDlg::OnRdMultiWord() 
{
	// TODO: Add your control notification handler code here
	/*
	*	控制元件类型、输入框的有效性
	*/
	AddItem(1);
	VwCrlComponet(1);
	m_nOperIndex=1;
	m_edNum.SetWindowText("125");
	m_edValue.SetWindowText("");
}
/*
*	写单个线圈控制操作
*/
void CVcSampleDlg::OnWrtOneBit() 
{
	// TODO: Add your control notification handler code here
	/*
	*	控制元件类型、输入框的有效性
	*/
	AddItem(2);
	VwCrlComponet(2);
	m_nOperIndex=2;
}
/*
*	写多个线圈控制操作
*/
void CVcSampleDlg::OnWrtMultBit() 
{
	// TODO: Add your control notification handler code here
	/*
	*	控制元件类型、输入框的有效性
	*/
	AddItem(3);
	VwCrlComponet(3);
	m_nOperIndex=3;
	m_edNum.SetWindowText("256");
}

/*
*	写单个寄存器控制操作
*/
void CVcSampleDlg::OnWrtOneWord() 
{
	// TODO: Add your control notification handler code here
	/*
	*	控制元件类型、输入框的有效性
	*/
	AddItem(4);
	VwCrlComponet(4);
	m_nOperIndex=4;
}
/*
*	写多个寄存器控制操作
*/
void CVcSampleDlg::OnWrtMultWord() 
{
	// TODO: Add your control notification handler code here
	/*
	*	控制元件类型、输入框的有效性
	*/
	AddItem(5);
	VwCrlComponet(5);
	m_nOperIndex=5;
	m_edNum.SetWindowText("120");
}
/*
*	回送诊断校验控制操作
*/
void CVcSampleDlg::OnVerfityCode() 
{
	// TODO: Add your control notification handler code here
	/*
	*	控制元件类型、输入框的有效性
	*/
	AddItem(6);
	VwCrlComponet(6);
	m_nOperIndex=6;
}

/*
*控制输入框、按钮的有效性	
*输入值:0、读多个线圈1、读多个寄存器2、写单个线圈3、写多个线圈4、写单个寄存器
5、写多个寄存器 6、回送诊断校验
*/
void CVcSampleDlg::VwCrlComponet(int operationID)
{
	CStatic *tVergtyCode=NULL;//诊断码的显示框指针
	m_edNum.SetWindowText("");//初始化元件的值
	switch(operationID) {
case 0:
	m_cmbVerftyCode.EnableWindow(false);
	m_cmbVerftyCode.ShowWindow(SW_HIDE);		

	tVergtyCode =(CStatic *) GetDlgItem(IDC_stVertfyCode);
	tVergtyCode->ShowWindow(SW_HIDE);

	m_edValue.EnableWindow(false);
	m_edStartAddr.EnableWindow(true);
	m_edNum.EnableWindow(true);
	m_cmbItem.EnableWindow(true);
	m_cmbSationNo.EnableWindow(true);
	m_btnOperation.SetWindowText("读");
	break;
case 1:
	m_cmbVerftyCode.EnableWindow(false);
	m_cmbVerftyCode.ShowWindow(SW_HIDE);		

	tVergtyCode =(CStatic *) GetDlgItem(IDC_stVertfyCode);
	tVergtyCode->ShowWindow(SW_HIDE);

	m_edValue.EnableWindow(false);
	m_edStartAddr.EnableWindow(true);
	m_edNum.EnableWindow(true);
	m_cmbItem.EnableWindow(true);
	m_cmbSationNo.EnableWindow(true);
	m_btnOperation.SetWindowText("读");
	break;
case 2:
	m_cmbVerftyCode.EnableWindow(false);
	m_cmbVerftyCode.ShowWindow(SW_HIDE);		

	tVergtyCode =(CStatic *) GetDlgItem(IDC_stVertfyCode);
	tVergtyCode->ShowWindow(SW_HIDE);

	m_edValue.EnableWindow(true);
	m_edStartAddr.EnableWindow(true);
	m_edNum.EnableWindow(false);
	m_edNum.SetWindowText("1");
	m_cmbItem.EnableWindow(true);
	m_cmbSationNo.EnableWindow(true);
	m_btnOperation.SetWindowText("写入");
	break;
case 3:
	m_cmbVerftyCode.EnableWindow(false);
	m_cmbVerftyCode.ShowWindow(SW_HIDE);		

	tVergtyCode =(CStatic *) GetDlgItem(IDC_stVertfyCode);
	tVergtyCode->ShowWindow(SW_HIDE);

	m_edValue.EnableWindow(true);
	m_edStartAddr.EnableWindow(true);
	m_edNum.EnableWindow(true);
	m_cmbItem.EnableWindow(true);
	m_cmbSationNo.EnableWindow(true);
	m_btnOperation.SetWindowText("写入");
	break;
case 4:
	m_cmbVerftyCode.EnableWindow(false);
	m_cmbVerftyCode.ShowWindow(SW_HIDE);		

	tVergtyCode =(CStatic *) GetDlgItem(IDC_stVertfyCode);
	tVergtyCode->ShowWindow(SW_HIDE);

	m_edValue.EnableWindow(true);
	m_edStartAddr.EnableWindow(true);
	m_edNum.EnableWindow(false);
	m_edNum.SetWindowText("1");
	m_cmbItem.EnableWindow(true);
	m_cmbSationNo.EnableWindow(true);
	m_btnOperation.SetWindowText("写入");

⌨️ 快捷键说明

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