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

📄 tcp2serialdlg.cpp

📁 这是一个串口和以太网口的透传转换程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		str.Format( "%d", count );
		m_list.SetItemText( 0, 1, str );
		if ( OnProcessNetWorkComData( buffer, len ) )
		{
		}
	}
}

BOOL CTcp2SerialDlg::OnProcessSerialComData( BYTE* pBuf, int len )
{
	memcpy( &m_SerialData.buffer[m_SerialData.len], pBuf, len );
	m_SerialData.len += len;
	if ( m_SerialData.len >= m_dt1info.needlen )
	{
		BYTE temp[32];
		switch( m_dt1info.cmd )
		{
		case 0x05:
			{
				strtemp tempdata;
				tempdata.realvalue = (float)((*(WORD*)pBuf)/100.0f);
				tempdata.head[0] = 0xeb; tempdata.head[1] = 0x90;
				tempdata.cmd = m_SendNetData.cmd;
				tempdata.len = sizeof(tempdata.realvalue);
				tempdata.sum = GetSumCheck8( (BYTE*)&tempdata.realvalue, sizeof(tempdata.realvalue) );
				tempdata.end = 0x03;
				m_tcpClient.Send( &tempdata, sizeof(tempdata) );
				memset( &tempdata, 0, sizeof( tempdata ) );
				memset( &m_SerialData, 0, sizeof( m_SerialData ) );
				return FALSE;
			}
			break;
		case 0x07:
		case 0x0d:
			m_dt1data.passvalue = (float)(*((WORD*)pBuf)/100.0f);
			m_dt1data.upvalue = (float)(*((WORD*)pBuf+1)/100.0f);
			m_dt1data.downvalue = (float)(*((WORD*)pBuf+2)/100.0f);
			m_dt1data.passtime = *(WORD*)&pBuf[6];
			m_dt1data.uptime = *(WORD*)&pBuf[8];
			m_dt1data.downtime = *(WORD*)&pBuf[10];
			m_sendNetWorkLen += 24;
			break;
		case 0x09:
		case 0x0b:
		case 0x0f:
		case 0x11:
			m_dt1data.passvalue = (float)(*((WORD*)pBuf)/100.0f);
			m_dt1data.upvalue = (float)(*((WORD*)pBuf+1)/100.0f);
			m_dt1data.downvalue = (float)(*((WORD*)pBuf+2)/100.0f);
			m_dt1data.passtime = *(DWORD*)&pBuf[6];
			m_dt1data.uptime = *(DWORD*)&pBuf[10];
			m_dt1data.downtime = *(DWORD*)&pBuf[14];
			m_sendNetWorkLen += 24;
			break;
		case 0x06:
			{
				m_dt1data.average = (float)(*( (WORD*)pBuf )/100.0f);
				m_dt1data.max = (float)(*( (WORD*)pBuf+1 )/100.0f);
				m_dt1data.min = (float)(*( (WORD*)pBuf+2 )/100.0f);
				memcpy( temp, &pBuf[6], 4);
				m_dt1data.time =  *(DWORD*)temp&0x00ff;
				memcpy( temp, &pBuf[10], 6 );
				struDT1Time time = BCD2Hex( temp, 6 );
				memcpy( &m_dt1data.maxtime, &time, sizeof(time) );
				memcpy( temp, &pBuf[16], 6 );
				time = BCD2Hex( temp, 6 );
				memcpy( &m_dt1data.mintime, &time, sizeof(time) );
				m_sendNetWorkLen += 28;
			}
			break;
		case 0x08:
		case 0x0a:
		case 0x0c:
		case 0x0e:
		case 0x10:
			{
				m_dt1data.average = (float)(*( (WORD*)pBuf )/100.0f);
				m_dt1data.max = (float)(*( (WORD*)pBuf+1 )/100.0f);
				m_dt1data.min = (float)(*( (WORD*)pBuf+2 )/100.0f);
				memcpy( temp, &pBuf[6], 4);
				m_dt1data.time =  *(DWORD*)temp;
				memcpy( temp, &pBuf[10], 6 );
				struDT1Time time = BCD2Hex( temp, 6 );
				memcpy( &m_dt1data.maxtime, &time, sizeof(time) );
				memcpy( temp, &pBuf[16], 6 );
				time = BCD2Hex( temp, 6 );
				memcpy( &m_dt1data.mintime, &time, sizeof(time) );
				m_sendNetWorkLen += 28;
			}
			break;
		default:
			break;
		}
		memset( &m_SerialData, 0, sizeof( m_SerialData ) );
		return TRUE;
	}
	return FALSE;
}

