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

📄 porttestdlg.cpp

📁 串口测试工具
💻 CPP
📖 第 1 页 / 共 2 页
字号:

void CPortTestDlg::OnClear()		//清除发送和接收缓冲区
{
	m_strSendTextHex = "" ;
	m_strSendTextAscii = "" ;
	m_strRecvTextHex = "" ;
	m_strRecvTextAscii = "" ;
	SetDlgItemText( IDC_SENDTEXT, "" ) ;
	SetDlgItemText( IDC_RECVTEXT, "" ) ;
}

void CPortTestDlg::OnOut()			//手动发送数据
{
	if( !m_MsComm.GetPortOpen() )
	{
		AfxMessageBox( "串口尚未打开!" ) ;
		return ;
	}
	if( m_AutoSend )
	{
		AfxMessageBox( "处于自动发送状态!" ) ;
		return ;
	}

	int nLen = ( m_strSendSetHex.GetLength() + 1 )/3 ;	//待发字节数
	if( nLen > 0 )	//待发送数据不为空
	{
		CByteArray OutBuf ; 
		COleVariant varOutput ; 
		OutBuf.SetSize( nLen ) ; 
		for( int i = 0; i < nLen; i++ )		//求发送字节
			OutBuf[i] = GetHexFromStr( m_strSendSetHex.Mid( 3*i, 2 ) ) ;
		varOutput = OutBuf ; 
		m_MsComm.SetOutput( varOutput ) ;	//发送
		
		//更新变量内容
		if( m_strSendTextHex == "" )
			m_strSendTextHex = m_strSendTextHex + m_strSendSetHex ;
		else
			m_strSendTextHex = m_strSendTextHex + " " + m_strSendSetHex ;
		m_strSendTextAscii = m_strSendTextAscii + m_strSendSetAscii ;

		//最多显示3000字节
		if( m_strSendTextHex.GetLength() > 8999 )
		{
			m_strSendTextHex = m_strSendTextHex.Right( 8999 ) ;
			m_strSendTextAscii = m_strSendTextAscii.Right( 3000 ) ;
		}
		
		if( m_AsciiHex )	//更新发送显示
			SetDlgItemText( IDC_SENDTEXT, m_strSendTextHex ) ;
		else
			SetDlgItemText( IDC_SENDTEXT, m_strSendTextAscii ) ;
	}
}

void CPortTestDlg::OnKillfocusSendset()		//整理输入数据
{
	CString strComp ;
	GetDlgItemText( IDC_SENDSET, strComp ) ;

	m_strSendSetAscii = "" ;	//清空
	m_strSendSetHex = "" ;		

	CString strTmp ;
	GetDlgItemText( IDC_SENDSET, strTmp ) ;	//取IDC_SENDSET的输入内容	

	int nLen = strTmp.GetLength() ;
	if( m_AsciiHex )	//十六进制
	{
		CString tmp ;
		for( int i = 0; i < nLen; i++ )		//去非法字符
		{
			if( ( strTmp.GetAt(i) >= '0' && strTmp.GetAt(i) <= '9' ) || ( strTmp.GetAt(i) >= 'A' && strTmp.GetAt(i) <= 'F' ) )
				tmp += strTmp.GetAt(i) ;
		}
		nLen = tmp.GetLength() ;
		if( nLen%2 )	//奇数最后字节补0
		{
			tmp.Insert( nLen-1, "0" ) ;
			nLen++ ;
		}
		for( i = 0; i < nLen; i++ )		//插入空格
		{
			m_strSendSetHex += tmp.GetAt(i) ;
			if( (i%2) && (i != nLen-1) ) m_strSendSetHex += " " ;
		}
		nLen = (m_strSendSetHex.GetLength() + 1)/3 ;	//求对应的ASCII表示
		for( i = 0; i < nLen; i++ )
			m_strSendSetAscii += GetHexFromStr( m_strSendSetHex.Mid( 3*i,2 ) ) ;
		//设置IDC_SENDSET的内容
		if( m_strSendSetHex != strComp )
			SetDlgItemText( IDC_SENDSET, m_strSendSetHex ) ;
	}
	else				//ASCII码
	{
		m_strSendSetAscii = strTmp ;
		for( int j = 0; j < nLen; j++ )		//求对应的十六进制表示
		{
			m_strSendSetHex += GetStrFromHex( m_strSendSetAscii.GetAt(j) ) ;
			if(j != nLen-1) m_strSendSetHex += " " ;
		}
	}
}

