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

📄 modbustooldlg.cpp

📁 这是一个西门子 ModBus 协议的通讯调试软件。(原码)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
void CModBusToolDlg::Initailize_Control()
{
    
	//---------HH 2006-2-5--------------------------------------
	m_ComPort    = (CComboBox *)GetDlgItem( IDC_COMBO_COMPORT );
    m_ComBaud    = (CComboBox *)GetDlgItem( IDC_COMBO_BAUD );
	m_Command    = (CComboBox *)GetDlgItem( IDC_COMBO_COMMAND );
    m_ComMachine = (CComboBox *)GetDlgItem( IDC_COMBO_MACHINE );
    m_TimeInterval=(CComboBox *)GetDlgItem( IDC_COMBO_INTERVAL);
	//----add comport-------------------------------------------
	m_ComPort->AddString("COM1");
	m_ComPort->AddString("COM2");
	m_ComPort->AddString("COM3");
	m_ComPort->AddString("COM4");
	m_ComPort->SetCurSel(0); 
    
	//----add communication baud--------------------------------
	m_ComBaud->AddString("1200"); 
	m_ComBaud->AddString("2400");
	m_ComBaud->AddString("2250");
	m_ComBaud->AddString("4800"); 
	m_ComBaud->AddString("9600"); 
	m_ComBaud->AddString("19200"); 
	m_ComBaud->AddString("38400");
	m_ComBaud->AddString("43000");
	m_ComBaud->AddString("57600");
	m_ComBaud->AddString("115200");
	m_ComBaud->SetCurSel(3);  

    //-----add send and receive of timer interval---------------
	m_TimeInterval->AddString("1");
    m_TimeInterval->AddString("10");  
    m_TimeInterval->AddString("20");
	m_TimeInterval->AddString("30");
	m_TimeInterval->AddString("40");
	m_TimeInterval->AddString("50");
	m_TimeInterval->AddString("100");
	m_TimeInterval->AddString("200");
	m_TimeInterval->AddString("300");
	m_TimeInterval->AddString("500");
	m_TimeInterval->AddString("1000");
	m_TimeInterval->AddString("2000");
	m_TimeInterval->SetCurSel(6); 

	//-----add machine number list------------------------------
	CString  pszNumber;
	for ( int n = 1; n<128; n++ )
	{
	   pszNumber.Format( "%d",n ); 
	   m_ComMachine->AddString( pszNumber ); 
	}
    m_ComMachine->SetCurSel( ZERO ); 
	//--reading command filr add to command list----------------
    
	CStdioFile   ofile;
	if ( !ofile.Open("Command.txt",CFile::modeRead|CFile::typeText) )
	{
		MessageBox("Open Command.txt File Failed !",TITLE,MB_ICONINFORMATION );
		return;
	}
    
	CString  pszReadText;
    while ( ofile.ReadString( pszReadText ) ) 
    {
		if ( pszReadText != "" )
           m_Command->AddString( pszReadText ); 
    }
    int  count = m_Command->GetCount();
	if ( count > 0 )
		m_Command->SetCurSel(0); 

} 

void CModBusToolDlg::OnClear() 
{

	intRX = intTX = 0;
	m_Edit[1]->SetWindowText(""); 
	Change_Work_Status();

}

void CModBusToolDlg::OnSelchangeComboCommand() 
{
    
	CString   szText,szTemp;
	unsigned char crc[6];
    m_Command->GetLBText( m_Command->GetCurSel(),szText ); 
	if ( szText == "" )
	{
		MessageBox( "所选项目不包含有效命令字符. 重试......",TITLE,MB_ICONINFORMATION );
		return ;
	}
    
	int r_pos = szText.ReverseFind(','); 
	r_pos++;
	szTemp = szText.Right( szText.GetLength() - r_pos );
	szText = "";

	if ( uiTerm <= 0x0A )
	   szText.Format( "0%X ",uiTerm ); 
	else
       szText.Format( "%X ",uiTerm ); 

		//----mask crc codeing----------------------------------
	if ( m_CheckCrc->GetCheck() )
	{
		//CString t = szTemp.Left( szTemp.GetLength() - 4 ) ;
        ::Make_Info( crc ,szTemp );
		unsigned short crcValue = Get_CRC_Value( crc,6 ); 
		if ( crcValue > 0 )
		{
           for ( int n=2 ;n<szTemp.GetLength() - 4; n+=2 )
		   {
		      szText += szTemp.GetAt( n );
		      szText += szTemp.GetAt( n+1 );
		      szText +=" ";
		   }
		   unsigned short hchar = 0,lchar = 0;
		   hchar = crcValue / 256;
		   lchar = crcValue % 256;

		   CString linechar,tt;
		   if ( hchar <= 0x0F )
		      linechar.Format( "0%X ",hchar ); 
		   else
              linechar.Format( "%X ",hchar ); 
		   tt = linechar;
           if ( lchar <= 0x0F )
		      linechar.Format( "0%X ",lchar ); 
		   else
              linechar.Format( "%X ",lchar ); 
		   tt += linechar;
           szText += tt;
		}
        else
		{
		   for ( int n=2 ;n<szTemp.GetLength(); n+=2 )
		   {
		      szText += szTemp.GetAt( n );
		      szText += szTemp.GetAt( n+1 );
		      szText +=" ";
		   }
		}
	}
	else
	{
	    for ( int n=2 ;n<szTemp.GetLength(); n+=2 )
		{
		    szText += szTemp.GetAt( n );
		    szText += szTemp.GetAt( n+1 );
		    szText +=" ";
		}
	}
    m_Edit[0]->SetWindowText( szText ); 
	

}
BOOL CModBusToolDlg::Change_Communication_Param()
{

	if ( lpNewComThread != NULL )
	{
		delete lpNewComThread;
		lpNewComThread = NULL;
	}
    
	lpNewComThread = new CNewComThread();
	if ( byPort >0 && dwBaud != 0 )
	{
	   if ( lpNewComThread->InitNumber( byPort,dwBaud ,'N',8,1) )
	   {
		   lpNewComThread->Set_TimeInterval( uiInterval ); 
		   lpNewComThread->Set_Communication_Mode( blMode ); 
		   Change_Work_Status( TRUE );
		   return ( TRUE );
	   }
	   else
	   {
           Change_Work_Status( FALSE );  
		   return ( FALSE );
	   }
	}
    Change_Work_Status();
	return ( TRUE );

}