BOOL CTcp2SerialDlg::OnProcessNetWorkComData( BYTE* pBuf, int len )
{
	memcpy( &m_NetWorkData.buffer[m_NetWorkData.len], pBuf, len );
	m_NetWorkData.len += len;
	int m_old_len = m_NetWorkData.len;
	BYTE* pData;
	while ( m_NetWorkData.len >= 4 )
	{
		pData = &m_NetWorkData.buffer[m_old_len-m_NetWorkData.len];
		if ( pData[0] != 0xeb ||
			 pData[1] != 0x90 )
		{
			m_NetWorkData.len--;
			continue;
		}
		else
		{
			if ( m_NetWorkData.len < (DWORD)pData[3]+6 )
			{
				return FALSE;
			}
			else if ( pData[pData[3]+5] != 0x03 )
			{
				memset( &m_NetWorkData, 0, sizeof( m_NetWorkData ) );
				return FALSE;
			}
			else if ( GetSumCheck8( pData+2, pData[3]+2 ) != pData[pData[3]+4] )
			{
				memset( &m_NetWorkData, 0, sizeof( m_NetWorkData ) );
				return FALSE;
			}
			else
			{
				switch( pData[2] )
				{
				case 0x14:
					m_sendflag |= DT1_REAL_VALUE;
					m_SendNetData.cmd = 0x14;
					break;
				case 0x15:
					m_sendflag |= DT1_TODAY_DATA_1;
					m_sendflag |= DT1_TODAY_DATA_2;
					m_SendNetData.cmd = 0x15;
					break;
				case 0x16:
					m_sendflag |= DT1_TOMONTH_DATA_1;
					m_sendflag |= DT1_TOMONTH_DATA_2;
					m_SendNetData.cmd = 0x16;
					break;
				case 0x17:
					m_sendflag |= DT1_TOSEASON_DATA_1;
					m_sendflag |= DT1_TOSEASON_DATA_2;
					m_SendNetData.cmd = 0x17;
					break;
				case 0x18:
					m_sendflag |= DT1_LASTDAY_DATA_1;
					m_sendflag |= DT1_LASTDAY_DATA_2;
					m_SendNetData.cmd = 0x18;
					break;
				case 0x19:
					m_sendflag |= DT1_LASTMONTH_DATA_1;
					m_sendflag |= DT1_LASTMONTH_DATA_2;
					m_SendNetData.cmd = 0x19;
					break;
				case 0x1A:
					m_sendflag |= DT1_LASTSEASON_DATA_1;
					m_sendflag |= DT1_LASTSEASON_DATA_2;
					m_SendNetData.cmd = 0x1a;
					break;
				}
				OnWriteToSerial();
				m_NetWorkData.len -= (pData[3]+6);
				continue;
			}
		}
	}
	int size = m_old_len-m_NetWorkData.len;
	if ( size <= 0 )
	{
		return TRUE;
	}
	memcpy( m_NetWorkData.buffer, &m_NetWorkData.buffer[size], m_NetWorkData.len );
	return TRUE;
}

void CTcp2SerialDlg::OnWriteToNetWork()
{
	memcpy( &m_SendNetData.dt1data, &m_dt1data, sizeof(m_dt1data) );
	m_SendNetData.head[0] = 0xeb; m_SendNetData.head[1] = 0x90;
	m_SendNetData.sumcheck = GetSumCheck8( (BYTE*)&m_dt1data, sizeof(m_dt1data) );
	m_SendNetData.len = sizeof(m_dt1data);
	m_SendNetData.enddata = 0x03;
	m_tcpClient.Send( (BYTE*)&m_SendNetData, sizeof(m_SendNetData) );
	static count = 0;
	count += sizeof(m_SendNetData);
	CString str;
	str.Format( "%d", count );
	m_list.SetItemText( 0, 0, str );
	memset( &m_SendNetData, 0, sizeof(m_SendNetData) );
}

