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

📄 serialtooldlg.cpp

📁 多线程串口通信的例子,可以实现同时多串口的通信
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	// TODO: Add your command handler code here
    bool bRtn;

    //打开串口
	if(m_ThreadSerial.ComIsOpen())
	{
		AfxMessageBox("串口已经打开!");
		return;
	}
	else
	{

	    bRtn = m_ThreadSerial.InitComm(m_nCom, m_hWnd);
        if(bRtn)
		{
		    //串口初使化成功
		    //AfxMessageBox("串口初使化成功!");
		}
	    else
		{ 
		    //串口初使化失败
		    AfxMessageBox("串口初使化失败!");
            return;
		}
	}


	//是否启动了线程
    if(m_ThreadSerial.ComIsConnected())
	{
		AfxMessageBox("线程已经启动!");
		return;
	}
	else
	{
        //开始接收
    	bRtn = m_ThreadSerial.BeginComm();        

	    if(bRtn)
		{
	    	//启动线程成功
           // AfxMessageBox("启动线程成功!");
		}
	    else 
		{
		    //启动线程失败
		    AfxMessageBox("启动线程失败!");
            return;
		}
	}


}

void CSerialToolDlg::OnMenuitemClosecom() 
{
	// TODO: Add your command handler code here
	m_ThreadSerial.CloseComm();

}

void CSerialToolDlg::OnMenuitemSetnet() 
{
	// TODO: Add your command handler code here
	CSetupNetDlg dlg;
	dlg.DoModal();
	
}


UINT SockThread(LPVOID p)
{
	int nRtn=1;
	char buff[BUFFLEN];
	CSerialToolDlg *dlg=(CSerialToolDlg*)AfxGetApp()->GetMainWnd();
    int nIndex = dlg->GetSockCount();
	if(nIndex!=-1)
	{
		//说明还有空的SOCKET
    	dlg->m_sock[nIndex]=accept(dlg->m_sockServer,(sockaddr*)&(dlg->m_sockaddr),&(dlg->m_nAddlen));
		if (dlg->m_sock[nIndex]==INVALID_SOCKET)
		{
			//发生连接错误
			//AfxMessageBox("发生连接错误");
			dlg->m_sock[nIndex]=NULL;
			return -1;
		}
		else
		{
			AfxBeginThread(&SockThread,0);
			while(nRtn!=SOCKET_ERROR)
			{
				ZeroMemory(buff,sizeof(buff));
				nRtn=recv(dlg->m_sock[nIndex],buff,READBUFFLEN,MSG_PEEK);
				if(nRtn==8)
				{
					nRtn=recv(dlg->m_sock[nIndex],buff,READBUFFLEN,0);
					if(nRtn!=SOCKET_ERROR)
					{
						dlg->DealNetworkData(buff);
					}
				}


			}

		}

	}

    return 0;
}



void CSerialToolDlg::OnMenuitemOpennet() 
{
	// TODO: Add your command handler code here
	//设定地址

	if(m_sockServer!=NULL)
	{
		AfxMessageBox("服务已经开启!");
		return;
	}

	m_sockaddr.sin_addr.s_addr=inet_addr(m_szIP);//inet_addr(m_szIP);//htonl(INADDR_ANY);
	m_sockaddr.sin_family=AF_INET;
	m_sockaddr.sin_port=htons(m_nPort);//htons(5000);
	m_nAddlen=sizeof(m_sockaddr);

	m_sockServer=socket(AF_INET,SOCK_STREAM,0);//IPPROTO_TCP

	if (bind(m_sockServer,(sockaddr*)&m_sockaddr,m_nAddlen))
	{
		AfxMessageBox("绑定错误");
	}
	else
	{
	    
	    AfxMessageBox("服务器创建成功");
	    //开始侦听	
	    listen(m_sockServer,5);
	    //调用线程
	    AfxBeginThread(&SockThread,0);

	}
	
}




//取得当前的空的SOCKET索引,如果没有空的,那么返回-1
int CSerialToolDlg::GetSockCount()
{
	for (int i=0;i<MAXSOCKET;i++)
	{
		if (m_sock[i]==NULL)
			return i;
	}

	return -1;

}

