📄 porttestdlg.cpp
字号:
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 + -