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

📄 faketolcanview.cpp

📁 功能主要是串口通信和网络通信方面的
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		{
			m_bSP = FALSE;
			if (m_bNW == FALSE)
			{
				KillTimer(1);
			}
		}
		if (flag == 1)
		{
			return;
		}

		m_strCmd += m_strRecvData;
		m_strCmd += "\r\n";
		m_strRecvData = "";
		m_bCollectData = FALSE;
//		m_nCollectCmd = 0;
	}

	if (m_strRecvData == "8902")
	{
		m_strCmd += m_strRecvData;
		m_strCmd += "\r\n";
		m_strRecvData.Empty();
	}

	if (m_strRecvData == "8903")
	{
		if (!m_strNodeInfo.IsEmpty())
		{
			ADOConn m_AdoConn;
			m_AdoConn.OnInitADOConn();
			CString sql;
			sql.Format("delete from Nodes");
			m_AdoConn.ExecuteSQL((_bstr_t)sql);
			CString strNodeNum;
			strNodeNum = m_strNodeInfo.Mid(4, 2);
			//int iNodeNum = atoi(strNodeNum); // 有问题啊
			int iNodeNum = strtoul(strNodeNum, NULL, 16);
			m_strNodeInfo = m_strNodeInfo.Right(m_strNodeInfo.GetLength() - 6);
			for (int i = 0; i < iNodeNum; i++)
			{
				CString strNodeId = m_strNodeInfo.Mid(0, 8);
				CString strByteNum = m_strNodeInfo.Mid(8, 2);
				CString strNodeOrder = m_strNodeInfo.Mid(10, 2);
				CString strSmallInterval = m_strNodeInfo.Mid(12, 4);
				CString strBigInterval = m_strNodeInfo.Mid(16, 4);
				CString strWayNum = m_strNodeInfo.Mid(20, 2);
				DWORD dwNodeId = strtoul(strNodeId, NULL, 16);
				CopyMemory(&m_NodeNO, &dwNodeId, 2);
				CString strNodeNo;
				strNodeNo.Format("%d", m_NodeNO);
				CString strMonth = strNodeId.Mid(2, 2);
				int iMonth = strtoul(strMonth, NULL, 16);
				strMonth.Format("%d", iMonth);
				CString strNodeType = strNodeId.Mid(0, 2);
				m_iNodeType = strtoul(strNodeType, NULL, 16);
				//strNodeType.Format("%d", m_iNodeType);
				if (m_iNodeType == 0)
				{
					strNodeType = "深度节点";
				}
				else if (m_iNodeType == 1)
				{
					strNodeType = "泵冲节点";
				}
				else if (m_iNodeType == 2)
				{
					strNodeType = "4-20mA模拟节点";
				}
				else if (m_iNodeType == 3)
				{
					strNodeType = "色谱节点";
				}
				BYTE byteNum = (BYTE)strtoul(strByteNum, NULL, 16);
				strByteNum.Format("%d", byteNum);
				BYTE nodeOrder = (BYTE)strtoul(strNodeOrder, NULL, 16);
				strNodeOrder.Format("%d", nodeOrder);
				USHORT smallInterval = (USHORT)strtoul(strSmallInterval, NULL, 16);
				strSmallInterval.Format("%d", smallInterval);
				USHORT bigInterval = (USHORT)strtoul(strBigInterval, NULL, 16);
				strBigInterval.Format("%d", bigInterval);
				BYTE wayNum = (BYTE)strtoul(strWayNum, NULL, 16);
				strWayNum.Format("%d", wayNum);
				m_strNodeInfo = m_strNodeInfo.Right(m_strNodeInfo.GetLength() - 32);
				sql.Format("INSERT INTO Nodes VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s')",\
					strNodeId,strNodeNo,strMonth,strNodeType,strByteNum,strNodeOrder,strSmallInterval,strBigInterval,strWayNum);
				m_AdoConn.ExecuteSQL((_bstr_t)sql);
			}
			m_AdoConn.ExitConnect();
		}
		m_strCmd += m_strRecvData;
		m_strCmd += "\r\n";
		m_strRecvData.Empty();

		ModifyNodesOrder();
		m_bNodeChange = TRUE;
		m_NodeList.DeleteAllItems();
		UpdateNodeList();
		m_NodeList.InsertItem(ReturnNodeNum()+1,0);

		//add at 08-11-21
		CString strNum;
		strNum.Format("%d", ReturnNodeNum());
		SetDlgItemText(IDC_STATIC_NODE_NUM, strNum);
	}

	if (m_strRecvData == "8904")
	{
		m_strCmd += m_strRecvData;
		m_strCmd += "\r\n";
		m_strRecvData.Empty();
	}

	if (m_strRecvData == "8905")
	{
		m_strCmd += m_strRecvData;
		m_strCmd += "\r\n";
		m_strRecvData.Empty();
	}

	if (m_strRecvData == "8906")
	{
		m_strCmd += m_strRecvData;
		m_strCmd += "\r\n";
		m_strRecvData.Empty();
	}

	if (m_strRecvData == "8907")
	{
		m_strCmd += m_strRecvData;
		m_strCmd += "\r\n";
		m_strRecvData.Empty();
		ReturnNodeId(flag);
	}

	if (m_strRecvData == "8908")
	{
		m_strCmd += m_strRecvData;
		m_strCmd += "\r\n";
		m_strRecvData.Empty();
	}

	if (m_strRecvData == "8909")
	{
		m_strCmd += m_strRecvData;
		m_strCmd += "\r\n";
		m_strRecvData.Empty();
		ReturnNodeInfo(flag);
	}

	static BOOL bFind89oa = TRUE;
	static int len = 0;
	if(bFind89oa)
	{
		if (m_strRecvData.Left(4) == "890A")
		{		
			if (m_strRecvData.GetLength() >= 6)
			{
				CString str;
				str = m_strRecvData.Mid(4, 2);
				//LPTSTR num = str.GetBuffer(2);
				//strcpy(num, m_strRecvData.Mid(4, 2).GetBuffer(0));
				//len = atoi(num); // num为个位数时,没有问题,但是......
				len = strtoul(str, NULL, 16);
				len = len * 16 + 3;
				len = len * 2;
				bFind89oa = FALSE;
			}
		}
	}
	if (!bFind89oa)
	{
		if (len && (m_strRecvData.GetLength() == len))
		{
			m_strNodeInfo = m_strRecvData;
			m_strCmd += m_strRecvData;
			m_strCmd += "\r\n";
			m_strRecvData.Empty();
			bFind89oa = TRUE;
		}
	}
	
	if (m_strRecvData == "890B")
	{
		m_strCmd += m_strRecvData;
		m_strCmd += "\r\n";
		m_strRecvData.Empty();
	}

	UpdateData(FALSE);  //将接收到的字符显示在接收编辑框中
	CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT_RECV_DATA);
	pEdit->LineScroll(pEdit->GetLineCount());
}