void CModBusToolDlg::OnSelchangeComboComport() 
{
    
	CString   szPort,szTemp;
	m_ComPort->GetLBText( m_ComPort->GetCurSel(),szPort ); 

	if ( szPort != "" )
	{
        szTemp = szPort.Right( 1 );
		byPort = atoi( szTemp );
	}
	else
		byPort = 1;
    Change_Communication_Param();

}

void CModBusToolDlg::OnSelchangeComboBaud() 
{
    
	CString   szBaud,szTemp;
	m_ComBaud->GetLBText( m_ComBaud->GetCurSel(),szBaud ); 

	if ( szBaud != "" )
	{
		dwBaud = atoi( szBaud );
	}
	else
		dwBaud = 9600;

    Change_Communication_Param();

}
void CModBusToolDlg::Change_Work_Status(  BOOL blTrue  )
{

	CString  pszdisplay;
    if ( byPort >0 && byPort < 5 )
	{
		if ( blTrue )
		{
		   pszdisplay.Format( "状态: 打开通讯串口: COM%d  波特率: %d  数据位: %d  校验位: %s  停止位: %d    RX: %d     TX: %d",
			                byPort,
							dwBaud,
							8,
							"N",
							1,
							intRX,
							intTX); 

		   m_Status->SetWindowText( pszdisplay );
		   m_Button[0]->EnableWindow( TRUE );  

		}
		else
		{
           m_Button[0]->EnableWindow( FALSE );  
		   pszdisplay.Format( "状态:串口 COM%d 正在使用,请更改......",byPort );
		   MessageBox( pszdisplay,TITLE,MB_ICONINFORMATION );
		   m_Status->SetWindowText( pszdisplay ); 
		}

	}


} 

void CModBusToolDlg::OnSelchangeComboMachine() 
{
      
	CString pszText;
	m_ComMachine->GetLBText( m_ComMachine->GetCurSel(),pszText ); 
	if ( pszText != "" )
	{
		uiTerm = atoi( pszText );
	}

}

void CModBusToolDlg::OnSelchangeComboInterval() 
{

    CString pszText;
	m_TimeInterval->GetLBText( m_TimeInterval->GetCurSel(),pszText ); 
	if ( pszText != "" )
	{
		uiInterval = atoi( pszText );
		if ( lpNewComThread != NULL )
			lpNewComThread->Set_TimeInterval( uiInterval ); 
	}	
}

void CModBusToolDlg::OnCheckMode() 
{
    
	CString pszText;
	blMode = m_CheckMode->GetCheck();
	if ( lpNewComThread != NULL )
		lpNewComThread->Set_Communication_Mode( blMode ); 

	if ( !blMode )
	{
		m_CheckCrc->SetCheck( FALSE ); 
		m_CheckCrc->EnableWindow( FALSE ); 
		m_CheckMode->SetWindowText( "以字符发送和接收" ); 
	}
	else
	{
        m_CheckCrc->SetCheck( TRUE ); 
		m_CheckCrc->EnableWindow( TRUE ); 
		m_CheckMode->SetWindowText( "以十六进制发送和接收" ); 
	}

}

void CModBusToolDlg::OnCheckNotcrc() 
{
	
	blNotCrc = m_CheckNotCrc->GetCheck();
	
	if ( blNotCrc )
		m_CheckCrc->SetCheck( FALSE );
	
}