BYTE CPortTestDlg::GetHexFromStr(CString str)	//两个字符转换为16进制数,免维护
{
	if( str.GetAt( 0 ) > '9' )
	{
		if( str.GetAt( 1 ) > '9' )
		{
			return( 16 * ( str.GetAt( 0 ) - 'A' + 10 ) + ( str.GetAt( 1 ) - 'A' + 10 ) ) ;		
		}
		else
		{
			return( 16 * ( str.GetAt( 0 ) - 'A' + 10 ) + ( str.GetAt( 1 ) - '0' ) ) ;
		}
	}
	else
	{
		if( str.GetAt( 1 ) > '9' )
		{
			return( 16 * ( str.GetAt( 0 ) - '0' ) + ( str.GetAt( 1 ) - 'A' + 10 ) ) ;
		}
		else
		{
			return( 16 * ( str.GetAt( 0 ) - '0' ) + ( str.GetAt( 1 ) - '0' ) ) ;
		}
	}
}

CString CPortTestDlg::GetStrFromHex( BYTE hex )		//十六进制数转换为2字符,免维护
{
	CString tmp ;
	if( hex/16 < 10 )
		tmp += hex/16 + 0x30 ;
	else
		tmp += hex/16 - 10 + 0x41 ;

	if( hex%16 < 10 )
		tmp += hex%16 + 0x30 ;
	else
		tmp += hex%16 - 10 + 0x41 ;

	return tmp ;
}

void CPortTestDlg::OnAscii()		//ASCII显示
{
	SetDlgItemText( IDC_SENDTEXT, m_strSendTextAscii ) ;
	SetDlgItemText( IDC_RECVTEXT, m_strRecvTextAscii ) ;
	SetDlgItemText( IDC_SENDSET, m_strSendSetAscii ) ;
	UpdateData( true ) ;	//更新m_AsciiHex的值
}

void CPortTestDlg::OnHex()			//十六进制显示
{
	SetDlgItemText( IDC_SENDTEXT, m_strSendTextHex ) ;
	SetDlgItemText( IDC_RECVTEXT, m_strRecvTextHex ) ;
	SetDlgItemText( IDC_SENDSET, m_strSendSetHex ) ;
	UpdateData( true ) ;	//更新m_AsciiHex的值
}

void CPortTestDlg::OnAutosend()		//自动发送
{
	UpdateData( true ) ;
	if( m_AutoSend )
		SetTimer( 2, m_TimeSpace, NULL ) ;	//设置定时器
	else
		KillTimer( 2 ) ;
}

void CPortTestDlg::OnKillfocusTimespace()	//修改发送间隔
{
	UpdateData( true ) ;
	if( m_TimeSpace < 100 || m_TimeSpace > 10000 )	//非有效值
	{
		m_TimeSpace = 1000 ;	//设为缺省值
		UpdateData( false ) ;
	}
	if( m_AutoSend )			//如果在自动发送状态
	{
		KillTimer( 2 ) ;
		SetTimer( 2, m_TimeSpace, NULL ) ;	//重设定时器
	}
}

void CPortTestDlg::OnSet()		//设置通讯参数
{
	CPortSet m_dlg ;	
	if( m_dlg.DoModal() == IDOK )		//确定修改
	{
		if( m_MsComm.GetPortOpen() )			//串口处于打开状态
		{
			m_MsComm.SetPortOpen( false ) ;		//关闭
			m_MsComm.SetCommPort( PortNo ) ;	//新串口
			m_MsComm.SetSettings( PortSet ) ;	//新设置
			m_MsComm.SetPortOpen( true ) ;		//打开
		}
		else
		{
			m_MsComm.SetCommPort( PortNo ) ;	//新串口
			m_MsComm.SetSettings( PortSet ) ;	//新设置
		}
	}
}

