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

📄 serialtcpdlg.cpp

📁 串口转TCPIP 实用程序,很实用的代码和code,我们可以学习串口和tcp ip的原理
💻 CPP
字号:
// SerialTcpDlg.cpp : implementation file
//

#include "stdafx.h"
#include "SerialTcp.h"
#include "SerialTcpDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CSerialTcpDlg dialog

#define WM_MY_TRAY_NOTIFICATION WM_USER+1

CSerialTcpDlg::CSerialTcpDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSerialTcpDlg::IDD, pParent),
	m_trayIcon(IDR_TRAYICON)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	for(int i=0; i<PORT_NUM; i++)
		m_arrItem[i] = NULL;

	m_bFull = 0;
	m_bVisible = false;
}

void CSerialTcpDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST_VIEW, m_lstView);
}

BEGIN_MESSAGE_MAP(CSerialTcpDlg, CDialog)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication)
	//}}AFX_MSG_MAP
	ON_WM_TIMER()
	ON_WM_WINDOWPOSCHANGING()
	ON_MESSAGE(WM_MY_TRAY_NOTIFICATION,	OnTrayNotification)
	ON_COMMAND(ID_TRAY_OPEN, &CSerialTcpDlg::OnTrayOpen)
	ON_WM_CLOSE()
	ON_COMMAND(ID_TRAY_EXIT, &CSerialTcpDlg::OnTrayExit)
END_MESSAGE_MAP()


// CSerialTcpDlg message handlers

BOOL CSerialTcpDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	//*************************************
	ReadConfigFile();
	//*************************************

	//************************************
	m_lstView.InsertColumn(0, "Item",LVCFMT_LEFT, 50);
	m_lstView.InsertColumn(1, "发送字节数",LVCFMT_LEFT, 90);
	m_lstView.InsertColumn(2, "接受字节数",LVCFMT_LEFT, 90);
	m_lstView.InsertColumn(3, "数据端口IP",LVCFMT_LEFT, 90);
	m_lstView.InsertColumn(4, "调试端口IP",LVCFMT_LEFT, 90);
	m_lstView.InsertColumn(5, "错误信息",LVCFMT_LEFT, 90);
	m_lstView.InsertColumn(6, "调试端口",LVCFMT_LEFT, 70);
	m_lstView.InsertColumn(7, "数据端口",LVCFMT_LEFT, 70);
	m_lstView.InsertColumn(8, "串口",LVCFMT_LEFT, 70);
	m_lstView.InsertColumn(9, "波特率",LVCFMT_LEFT, 70);
	m_lstView.InsertColumn(10, "日志记录",LVCFMT_LEFT, 70);
	m_lstView.ShowWindow(false);
	
	//m_ktList.SetItemColor(0/*行*/,(DWORD)RGB(255,255,0)/*颜色*/);
	//设置扩展项目
	m_lstView.SetExtendedStyle(LVS_EX_GRIDLINES);
	DWORD dwStyle = m_lstView.GetExtendedStyle();
	dwStyle |= LVS_EX_FULLROWSELECT;
	m_lstView.SetExtendedStyle(dwStyle);
	m_lstView.ShowWindow(SW_SHOW);

	for(int i=PORT_NUM-1; i>=0; i--)
	{
		if(m_arrItem[i])
		{
			CString strTemp;
			int nIndex = m_lstView.InsertItem(0, m_arrItem[i]->m_strItemName);
		}
	}
	RefreshList();
	SetTimer(5,1000,NULL);

	m_trayIcon.SetNotificationWnd(this, WM_MY_TRAY_NOTIFICATION);
	m_trayIcon.SetIcon(IDI_MYICON);

	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CSerialTcpDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CSerialTcpDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