void CFakeTolcanView::OnNetWorkConfig() 
{
	// TODO: Add your command handler code here
	CServerDlg dlg;
	if (IDOK == dlg.DoModal())
	{
		m_iPort = dlg.m_iPort;
		SaveParamInfo();
		if(!CreateAndListen(m_iPort))
		{
			MessageBox("启动服务出错!");
			return;
		}
	}
}

long CFakeTolcanView::OnSocket(WPARAM wParam, LPARAM lParam)
{
	SOCKADDR_IN addrFrom;
	int len=sizeof(SOCKADDR);
	// 取得有事件发生的套节字句柄
	SOCKET s = wParam;
	// 查看是否出错
	if(WSAGETSELECTERROR(lParam))
	{
		RemoveClient(s);
		closesocket(s);
		return 0;
	}
	// 处理发生的事件
	switch(WSAGETSELECTEVENT(lParam))
	{
	case FD_ACCEPT:		// 监听中的套接字检测到有连接进入
		{
			if(m_nClient < MAX_SOCKET)
			{
				// 接受连接请求,新的套节字client是新连接的套节字
//				SOCKET client = ::accept(s, NULL, NULL);
				SOCKET client = accept(s, (SOCKADDR*)&addrFrom, &len);
				// 设置新的套节字为窗口通知消息类型
				int i = WSAAsyncSelect(client, 
					m_hWnd, WM_SOCKET, FD_READ|FD_WRITE|FD_CLOSE);
				AddClient(client);
			}
			else
			{
				MessageBox("连接客户太多!");
			}
		}
		break;

	case FD_CLOSE:		// 检测到套接字对应的连接被关闭。
		{
			RemoveClient(s);
			BOOL bFind = FALSE;
			int nCount = m_SockArray0.GetSize();
			for (int i = 0; i < nCount; i++)
			{
				if (m_SockArray0.GetAt(i) == s)
				{
					m_SockArray0.RemoveAt(i);
					bFind = TRUE;
					break;
				}
			}
			if (bFind)
			{
				nCount = m_SockArray0.GetSize();
				if (nCount == 0)
				{
					m_bNW = FALSE;
					if (m_bSP == FALSE)
					{
						KillTimer(1);
						m_bCollectData = FALSE;
					}					
				}
			}
			closesocket(s);
		}
		break;

	case FD_READ:		// 套接字接受到对方发送过来的数据包
		{
/*
			// 取得对方的IP地址和端口号(使用getpeername函数)
			// Peer对方的地址信息
			sockaddr_in sockAddr;
			memset(&sockAddr, 0, sizeof(sockAddr));
			int nSockAddrLen = sizeof(sockAddr);
			getpeername(s, (SOCKADDR*)&sockAddr, &nSockAddrLen);
			// 转化为主机字节顺序
			int nPeerPort = ntohs(sockAddr.sin_port);
			// 转化为字符串IP
			CString sPeerIP = inet_ntoa(sockAddr.sin_addr);
			
				// 取得对方的主机名称
			// 取得网络字节顺序的IP值
			DWORD dwIP = inet_addr(sPeerIP);
			// 获取主机名称,注意其中第一个参数的转化
			hostent* pHost = ::gethostbyaddr((LPSTR)&dwIP, 4, AF_INET);
			char szHostName[256];
			strncpy(szHostName, pHost->h_name, 256);		 
*/
			// 接受真正的网络数据
			BYTE szText[1024] = { 0 };
			int retval = recv(s, (char *)szText, 1023, 0);
			if (retval > 0)
			{
				CString strData;
				for (int i = 0; i < retval; i++)
				{
					strData.Format("%02X", szText[i]);
					//m_strRecvData1 += strData;
					m_strRecvData += strData;// 暂时用m_strRecvData
				}
				if (m_strRecvData == "8900")
				{
					CString str;
					str.Format("%ul", s);
					m_SockArray0.Add(str);
				}
				if (m_strRecvData == "8901")
				{
					CString str;
					str.Format("%ul", s);
					BOOL bFind = FALSE;
					int nCount = m_SockArray0.GetSize();
					for (int i = 0; i < nCount; i++)
					{
						if (m_SockArray0.GetAt(i) == s)
						{
							m_SockArray0.RemoveAt(i);
							bFind = TRUE;
							break;
						}
					}
					if (bFind)
					{
						nCount = m_SockArray0.GetSize();
						if (nCount == 0)
						{
							m_bNW = FALSE;
							if (m_bSP == FALSE)
							{
								KillTimer(1);
								m_bCollectData = FALSE;
							}
						}
					}
				}
				if (m_strRecvData == "8907")
				{
					CString str;
					str.Format("%ul", s);
					m_SockArray7.Add(str);
				}
				if (m_strRecvData == "8909")
				{
					CString str;
					str.Format("%ul", s);
					m_SockArray9.Add(str);
				}
				PumpData(1);
			}
		}
		break;
	}
	return 0;
}