void CSerialToolDlg::DealReceiveData(BYTE* pszData)
{
	char szData[BUFFLEN];
	ZeroMemory(szData,sizeof(szData));
	strcpy((char*)szData,(char*)pszData);

	char time_str[50];
	char szCount[10];
	_strtime(time_str);
	int nItem;
	int nItemCount = m_listTelephone.GetItemCount();
	nItemCount++;
	nItem=m_listTelephone.InsertItem(0,itoa(nItemCount,szCount,10));
	m_listTelephone.SetItemText(nItem,1,time_str);
    m_listTelephone.SetItemText(nItem,2,CString(szData));
	int nLen=strlen(szData);
    szData[nLen]='\n';
	for (int i=0;i<MAXSOCKET;i++)
	{
		if (m_sock[i]!=NULL)
		{	
			send(m_sock[i],szData,nLen+1,0);
		}
	}

	/*
	//JSY-2000交换机发给报警台协议:
	switch(szData[0])
	{
	case 'A':                 //1:报警呼叫 :A N(ZN)W CR LF

		break;

	case 'B':                 //2:接警机提机接警:B N W CR LF 
		break;

	case 'C':                 //3:接警机挂机:C N W CR LF 
		break;

	case 'D':                 //4:报警呼叫排队等待: D N(ZN)W CR LF
		break;

	case 'U':       
		switch(szData[1])
		{
		case '1':             //5:‘技防表’: U1 BB(GN)CR LF 
                              //  BB=00~31:‘技防表’序号;
                              // (GN)0~8位技防电话号码。
			break;


		case '2':             //6:‘锁定表’: U2  BB(SN)CR LF
                              // BB=00~31:‘锁定表’序号;
                              //(SN)0~16位锁定电话号码。
			break;

		}

		break;


	case 'V':
		switch(szData[1])
		{
		case '0':             //7:	报警'锁定’: V0 (SN)W CR LF。
                              //(SN)是0~16位锁定的主叫电话号码。
			break;


		case '1':             //8:报警'拦截’: V1 (ZN)W CR LF。
			break;  


		case '2':             //9:报警'技防’: V2 (GN)(ZN)W CR LF。
                              //(GN)是0~16位的技防号码。

                              // 注1:N=1~8为第1~8个接警话机。JSY-2000的第17~24门分机。
                              // 注2:(ZN)是报警电话的主叫电话号码。
                              //注3:W 是中继线序号(001~127)
                              // 注4:CR 是回车,16进=0DH,LF 是走纸,16进=0AH。
			break;

		}
		break;


	}

	*/

}

void CSerialToolDlg::DealNetworkData(char* pData)
{
	char szData[BUFFLEN];
	ZeroMemory(szData,sizeof(szData));
	strcpy((char*)szData,(char*)pData);

	char time_str[50];
	char szCount[10];
	_strtime(time_str);
	int nItem;
	int nItemCount = m_listNetwork.GetItemCount();
	nItemCount++;
	nItem=m_listNetwork.InsertItem(0,itoa(nItemCount,szCount,10));
	m_listNetwork.SetItemText(nItem,1,time_str);
    m_listNetwork.SetItemText(nItem,2,CString(szData));

	m_ThreadSerial.WriteComm((BYTE*)szData,BUFFLEN);

}


void CSerialToolDlg::GetLocalIP(char*szIP)
{
	int nRetCode;
	CString sHostName;
	CString sIPAddress;
	
	nRetCode = StartUp();
	nRetCode = GetLocalHostName(sHostName);
	nRetCode = GetIPAddress(sHostName, sIPAddress);
	nRetCode = CleanUp();

	strcpy(szIP,sIPAddress.GetBuffer(sIPAddress.GetLength()));

}

void CSerialToolDlg::OnMenuitemClosenet() 
{
	// TODO: Add your command handler code here
	for(int i=0;i<MAXSOCKET;i++)
	{
		if(m_sock[i]!=NULL)
		{
			closesocket(m_sock[i]);
			m_sock[i]= NULL;
		}
	}

	if(m_sockServer!=NULL)
	{
		closesocket(m_sockServer);
		m_sockServer=NULL;
	}
}

void CSerialToolDlg::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	CDialog::OnLButtonDblClk(nFlags, point);
}

void CSerialToolDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	CDialog::OnLButtonDown(nFlags, point);
}

void CSerialToolDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	CDialog::OnLButtonUp(nFlags, point);
}

void CSerialToolDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	CDialog::OnMouseMove(nFlags, point);
}

void CSerialToolDlg::OnBtSendtocom() 
{
	// TODO: Add your control notification handler code here
	char* pData;
	CString sSendToCom;
	GetDlgItem(IDC_EDIT_SENDTOCOM)->GetWindowText(sSendToCom);
	int nLength = sSendToCom.GetLength();
	pData = sSendToCom.GetBuffer(nLength);

	int nRtn = m_ThreadSerial.WriteComm((BYTE*)pData,nLength);

}

void CSerialToolDlg::OnBtSendtonet() 
{
	// TODO: Add your control notification handler code here
    char* pData;
	CString sSendToNet;
	GetDlgItem(IDC_EDIT_SENDTONET)->GetWindowText(sSendToNet);
	int nLength = sSendToNet.GetLength();
	pData = sSendToNet.GetBuffer(nLength);
    pData[nLength]='\n';

	for (int i=0;i<MAXSOCKET;i++)
	{
		if (m_sock[i]!=NULL)
		{
			int nRtn=send(m_sock[i],pData,nLength+1,0);
		}
	}

	
}



⌨️ 快捷键说明

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