//********************************************
//                                读取配置文件
//********************************************
void CSerialTcpDlg::ReadConfigFile()
{
	char buf[512];
	memset(buf, 0, 512);
	int iDataPort = 0;
	int iDebugPort = 0;
	int iBaud = 0;
	int iSerialPort = 0;

	CString szKeyDataPort = "TcpDataPort";
	CString szKeyDebugPort = "TcpDebugPort";
	CString szKeySerialPort = "SerialPort";
	CString szKeyBaud = "Baud";
	CString	szKeyLogFile = "LogFile";
	CString	szKeyLogOn = "LogOn";
	CString	szKeyEnabled = "Enabled";
	CString szSection;
	DWORD dwSize = 512;

	CString strOn = "On";
	CString strOff = "Off";

	CString strOn1 = "1";
	CString strOff1 = "0";

	
	//***************** 取得当前应用程序路径
	GetModuleFileName(NULL, buf, 512);
	CString strTemp_1 = buf;
	CString strDir;

	int iCharPos = 0;
	int Pos = 0;
	while(true)
	{
		if(iCharPos == -1)
		{
			strDir = strTemp_1.Left(Pos+1);
			break;
		}
		else
		{
			Pos = iCharPos;
			iCharPos = strTemp_1.Find("\\", iCharPos+1);
		}
	}

	CString strConfigPath;
	strConfigPath.Format("%sconfig.ini", strDir);

	for(int i=1; i<PORT_NUM+1; i++)
	{
		int temp = 0;
		szSection.Format("item%d", i);
		
		if(GetPrivateProfileString(szSection, szKeyDataPort,"", buf, dwSize, strConfigPath))
		{
			iDataPort = atoi(buf);
		}
		else
		{
			continue;
		}

		
		GetPrivateProfileString(szSection, szKeyEnabled,"Not Find", buf, dwSize, strConfigPath);
		CString strEnabled = buf;
		if (strEnabled != strOn1)// if  enabled != 1 
		{
			continue;
		}


		GetPrivateProfileString(szSection, szKeyDebugPort,"Not Find", buf, dwSize, strConfigPath);
		iDebugPort = atoi(buf);

		GetPrivateProfileString(szSection, szKeySerialPort,"Not Find", buf, dwSize, strConfigPath);
		iSerialPort = atoi(buf);

		GetPrivateProfileString(szSection, szKeyBaud,"Not Find", buf, dwSize, strConfigPath);
		iBaud = atoi(buf);

		GetPrivateProfileString(szSection, szKeyLogFile,"Not Find", buf, dwSize, strConfigPath);
		CString logFileName = buf;

		GetPrivateProfileString(szSection, szKeyLogOn,"Not Find", buf, dwSize, strConfigPath);
		CString logOn = buf;
		
		//********************* 生成 ITEM *************************
		for(int k=0; k<PORT_NUM; k++)
		{
			if(!m_arrItem[k])
			{
				m_arrItem[k] = new CItem;
				m_arrItem[k]->m_pParent = this;
				m_arrItem[k]->SetParentItem();
				m_arrItem[k]->m_iBaud = iBaud;
				m_arrItem[k]->m_iDataPort = iDataPort;
				m_arrItem[k]->m_iDebugPort = iDebugPort;
				m_arrItem[k]->m_iSerialPort = iSerialPort;
				m_arrItem[k]->m_strItemName = szSection;
				m_arrItem[k]->m_strLogFileName = logFileName;


				if (logOn == strOn || logOn == strOn1)
				{
					m_arrItem[k]->m_logFlag = 1;
				}
				else if (logOn == strOff || logOn == strOff1)
				{
					m_arrItem[k]->m_logFlag = 0;
				}

				//m_arrItem[k]->m_mistake = "";

				//************** 启动串口
				if(m_arrItem[k]->m_serialPort.InitPort(this, iSerialPort, iBaud))
				{
					m_arrItem[k]->m_serialPort.StartMonitoring();
					CString str;
					str.Format("串口打开成功");
					m_arrItem[k]->m_mistake = str;

					//************** 启动监听 SOCKET
					m_arrItem[k]->m_sockDateListen.Create(iDataPort, SOCK_STREAM, FD_READ|FD_WRITE|FD_CLOSE|FD_ACCEPT);
					m_arrItem[k]->m_sockDateListen.Listen();

					m_arrItem[k]->m_sockDebugListen.Create(iDebugPort, SOCK_STREAM, FD_CLOSE|FD_ACCEPT);
					m_arrItem[k]->m_sockDebugListen.Listen();
					//**************
				}
				else
				{
					CString str;
					str.Format("串口打开失败");
					m_arrItem[k]->m_mistake = str;
					//AfxMessageBox(str);
				}


				if(k == 4)
				{
					m_bFull = 1;
				}
				break;
			}
		}
		//*********************************************************
	}

}

