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

📄 cmychatdlg.cpp

📁 VC编写的一个WinSocket及串口通信的例程代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	m_cOutput.SetWindowText(m_strOutput);
	m_cOutput.SetFocus();
	UpdateData(FALSE);
	// TODO: Add your control notification handler code here
	
}

void CCmyChatDlg::OnButtonClearrecieve() 
{
	m_strInput=_T("");
	m_cInput.SetWindowText(m_strInput);
	UpdateData(FALSE);
	m_cOutput.SetFocus();//设置焦点
	// TODO: Add your control notification handler code here
	
}


void CCmyChatDlg::SocketReset()
{
	if(m_arIn!=NULL)
	{
		delete m_arIn;
		m_arIn=NULL;
	}

	if(m_arOut!=NULL)
	{
		delete m_arOut;
		m_arOut=NULL;
	}

	if(m_file!=NULL)
	{
		delete m_file;
		m_file=NULL;
	}

	if(m_ClientSocket!=NULL)
	{
		delete m_ClientSocket;
		m_ClientSocket=NULL;
	}

	if(m_ServerSocket!=NULL)
	{
		delete m_ServerSocket;
		m_ServerSocket=NULL;
	}

	m_strConnect="";
	UpdateData(FALSE);

}

void CCmyChatDlg::OnClose()//当对方退出时,断开连接
{
	if(m_ClientSocket->m_nStatus==0)
		m_strConnect="客户";
	else
		m_strConnect="服务器";
	m_strConnect+="已断开!";
	UpdateData(FALSE);
}

void CCmyChatDlg::OnAccept()//连接请求
{
	m_strConnect+="连接成功!";
	UpdateData(FALSE);
    m_strConnect="";
	m_ClientSocket=new CNewSocket;
	m_ClientSocket->GetDlg(this);
	m_ServerSocket->Accept(*m_ClientSocket);
	m_ClientSocket->m_nStatus=m_ServerSocket->m_nStatus;
	m_file=new CSocketFile(m_ClientSocket);
	m_arIn=new CArchive(m_file,CArchive::load);
	m_arOut=new CArchive(m_file,CArchive::store);
}

void CCmyChatDlg::OnReceive() //接收数据
{
	*m_arIn>>m_strInput;

	CString m_strInText;
	m_cInput.GetWindowText(m_strInText);

	m_strInput+=0x0d;    //加回车
	m_strInput+=0x0a;    //加换行	
	m_strInput+=m_strInText;
//	MessageBox(m_strInText,"InText",MB_OK);
//	MessageBox(m_strInput,"Input",MB_OK);

	UpdateData(FALSE);

}