void CPortTestDlg::OnSum()	//校验和,取2字节,低前高后,主要针对许继规约
{
	WORD Sum = 0 ;

	int start = 0, end = 0 ;
	m_SendSet.GetSel( start, end ) ;

	CString strSel ;
	if( m_AsciiHex )	//十六进制
	{
		strSel = m_strSendSetHex.Mid( start, end - start ) ;

		if( (strSel.GetLength()+1)%3 != 0 ) return ;
		if( strSel.GetAt(0) == ' ' || strSel.GetAt(1) == ' ' ) return ;
		
		for( int i = 0; i < (strSel.GetLength()+1)/3; i++ )
		{
			Sum += GetHexFromStr( strSel.Mid( 3*i,2 ) ) ;
		}
		m_strSendSetHex = m_strSendSetHex + " " + GetStrFromHex( LOBYTE(Sum) ) + " " + GetStrFromHex( HIBYTE(Sum) ) ;
		m_strSendSetAscii += LOBYTE(Sum) ;
		m_strSendSetAscii += HIBYTE(Sum) ;
		SetDlgItemText( IDC_SENDSET, m_strSendSetHex ) ;
	}
	else				//ASCII码
	{
		strSel = m_strSendSetAscii.Mid( start, end - start ) ;
		if( strSel.GetLength() == 0 ) return ;
		for( int i = 0; i < strSel.GetLength(); i++ )
		{
			Sum += strSel.GetAt(i) ;
		}
		m_strSendSetHex = m_strSendSetHex + " " + GetStrFromHex( LOBYTE(Sum) ) + " " + GetStrFromHex( HIBYTE(Sum) ) ;
		m_strSendSetAscii += LOBYTE(Sum) ;
		m_strSendSetAscii += HIBYTE(Sum) ;
		SetDlgItemText( IDC_SENDSET, m_strSendSetAscii ) ;
	}
}

void CPortTestDlg::OnLpc()		//求LPC校验
{
	BYTE Lpc = 0 ;

	int start = 0, end = 0 ;
	m_SendSet.GetSel( start, end ) ;

	CString strSel ;
	if( m_AsciiHex )	//十六进制
	{
		strSel = m_strSendSetHex.Mid( start, end - start ) ;

		if( (strSel.GetLength()+1)%3 != 0 ) return ;
		if( strSel.GetAt(0) == ' ' || strSel.GetAt(1) == ' ' ) return ;
		
		for( int i = 0; i < (strSel.GetLength()+1)/3; i++ )
		{
			Lpc ^= GetHexFromStr( strSel.Mid( 3*i,2 ) ) ;
		}
		Lpc ^= 0xff ;
		m_strSendSetHex = m_strSendSetHex + " " + GetStrFromHex( Lpc ) ;
		m_strSendSetAscii += Lpc ;
		SetDlgItemText( IDC_SENDSET, m_strSendSetHex ) ;
	}
	else				//ASCII码
	{
		strSel = m_strSendSetAscii.Mid( start, end - start ) ;
		if( strSel.GetLength() == 0 ) return ;
		for( int i = 0; i < strSel.GetLength(); i++ )
		{
			Lpc ^= strSel.GetAt(i) ;
		}
		Lpc ^= 0xff ;
		m_strSendSetHex = m_strSendSetHex + " " + GetStrFromHex( Lpc ) ;
		m_strSendSetAscii += Lpc ;
		SetDlgItemText( IDC_SENDSET, m_strSendSetAscii ) ;
	}
}

void CPortTestDlg::OnCrc8()		//CRC8,针对CDT远动规约
{
	BYTE CRC8 = 0 ;
	BYTE btBuf[6] ;

	int start = 0, end = 0 ;
	m_SendSet.GetSel( start, end ) ;

	CString strSel ;
	if( m_AsciiHex )	//十六进制
	{
		strSel = m_strSendSetHex.Mid( start, end - start ) ;

		if( strSel.GetLength() != 14 ) return ;
		if( strSel.GetAt(0) == ' ' || strSel.GetAt(1) == ' ' ) return ;
		
		for( int i = 0; i < 5; i++ )
		{
			btBuf[i] = GetHexFromStr( strSel.Mid( 3*i,2 ) ) ;
		}
		CRC8 = CRC_8CODE( &btBuf[0] ) ;
		m_strSendSetHex = m_strSendSetHex + " " + GetStrFromHex( CRC8 ) ;
		m_strSendSetAscii += CRC8 ;
		SetDlgItemText( IDC_SENDSET, m_strSendSetHex ) ;
	}
	else				//ASCII码
	{
		strSel = m_strSendSetAscii.Mid( start, end - start ) ;
		if( strSel.GetLength() != 5 ) return ;
		for( int i = 0; i < 5; i++ )
		{
			btBuf[i] = strSel.GetAt(i) ;
		}
		CRC8 = CRC_8CODE( &btBuf[0] ) ;
		m_strSendSetHex = m_strSendSetHex + " " + GetStrFromHex( CRC8 ) ;
		m_strSendSetAscii += CRC8 ;
		SetDlgItemText( IDC_SENDSET, m_strSendSetAscii ) ;
	}
}