//********************************************************
//                                       收串口数据处理
//********************************************************
LRESULT CSerialTcpDlg::OnCommunication(WPARAM ch, LPARAM port)
{
	UINT SerialPort = (UINT)port;
	int  DataLen = (int)ch;

	char buf[512];
	memset(buf, 0, 512);

	for(int i=0; i<PORT_NUM; i++)
	{
		if(m_arrItem[i]->m_serialPort.m_nPortNr == SerialPort)
		{
			memcpy(buf, m_arrItem[i]->m_serialPort.m_RXBuff, 512);
			//*********************** 发送数据 *******************
			if(m_arrItem[i]->m_dataSockInUse)	//发送到DataPort
			{
				m_arrItem[i]->m_sockDateMain.Send(buf, DataLen);

				char bufTemp[512];
				//写入日志
				memset(bufTemp, 0, 512);
				sprintf_s(bufTemp, 512, "COM%d => TCP %2d]", m_arrItem[i]->m_serialPort.m_nPortNr, DataLen);

				CTime timer_1;
				timer_1 = CTime::GetCurrentTime();
				CString s=timer_1.Format("[%H:%M:%S");

				char bufTemp1[512];
				memset(bufTemp1, 0, 512);
				sprintf_s(bufTemp1, 512, "%s %s", s, bufTemp);

				CString temp = bufTemp1;

				if (m_arrItem[i]->m_logFlag)
				{
					FILE* stream = fopen(m_arrItem[i]->m_strLogFileName, "a+");
					fwrite(temp, 1, temp.GetLength(), stream);
					fclose(stream);

					char buf1[5];
					
					stream = fopen(m_arrItem[i]->m_strLogFileName, "a+");

					if (DataLen>16)
					{
						DataLen = 16;
					}

					for (int i=0; i<DataLen; i++)
					{
						BYTE hex;
						hex = buf[i];
						sprintf(buf1, " %02X", hex);
						fwrite(buf1, 1, 3, stream);
					}
					fclose(stream);

					for(int i=0; i<16-DataLen; i++)
					{
						stream = fopen(m_arrItem[i]->m_strLogFileName, "a+");
						fwrite("   ", 1, 3, stream);
						fclose(stream);
					}

					//处理末尾的字符串
					stream = fopen(m_arrItem[i]->m_strLogFileName, "a+");
					fwrite(" [", 1, 2, stream);
					for (int i=0; i<DataLen; i++)
					{
						char temp12 = buf[i];
						if (temp12>= '0' && temp12 <= '9')
						{
							fwrite(&temp12, 1, 1, stream);
						}
						else if (temp12>= 'A' && temp12 <='Z')
						{
							fwrite(&temp12, 1, 1, stream);
						}
						else if (temp12>= 'a' && temp12 <= 'z')
						{
							fwrite(&temp12, 1, 1, stream);
						}
						else if (temp12 == ' ')
						{
							fwrite(&temp12, 1, 1, stream);
						}
						else if (temp12 == '@')
						{
							fwrite(&temp12, 1, 1, stream);
						}
						else if (temp12 == '#')
						{
							fwrite(&temp12, 1, 1, stream);
						}
						else if (temp12 == '$')
						{
							fwrite(&temp12, 1, 1, stream);
						}
						else if (temp12 == '%')
						{
							fwrite(&temp12, 1, 1, stream);
						}
						else if (temp12 == '^')
						{
							fwrite(&temp12, 1, 1, stream);
						}
						else if (temp12 == '&')
						{
							fwrite(&temp12, 1, 1, stream);
						}
						else if (temp12 == '*')
						{
							fwrite(&temp12, 1, 1, stream);
						}
						else if (temp12 == '(')
						{
							fwrite(&temp12, 1, 1, stream);
						}
						else if (temp12 == ')')
						{
							fwrite(&temp12, 1, 1, stream);
						}
						else if (temp12 == '=')
						{
							fwrite(&temp12, 1, 1, stream);
						}
						else
						{
							fwrite(".", 1, 1, stream);
						}
					}
					fwrite("]", 1, 1, stream);
					fwrite("\r\n", 1, 2, stream);
					fclose(stream);
				}
			}
			if(m_arrItem[i]->m_debugSockInUse)	//发送到DebugPort
			{
				char bufTemp[512];
				memset(bufTemp, 0, 512);
				sprintf_s(bufTemp, 512, "Out—> %s", buf);
				m_arrItem[i]->m_sockDebugMain.Send(bufTemp, DataLen+7);		
			}
			if(m_arrItem[i]->m_debugSockInUse || m_arrItem[i]->m_dataSockInUse)
			{
				m_arrItem[i]->m_iTotalSendDate += DataLen;
			}
			break;
		}
	}
	return 0;
}

