📄 serialtcpdlg.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 + -