void CPortTestDlg::OnCrc16()	//CRC16,针对ModBus规约
{
	WORD CRC16 = 0 ;
	BYTE btBuf[256] ;

	int start = 0, end = 0 ;
	m_SendSet.GetSel( start, end ) ;

	CString strSel ;
	if( m_AsciiHex )	//十六进制
	{
		strSel = m_strSendSetHex.Mid( start, end - start ) ;

		if( (strSel.GetLength()+1)%3 != 0 ) return ;
		if( strSel.GetAt(0) == ' ' || strSel.GetAt(1) == ' ' ) return ;
		
		for( int i = 0; i < (strSel.GetLength()+1)/3; i++ )
		{
			btBuf[i] = GetHexFromStr( strSel.Mid( 3*i,2 ) ) ;
		}
		CRC16 = CRC_16CODE( &btBuf[0], (strSel.GetLength()+1)/3 ) ;
		m_strSendSetHex = m_strSendSetHex + " " + GetStrFromHex( HIBYTE(CRC16) ) + " " + GetStrFromHex( LOBYTE(CRC16) ) ;
		m_strSendSetAscii += HIBYTE( CRC16 ) ;
		m_strSendSetAscii += LOBYTE( CRC16 ) ;
		SetDlgItemText( IDC_SENDSET, m_strSendSetHex ) ;
	}
	else				//ASCII码
	{
		strSel = m_strSendSetAscii.Mid( start, end - start ) ;
		if( strSel.GetLength() == 0 ) return ;
		for( int i = 0; i < strSel.GetLength(); i++ )
		{
			btBuf[i] = strSel.GetAt(i) ;
		}
		CRC16 = CRC_16CODE( &btBuf[0], strSel.GetLength() ) ;
		m_strSendSetHex = m_strSendSetHex + " " + GetStrFromHex( HIBYTE(CRC16) ) + " " + GetStrFromHex( LOBYTE(CRC16) ) ;
		m_strSendSetAscii += HIBYTE( CRC16 ) ;
		m_strSendSetAscii += LOBYTE( CRC16 ) ;
		SetDlgItemText( IDC_SENDSET, m_strSendSetAscii ) ;
	}
}

BYTE CPortTestDlg::RX(BYTE cValue)		//求CRC8表
{
	short sGX = 0x0107 ;
	short sValue1 = 0 ;
	BYTE  cCrc = 0 ;

	sValue1 = ( cValue << 8 ) | 0x00 ;
	for( int i = 0; i < 8; i++ )
	{
		if( sValue1 & ( 0x01 << ( 15 - i ) ) )
		{
			sValue1 = sValue1 ^ ( sGX << ( 7 - i ) ) ; 
		}
	}
	cCrc = sValue1 & 0x00ff ;
	return cCrc ;
}

BYTE CPortTestDlg::CRC_8CODE(BYTE *packet)	//求CRC8校验码
{
	BYTE cCrcTmp = 0 ;
	BYTE cCrc = 0 ;
	cCrc = RX( packet[0] ) ;
	for( int i = 0; i < 4; i++ )
	{
		cCrcTmp=cCrc ^ packet[i+1] ;
		cCrc = RX( cCrcTmp ) ;
	}
	return cCrc ^ 0xff ;
}

WORD CPortTestDlg::CRC_16CODE(BYTE *packet, int nLen)	//求CRC16校验码
{
	BYTE HiCRC = 0xff ;
	BYTE LoCRC = 0xff ;
	int nIndex ;
	while( nLen-- )
	{
		nIndex = HiCRC ^ *packet++ ;
		HiCRC = LoCRC ^ CRCHi[nIndex] ;
		LoCRC = CRCLo[nIndex] ;
	}
	return ( HiCRC<<8 | LoCRC ) ; 
}

int CPortTestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if( CDialog::OnCreate(lpCreateStruct) == -1 )
		return -1 ;
	
	CenterWindow() ;		//对话框居中显示
	
	return 0 ;
}

BOOL CPortTestDlg::DestroyWindow() 
{
	UpdateData( TRUE ) ;
	if( m_AutoSend )
		KillTimer( 2 ) ;
	KillTimer( 1 ) ;
	return CDialog::DestroyWindow();
}

⌨️ 快捷键说明

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