//*****************************************************************
//                                                    刷新列表显示
//*****************************************************************
void CSerialTcpDlg::RefreshList()
{
	//m_lstView.DeleteAllItems();
	for (int i=0, j=0; i<PORT_NUM; i++)
	{
		if(m_arrItem[i])
		{
			CString strTemp;
			strTemp.Format("%d", m_arrItem[i]->m_iTotalSendDate);
			m_lstView.SetItemText(j, 1, strTemp);

			strTemp.Format("%d", m_arrItem[i]->m_iTotalRecvDate);
			m_lstView.SetItemText(j, 2, strTemp);

			m_lstView.SetItemText(j, 3, m_arrItem[i]->m_strDataLinkTo);
			m_lstView.SetItemText(j, 4, m_arrItem[i]->m_strDebugLinkTo);

			m_lstView.SetItemText(j, 5, m_arrItem[i]->m_mistake);

			strTemp.Format("%d", m_arrItem[i]->m_iDebugPort);
			m_lstView.SetItemText(j, 6, strTemp);

			strTemp.Format("%d", m_arrItem[i]->m_iDataPort);
			m_lstView.SetItemText(j, 7, strTemp);

			strTemp.Format("COM%d", m_arrItem[i]->m_iSerialPort);
			m_lstView.SetItemText(j, 8, strTemp);
			
			strTemp.Format("%d", m_arrItem[i]->m_iBaud);
			m_lstView.SetItemText(j, 9, strTemp);

			if (m_arrItem[i]->m_logFlag)
			{
				strTemp = "开";
			}
			else
			{
				strTemp = "关";
			}
			m_lstView.SetItemText(j, 10, strTemp);

			j++;

		}
	}
}
void CSerialTcpDlg::OnTimer(UINT_PTR nIDEvent)
{
	switch(nIDEvent)
	{
	case 5:
		RefreshList();
		CDialog::OnTimer(nIDEvent);
		break;
		/*
	case 1:
		m_arrItem[0]->m_mistake = m_strErr;
		KillTimer(1);
		break;
	case 2:
		m_arrItem[1]->m_mistake = m_strErr;
		KillTimer(2);
		break;
	case 3:
		m_arrItem[2]->m_mistake = m_strErr;
		KillTimer(3);
		break;
	case 4:
		m_arrItem[3]->m_mistake = m_strErr;
		KillTimer(4);
		break;
		*/
	default:
		break;
	}
	
}

void CSerialTcpDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
	CDialog::OnWindowPosChanging(lpwndpos);

	if(!m_bVisible)
	{
        lpwndpos->flags &= ~SWP_SHOWWINDOW;
	}
}

LRESULT CSerialTcpDlg::OnTrayNotification(WPARAM uID, LPARAM lEvent)
{
	m_bVisible = true;
	if(lEvent == WM_LBUTTONDBLCLK)
	{
		AttachThreadInput(GetWindowThreadProcessId(::GetForegroundWindow(), NULL),GetCurrentThreadId(),TRUE);
		ShowWindow(SW_RESTORE);
		SetForegroundWindow();
		SetFocus(); 
		AttachThreadInput(GetWindowThreadProcessId(::GetForegroundWindow(),NULL),GetCurrentThreadId(),FALSE);
	}
	return m_trayIcon.OnTrayNotification(uID, lEvent);
}
void CSerialTcpDlg::OnTrayOpen()
{
	AttachThreadInput(GetWindowThreadProcessId(::GetForegroundWindow(), NULL),GetCurrentThreadId(),TRUE);
	ShowWindow(SW_RESTORE);
	SetForegroundWindow();
	SetFocus(); 
	AttachThreadInput(GetWindowThreadProcessId(::GetForegroundWindow(),NULL),GetCurrentThreadId(),FALSE);
}

void CSerialTcpDlg::OnClose()
{
	// TODO: Add your message handler code here and/or call default

	ShowWindow(SW_HIDE);
	m_trayIcon.SetIcon(IDI_MYICON);
}

void CSerialTcpDlg::OnTrayExit()
{
	OnOK();
}

void CSerialTcpDlg::SetErrTimer(int ID)
{
	SetTimer(ID, 3000, NULL);
}

⌨️ 快捷键说明

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