BOOL CFakeTolcanView::CreateAndListen(int nPort)
{
	if(m_socket == INVALID_SOCKET)
		::closesocket(m_socket);

	// 创建套节字
	m_socket = ::socket(AF_INET, SOCK_STREAM, 0);
	if(m_socket == INVALID_SOCKET)
		return FALSE;
	
	// 填写要关联的本地地址
	sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(nPort);
	sin.sin_addr.s_addr = INADDR_ANY;
	// 绑定端口
	if(::bind(m_socket, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
	{
		return FALSE;
	}

	// 设置socket为窗口通知消息类型
	::WSAAsyncSelect(m_socket, m_hWnd, WM_SOCKET, FD_ACCEPT|FD_CLOSE);
	// 进入监听模式
	::listen(m_socket, 5);

	return TRUE;
}

BOOL CFakeTolcanView::AddClient(SOCKET s)
{
	if(m_nClient < MAX_SOCKET)
	{
		// 添加新的成员
		m_arClient[m_nClient++] = s;
		return TRUE;
	}
	return FALSE;
}

void CFakeTolcanView::RemoveClient(SOCKET s)
{
	BOOL bFind = FALSE;
	for(int i=0; i<m_nClient; i++)
	{
		if(m_arClient[i] == s)
		{
			bFind = TRUE;
			break;
		}
	}

	// 如果找到就将此成员从列表中移除
	if(bFind)
	{
		m_nClient--;
		// 将此成员后面的成员都向前移动一个单位
		for(int j=i; j<m_nClient; j++)
		{
			m_arClient[j] = m_arClient[j+1];
		}
	}
}

void CFakeTolcanView::CloseAllSocket()
{
/*	if (m_bNW)
	{
		m_bNW = FALSE;
		if (m_bSP == FALSE)
		{
			KillTimer(1);
		}
	}
*/
	// 关闭监听套节字
	if(m_socket != INVALID_SOCKET)
	{
		::closesocket(m_socket);
		m_socket = INVALID_SOCKET;
	}
	
	// 关闭所有客户的连接
	for(int i=0; i<m_nClient; i++)
	{
		::closesocket(m_arClient[i]);
	}
	m_nClient = 0;
}

void CFakeTolcanView::OnBtnStartService() 
{
	// TODO: Add your control notification handler code here
	if(m_socket == INVALID_SOCKET)  // 开启服务
	{
		// 取得端口号
		if(m_iPort < 1 || m_iPort > 65535)
		{
			MessageBox("端口号错误!");
			return;
		}
		
		// 创建监听套节字,使它进入监听状态
		if(!CreateAndListen(m_iPort))
		{
			MessageBox("启动服务出错!");
			return;
		}
		
		// 设置相关子窗口控件状态
		GetDlgItem(IDC_BTN_START_SERVICE)->SetWindowText("停止服务");
//		m_bar.SetText(" 正在监听……", 0, 0);
//		GetDlgItem(IDC_PORT)->EnableWindow(FALSE);
	}
	else				// 停止服务
	{
		// 关闭所有连接
		CloseAllSocket();
		
		// 设置相关子窗口控件状态
		GetDlgItem(IDC_BTN_START_SERVICE)->SetWindowText("启动服务");
//		m_bar.SetText(" 空闲", 0, 0);
//		GetDlgItem(IDC_PORT)->EnableWindow(TRUE);
		if (m_bNW)
		{
/*			KillTimer(1);
			if (m_bSP)
			{
				SetTimer(1, m_PackInterval, NULL);
			}*/
			m_bNW = FALSE;
			if (m_bSP == FALSE)
			{
				KillTimer(1);
			}
		}
	}
}

void CFakeTolcanView::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	HD_NOTIFY *phdn = (HD_NOTIFY *)pNMHDR;
	int iItem = phdn->iItem;
	if (iItem >= 0)
	{
		m_iItem = iItem;

	}

	*pResult = 0;
}

LRESULT CFakeTolcanView::OnEndItemEdit(WPARAM wParam, LPARAM lParam)
{
	ItemInfo *myItem = (ItemInfo *)lParam;
	int row = myItem->row;
	int col = myItem->col;
	CString sLabel = myItem->strText;
	delete myItem;

	return true;
}

void CFakeTolcanView::SetWinchCurrentData()
{
	POSITION pos;
	CString strKey;
	CNodeData *pNodeData;
	
	pos = m_NodeDatas.GetStartPosition();
	while(NULL != pos)
	{
		m_NodeDatas.GetNextAssoc(pos, strKey, pNodeData);
		if (pNodeData)
		{
			if (pNodeData->m_strNodeType == "深度节点")
			{
				pNodeData->m_iCurrentValue = pNodeData->m_iFirstValue;
				pNodeData->m_iCurrentStep = pNodeData->m_iStep;
			}
		}
	}
}

BOOL CFakeTolcanView::DestroyWindow() 
{
	// TODO: Add your specialized code here and/or call the base class
	m_NodeList.DeleteAllToolTips();
	m_NodeList.DeleteAllItems();
	return CFormView::DestroyWindow();
}

void CFakeTolcanView::OnBtnModifyNode() 
{
	// TODO: Add your control notification handler code here
	if (m_iItem == -1)
	{
		MessageBox("请先选择一个节点", "温馨提示", MB_ICONASTERISK | MB_ICONINFORMATION);
		return;
	}
	ModifyNode();
}

void CFakeTolcanView::OnBtnDeleteNode() 
{
	// TODO: Add your control notification handler code here
	if (m_iItem == -1)
	{
		MessageBox("请先选择一个节点", "温馨提示", MB_ICONASTERISK | MB_ICONINFORMATION);
		return;
	}
	OnDeleteNode();
}

⌨️ 快捷键说明

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