void CModBusToolDlg::OnTimer(UINT nIDEvent) 
{
	
	CString  pszText,pszTemp, pszTemp1;
	if ( nIDEvent ==1 )
	{
		if ( lpNewComThread->ReceiveData_Command() )
		{
           
		   if ( m_Edit[1]->GetLineCount() > 200 )
		   {
			   m_Edit[1]->SetWindowText( "" ); 
		   }
		   int len = m_Edit[1]->GetWindowTextLength();
		   m_Edit[1]->SetSel( len,len ); 
		   pszTemp1 = lpNewComThread->Get_ReceiveValue(); 
          
		   pszText = "";
		   for ( int n=0; n<pszTemp1.GetLength(); n+=2 )
		   {
			   pszText += pszTemp1.GetAt( n );
			   pszText += pszTemp1.GetAt( n+1 );
			   pszText += " ";
		   }
		   pszTemp += pszText;

           m_Edit[1]->ReplaceSel( pszTemp ); 
		   intRX += ( pszTemp1.GetLength() /3 );
		   Change_Work_Status(); 
		   
		}

	}
	CDialog::OnTimer(nIDEvent);

}

void CModBusToolDlg::OnCheckAutoreceive() 
{
    
	if ( m_CheckAutoReceive->GetCheck() )
		SetTimer( 1,500 ,NULL );
	else
		KillTimer( 1 );

}

void CModBusToolDlg::OnButsetdatato() 
{
    
	CString  psztext,pszInsert;
	CString  szh,szl;
	unsigned short  shortcrc = 0;
	int lchar = 0,hchar = 0 ,len = 0;

	m_editData->GetWindowText( psztext ); 

	int v = ::Check_InputData( psztext ); 
	switch (v)
	{
	case 1:
		//-------------------------------------------------
		UpdateData( TRUE ); 
		dwSetValue = m_EditData;
        
		if ( dwSetValue > 0)
		{
          hchar = dwSetValue / 256;
          lchar = dwSetValue % 256;
		}
		if ( hchar < 0x10 )
           szh.Format( " 0%X ",hchar ); 
		else
           szh.Format( " %X ",hchar ); 
		if ( lchar < 0x10 )
		   szl.Format( "0%X ",lchar ); 
		else
           szl.Format( "%X ",lchar ); 
		
		pszInsert  = szh;
		pszInsert += szl;
        
		m_Edit[0]->GetWindowText( psztext );
		if ( psztext == "" )
			return;
        if ( psztext.GetLength() > 0x0A )
		{
			szh = psztext.Left( 11 );
		    szl = psztext.Right( 6 ); 
		}
		psztext  = szh;
		psztext  += pszInsert;
		//psztext  += szl;
		len = Str2Hex( psztext,(unsigned char*)sendByte );
		shortcrc= ::Get_CRC_Value( sendByte,len ); 
		hchar = shortcrc / 256;
		lchar = shortcrc % 256;
        
		if ( hchar < 0x10 )
           szl.Format( "0%X ",hchar ); 
		else
           szl.Format( "%X ",hchar ); 
        psztext += szl; 
		if ( lchar < 0x10 )
		   szl.Format( "0%X",lchar ); 
		else
           szl.Format( "%X",lchar ); 
        psztext += szl;
        m_Edit[0]->SetWindowText( psztext );
		//-------------------------------------------------
		break;
	case 2:
		MessageBox( "输入的数据类型错误。",TITLE,MB_ICONINFORMATION );
		m_editData->SetFocus(); 
		break;
	case 3:
		MessageBox( "输入的数据超长或数据类型错误。",TITLE,MB_ICONINFORMATION );
		m_editData->SetFocus();
		break;
	case 4:
		break;
	default:
		break;
	}
}

void CModBusToolDlg::OnButComport() 
{

	CString psztext;
	
	m_butPort->GetWindowText( psztext );
	if ( psztext == "关闭串口" )
	{
       if ( lpNewComThread != NULL )
	   {
		   delete lpNewComThread;
		   lpNewComThread = NULL;
	   }
       m_ComPort->EnableWindow( FALSE );
	   m_butPort->SetWindowText( "打开串口" );
	   m_bmpButton[0].EnableWindow( FALSE );
	}
	else
	{

       m_butPort->SetWindowText( "关闭串口" );
	   Change_Communication_Param();
	   m_ComPort->EnableWindow( TRUE ); 
	   m_bmpButton[0].EnableWindow( TRUE );
	}
}

void CModBusToolDlg::OnButConvent() 
{
	CString   pszUnicode,pszSource;
    int  u = lpNewConVert.DoModal();
    if ( u == 0 ) 	
		pszUnicode = lpNewConVert.m_EditAfter; 
    
	m_Edit[0]->GetWindowText( pszSource );
	if ( (pszSource != "") && pszUnicode != "" )
	{
        pszSource +=" ";
	    pszSource += pszUnicode;
		
	}
	else
	{
        pszSource = pszUnicode;
	}
	m_Edit[0]->SetWindowText( pszSource ); 

}

⌨️ 快捷键说明

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