BEGIN_EVENTSINK_MAP(CCmyChatDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CCmyChatDlg)
	ON_EVENT(CCmyChatDlg, IDC_MSCOMM1, 1 /* OnComm */, OnMscomm, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CCmyChatDlg::OnMscomm() 
{
	// TODO: Add your control notification handler code here
//  有16进制转换
	VARIANT variant_inp;
	COleSafeArray safearray_inp;
	LONG len,k;
	BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
	CString strtemp;
	if(m_cComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
	{
		variant_inp=m_cComm.GetInput(); //读缓冲区
		safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
		len=safearray_inp.GetOneDimSize(); //得到有效数据长度
	for(k=0;k<len;k++)
		safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
	for(k=0;k<len;k++) //将数组转换为Cstring型变量
		{
			BYTE bt=*(char*)(rxdata+k); //字符型
		if(m_cComHexRecieve.GetCheck())
			strtemp.Format("%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
		else 
			strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放

		m_strComInput+=strtemp; //加入接收编辑框对应字符串 
		}
	}
	UpdateData(FALSE); //更新编辑框内容

/*  没有16进制转换
	VARIANT variant_inp;
	COleSafeArray safearray_inp;
	LONG len,k;
	BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
	CString strtemp;
    if(m_cComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
    {             ////////以下你可以根据自己的通信协议加入处理代码
        variant_inp=m_cComm.GetInput(); //读缓冲区
        safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
        len=safearray_inp.GetOneDimSize(); //得到有效数据长度
        for(k=0;k<len;k++)
            safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
        for(k=0;k<len;k++) //将数组转换为Cstring型变量
        {
            BYTE bt=*(char*)(rxdata+k); //字符型
            strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
            m_strComInput+=strtemp; //加入接收编辑框对应字符串 
        }
    }
   UpdateData(FALSE); //更新编辑框内容
*/

/*
 另一个程序

   VARIANT m_Input1; 
    COleSafeArray m_Input2; 
    long length,i; 
    BYTE data[1024]; 
    CString str; 

   if(m_Comm.GetCommEvent()==2)//接收缓冲区内有字符 
    { 
       m_Input1=m_Comm.GetInput();//读取缓冲区内的数据 
       m_Input2=m_Input1;//将VARIANT型变量转换为COleSafeArray型变量 
       length=m_Input2.GetOneDimSize();//确定数据长度 
       for(i=0;i<length;i++) 
           m_Input2.GetElement(&i,data+i);//将数据转换为BYTE型数组 
      for(i=0;i<length;i++)//将数组转换为CString型变量 
       { 
           char a=*(char*)(data+i); 
          str.Format("%c",a); 
           m_ReceiveData+=str;  
       } 

*/
    
}
	
void CCmyChatDlg::OnButtonReg() 
{
	m_strOutput.TrimLeft(" ");

	if(m_nStatus==0)
	{
//	if(m_strConnect=="正在等待客户端连接......连接成功!")
//	{
//		MessageBox(m_strConnect+"    可以REG了",NULL,MB_OK);
//	OnButtonSend();

		UpdateData(TRUE);
		
		CString m_strReg;
		m_strReg="\x47\x50\x52\x53";//GPRS
		m_strReg+="\x30\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39";//00123456789
		m_strReg+="\x00\x15";//长度为21字节
		m_strReg+="\x72\x65\x67";//REG
		*m_arOut<<m_strReg;
		m_arOut->Flush();
		m_strReg="";

//	}
	}
		m_cOutput.SetFocus();

	// TODO: Add your control notification handler code here
	
}

BOOL CCmyChatDlg::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class

	if (pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN)
	{
		CWnd* v_wCtrl=GetFocus();	//获得焦点
		if (v_wCtrl==&m_cCancel)	//列表窗回车
		{
			OnOK();									
			return true;
		}
		if (v_wCtrl==&m_cConnect)
		{
			OnButtonConnect();
			return true;
		}
		if (v_wCtrl==&m_cDisconnect)
		{
			OnButtonDisconnect();
			return true;
		}

		if (v_wCtrl==&m_cSend)
		{
			OnButtonSend();
			return true;
		}

		if (v_wCtrl==&m_cClear)
		{
			OnButtonClearsend();
			return true;
		}
		if (v_wCtrl==&m_cClearRecieve)
		{
			OnButtonClearrecieve();
			return true;
		}
		if (v_wCtrl==&m_cComSend)
		{
			OnButtonComSend();
			return true;
		}

		if (v_wCtrl==&m_cComClearSend)
		{
			OnButtonComClearsend();
			return true;
		}
		if (v_wCtrl==&m_cComClearRecieve)
		{
			OnButtonComClearrecieve();
			return true;
		}
		if (v_wCtrl==&m_cOutput)
		{
			return false;
		}
		if (v_wCtrl==&m_cComOutput)
		{
			return false;
		}
		CDialog* Pwnd=(CDialog*)GetActiveWindow();	//取得对话框指针 
		Pwnd->NextDlgCtrl();						//切换到下一个输入焦点 
		return true;
	}
	return CDialog::PreTranslateMessage(pMsg);
}

void CCmyChatDlg::OnButtonHeart() 
{
	m_strOutput.TrimLeft(" ");
	if(m_nStatus==0)
	{
//	if(m_strConnect=="正在等待客户端连接......连接成功!")
//	{
//		MessageBox(m_strConnect+"    可以REG了",NULL,MB_OK);
//	OnButtonSend();

		UpdateData(TRUE);
/*		m_strOutput="GPRS00123456789";//GPRSID
    m_strOutput+=0x00;
		m_strOutput+=0x14;            //GPRSID+"0x00 0x14"+"HEART;"长度为20字节
		m_strOutput+="HEART;";
		*m_arOut<<m_strOutput;
		m_arOut->Flush();
		m_strOutput="";
*/		CString m_strHeart;
		m_strHeart="\x47\x50\x52\x53";
		m_strHeart+="\x30\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39";
		m_strHeart+="\x00\x17";
		m_strHeart+="\x48\x45\x41\x52\x54\x3B";
		*m_arOut<<m_strHeart;
		m_arOut->Flush();
		m_strHeart="";
//	}
	}
		m_cOutput.SetFocus();

	// TODO: Add your control notification handler code here
	
}

void CCmyChatDlg::OnButtonComSend() 
{
	UpdateData(TRUE);//读取编辑框内容

	if(m_strComOutput.IsEmpty())
	{
		MessageBox("请输入要发送的信息!","信息提示",MB_OK);
		return;
	}
	else if(!m_cComm.GetPortOpen())
		{
    	MessageBox("串口未打开,请先打开!","信息提示",MB_OK);
//		OnButtonComopen();   //打开串口,并初始化串口
//			m_cComm.SetPortOpen(TRUE);
//			m_cComm.SetDTREnable(TRUE);
		}
 //   	else
	
			if(m_cComHexSend.GetCheck())
			{
				CByteArray hexdata;
				int len=String2Hex(m_strComOutput,hexdata); //此处返回的len可以用于计算发送了多少个十六进制数
				m_cComm.SetOutput(COleVariant(hexdata)); //发送十六进制数据
			}
			else 
				m_cComm.SetOutput(COleVariant(m_strComOutput));//发送ASCII字符数据

	m_cComOutput.SetFocus();
	// TODO: Add your control notification handler code here
	
}

void CCmyChatDlg::OnButtonComClearsend() 
{
	m_strComOutput=_T("");
	m_cComOutput.SetWindowText(m_strComOutput);
	UpdateData(FALSE);
	m_cComOutput.SetFocus();
	// TODO: Add your control notification handler code here
	
}

void CCmyChatDlg::OnButtonComClearrecieve() 
{
	m_strComInput=_T("");
	m_cComInput.SetWindowText(m_strComInput);
	UpdateData(FALSE);
	m_cComOutput.SetFocus();//设置焦点
	// TODO: Add your control notification handler code here
	
}

//发送16进制数,转换成ASCII码
int CCmyChatDlg::String2Hex(CString str, CByteArray &senddata)
{
	int hexdata,lowhexdata;
	int hexdatalen=0;
	int len=str.GetLength();
	senddata.SetSize(len/2);  //16进制数换算成ASCII码,数组大小
	for(int i=0;i<len;)
	{
		char lstr,hstr=str[i];
	if(hstr==' ')
	{
		i++;
		continue;
	}
		i++;
		if(i>=len)
		break;
		lstr=str[i];
		hexdata=ConvertHexChar(hstr);
		lowhexdata=ConvertHexChar(lstr);
	if((hexdata==16)||(lowhexdata==16))
	break;
	else 
		hexdata=hexdata*16+lowhexdata;  //16进制数换算成ASCII码,如3,1==49
	i++;
	senddata[hexdatalen]=(char)hexdata;
	hexdatalen++;
	}
	senddata.SetSize(hexdatalen);
	return hexdatalen;

}

char CCmyChatDlg::ConvertHexChar(char ch)
{
	if((ch>='0')&&(ch<='9'))
	return ch-0x30;     //如ch='3'返回3
	else if((ch>='A')&&(ch<='F'))
	return ch-'A'+10;    //如ch='B'返回11
	else if((ch>='a')&&(ch<='f'))
	return ch-'a'+10;    //如ch='b'返回11
	else return (-1);

}

void CCmyChatDlg::OnButtonComset() 
{
	// TODO: Add your control notification handler code here
	
}


void CCmyChatDlg::OnButtonComopen() 
{
	// TODO: Add your control notification handler code here
//初始化串口
	if(m_cComm.GetPortOpen())
	m_cComm.SetPortOpen(FALSE);

	m_cComm.SetCommPort(1); //选择com1
	if( !m_cComm.GetPortOpen())
	{
	m_cComm.SetPortOpen(TRUE);//打开串口
	m_cComm.SetDTREnable(TRUE);
	}
	else
	AfxMessageBox("cannot open serial port,不能打开串口!");

	m_cComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位 

	m_cComm.SetInputMode(1); //1:表示以二进制方式检取数据
	m_cComm.SetRThreshold(1); 
	//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
	m_cComm.SetInputLen(0); //设置当前接收区数据长度为0
	m_cComm.GetInput();//先预读缓冲区以清除残留数据

}

⌨️ 快捷键说明

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