void CTcp2SerialDlg::OnWriteToSerial()
{
	BYTE buffer[52];
	int len = 52;

	memset( buffer, 0xff, sizeof(buffer) );
	buffer[50] = 0x01;
	if ( m_sendflag&DT1_REAL_VALUE )
	{
		m_sendflag&=~DT1_REAL_VALUE;
		buffer[51] = 05;
		m_dt1info.needlen = 2;
	}
	else if ( m_sendflag&DT1_TODAY_DATA_1 )
	{
		m_sendflag&=~DT1_TODAY_DATA_1;
		buffer[51] = 06;
		m_dt1info.needlen = 22;
	}
	else if ( m_sendflag&DT1_TODAY_DATA_2 )
	{
		m_sendflag&=~DT1_TODAY_DATA_2;
		buffer[51] = 0x07;
		m_dt1info.needlen = 12;
	}
	else if ( m_sendflag&DT1_TOMONTH_DATA_1 )
	{
		m_sendflag&=~DT1_TOMONTH_DATA_1;
		buffer[51] = 0x08;
		m_dt1info.needlen = 22;
	}
	else if ( m_sendflag&DT1_TOMONTH_DATA_2 )
	{
		m_sendflag&=~DT1_TOMONTH_DATA_2;
		buffer[51] = 0x09;
		m_dt1info.needlen = 18;
	}
	else if ( m_sendflag&DT1_TOSEASON_DATA_1 )
	{
		m_sendflag&=~DT1_TOSEASON_DATA_1;
		buffer[51] = 0x0a;
		m_dt1info.needlen = 22;
	}
	else if ( m_sendflag&DT1_TOSEASON_DATA_2 )
	{
		m_sendflag&=~DT1_TOSEASON_DATA_2;
		buffer[51] = 0x0b;
		m_dt1info.needlen = 18;
	}
	else if ( m_sendflag&DT1_LASTDAY_DATA_1 )
	{
		m_sendflag&=~DT1_LASTDAY_DATA_1;
		buffer[51] = 0x0c;
		m_dt1info.needlen = 22;
	}
	else if ( m_sendflag&DT1_LASTDAY_DATA_2 )
	{
		m_sendflag&=~DT1_LASTDAY_DATA_2;
		buffer[51] = 0x0d;
		m_dt1info.needlen = 12;
	}
	else if ( m_sendflag&DT1_LASTMONTH_DATA_1 )
	{
		m_sendflag&=~DT1_LASTMONTH_DATA_1;
		buffer[51] = 0x0e;
		m_dt1info.needlen = 22;
	}
	else if ( m_sendflag&DT1_LASTMONTH_DATA_2 )
	{
		m_sendflag&=~DT1_LASTMONTH_DATA_2;
		buffer[51] = 0x0f;
		m_dt1info.needlen = 18;
	}
	else if ( m_sendflag&DT1_LASTSEASON_DATA_1 )
	{
		m_sendflag&=~DT1_LASTSEASON_DATA_1;
		buffer[51] = 0x10;
		m_dt1info.needlen = 22;
	}
	else if ( m_sendflag&DT1_LASTSEASON_DATA_2 )
	{
		m_sendflag&=~DT1_LASTSEASON_DATA_2;
		buffer[51] = 0x11;
		m_dt1info.needlen = 18;
	}
	m_dt1info.cmd = buffer[51];
	m_com.WriteData( buffer, len );
}

void CTcp2SerialDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	switch( nIDEvent )
	{
	case 999:
		m_nCount++;
		if ( m_nCount >= 20 )
		{
			memset( &m_SerialData, 0, sizeof( m_SerialData ) );
			m_nCount = 0;
		}
		break;
	}
	CDialog::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

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