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

📄 portcomdlg.cpp

📁 用控件实现串口通信
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		if(m_test=="Odd")
			m_test="o";
		if(m_test=="Mark")
			m_test="m";
		if(m_test=="Spack")
			m_test="s";
		qq=m_baud+m_test+m_bit+m_stop;		
		m_ctrlComm.SetSettings(qq); //设置波特率,无校验,数据位,停止位     
		m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据
		m_ctrlComm.SetRThreshold(1); 
		//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
		m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
		m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据

		if(m_ctrlComm1.GetPortOpen())
		    m_ctrlComm1.SetPortOpen(FALSE);
		m_ctrlComm1.SetCommPort(2);
		if( !m_ctrlComm1.GetPortOpen())
		    m_ctrlComm1.SetPortOpen(TRUE);//打开串口
		else
		    AfxMessageBox("cannot open serial port");
		CString qq1;
		if(m_test1=="None")
			m_test1="n";
		if(m_test1=="Even")
			m_test1="e";
		if(m_test1=="Odd")
			m_test1="o";
		if(m_test1=="Mark")
			m_test1="m";
		if(m_test1=="Spack")
			m_test1="s";
		qq1=m_baud1+m_test1+m_bit1+m_stop1;
		m_ctrlComm1.SetSettings(qq1); //设置波特率,无校验,数据位,停止位     
		m_ctrlComm1.SetInputMode(1); //1:表示以二进制方式检取数据
		m_ctrlComm1.SetRThreshold(1); 
		//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
		m_ctrlComm1.SetInputLen(0); //设置当前接收区数据长度为0
		m_ctrlComm1.GetInput();//先预读缓冲区以清除残留数据
	}

	if(m_port=="COM2"&&m_port1=="COM2")
	{
		if(m_ctrlComm.GetPortOpen())
		    m_ctrlComm.SetPortOpen(FALSE);
		if(m_ctrlComm1.GetPortOpen())
			m_ctrlComm1.SetPortOpen(FALSE);		
		m_ctrlComm1.SetCommPort(2);
		if( !m_ctrlComm1.GetPortOpen())
		    m_ctrlComm1.SetPortOpen(TRUE);//打开串口
		else
		    AfxMessageBox("cannot open serial port");
		CString qq1;
		if(m_test1=="None")
			m_test1="n";
		if(m_test1=="Even")
			m_test1="e";
		if(m_test1=="Odd")
			m_test1="o";
		if(m_test1=="Mark")
			m_test1="m";
		if(m_test1=="Spack")
			m_test1="s";
		qq1=m_baud1+m_test1+m_bit1+m_stop1;
		m_ctrlComm1.SetSettings(qq1); //设置波特率,无校验,数据位,停止位     
		m_ctrlComm1.SetInputMode(1); //1:表示以二进制方式检取数据
		m_ctrlComm1.SetRThreshold(1); 
		//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
		m_ctrlComm1.SetInputLen(0); //设置当前接收区数据长度为0
		m_ctrlComm1.GetInput();//先预读缓冲区以清除残留数据
	}
	
}

void CPortcomDlg::OnSelchangeCombo8() 
{
	// TODO: Add your control notification handler code here
    if(m_port=="COM1"&&m_port1=="COM2")
	{
		if(m_ctrlComm.GetPortOpen())
		    m_ctrlComm.SetPortOpen(FALSE);
		if(m_ctrlComm1.GetPortOpen())
			m_ctrlComm1.SetPortOpen(FALSE);
		
		m_ctrlComm.SetCommPort(1); //选择com1	
		if( !m_ctrlComm.GetPortOpen())
		m_ctrlComm.SetPortOpen(TRUE);//打开串口
		else
		AfxMessageBox("cannot open serial port");
		CString qq;
		if(m_test=="None")
			m_test="n";
		if(m_test=="Even")
			m_test="e";
		if(m_test=="Odd")
			m_test="o";
		if(m_test=="Mark")
			m_test="m";
		if(m_test=="Spack")
			m_test="s";
		qq=m_baud+m_test+m_bit+m_stop;		
		m_ctrlComm.SetSettings(qq); //设置波特率,无校验,数据位,停止位     
		m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据
		m_ctrlComm.SetRThreshold(1); 
		//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
		m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
		m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据

		if(m_ctrlComm1.GetPortOpen())
		m_ctrlComm1.SetPortOpen(FALSE);
		m_ctrlComm1.SetCommPort(2);
		if( !m_ctrlComm1.GetPortOpen())
		m_ctrlComm1.SetPortOpen(TRUE);//打开串口
		else
		AfxMessageBox("cannot open serial port");
		CString qq1;
		if(m_test1=="None")
			m_test1="n";
		if(m_test1=="Even")
			m_test1="e";
		if(m_test1=="Odd")
			m_test1="o";
		if(m_test1=="Mark")
			m_test1="m";
		if(m_test1=="Spack")
			m_test1="s";
		qq1=m_baud1+m_test1+m_bit1+m_stop1;
		m_ctrlComm1.SetSettings(qq1); //设置波特率,无校验,数据位,停止位     
		m_ctrlComm1.SetInputMode(1); //1:表示以二进制方式检取数据
		m_ctrlComm1.SetRThreshold(1); 
		//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
		m_ctrlComm1.SetInputLen(0); //设置当前接收区数据长度为0
		m_ctrlComm1.GetInput();//先预读缓冲区以清除残留数据
	}

	if(m_port=="COM1"&&m_port1=="COM1")
	{
		if(m_ctrlComm.GetPortOpen())
		    m_ctrlComm.SetPortOpen(FALSE);
		if(m_ctrlComm1.GetPortOpen())
			m_ctrlComm1.SetPortOpen(FALSE);
		m_ctrlComm.SetCommPort(1); //选择com1	
		if( !m_ctrlComm.GetPortOpen())
		m_ctrlComm.SetPortOpen(TRUE);//打开串口
		else
		    AfxMessageBox("cannot open serial port");
		
		CString qq;
		if(m_test=="None")
			m_test="n";
		if(m_test=="Even")
			m_test="e";
		if(m_test=="Odd")
			m_test="o";
		if(m_test=="Mark")
			m_test="m";
		if(m_test=="Spack")
			m_test="s";
		qq=m_baud+m_test+m_bit+m_stop;		
		m_ctrlComm.SetSettings(qq); //设置波特率,无校验,数据位,停止位     
		m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据
		m_ctrlComm.SetRThreshold(1); 
		//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
		m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
		m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
		
	}
	
	if(m_port=="COM2"&&m_port1=="COM1")
	{
		if(m_ctrlComm.GetPortOpen())
		    m_ctrlComm.SetPortOpen(FALSE);
		if(m_ctrlComm1.GetPortOpen())
			m_ctrlComm1.SetPortOpen(FALSE);
		m_ctrlComm.SetCommPort(1); //选择com2	
		if( !m_ctrlComm.GetPortOpen())
		    m_ctrlComm.SetPortOpen(TRUE);//打开串口
		else
		    AfxMessageBox("cannot open serial port");		
		CString qq;
		if(m_test=="None")
			m_test="n";
		if(m_test=="Even")
			m_test="e";
		if(m_test=="Odd")
			m_test="o";
		if(m_test=="Mark")
			m_test="m";
		if(m_test=="Spack")
			m_test="s";
		qq=m_baud+m_test+m_bit+m_stop;		
		m_ctrlComm.SetSettings(qq); //设置波特率,无校验,数据位,停止位     
		m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据
		m_ctrlComm.SetRThreshold(1); 
		//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
		m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
		m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据

		if(m_ctrlComm1.GetPortOpen())
		    m_ctrlComm1.SetPortOpen(FALSE);
		m_ctrlComm1.SetCommPort(2);
		if( !m_ctrlComm1.GetPortOpen())
		    m_ctrlComm1.SetPortOpen(TRUE);//打开串口
		else
		    AfxMessageBox("cannot open serial port");
		CString qq1;
		if(m_test1=="None")
			m_test1="n";
		if(m_test1=="Even")
			m_test1="e";
		if(m_test1=="Odd")
			m_test1="o";
		if(m_test1=="Mark")
			m_test1="m";
		if(m_test1=="Spack")
			m_test1="s";
		qq1=m_baud1+m_test1+m_bit1+m_stop1;
		m_ctrlComm1.SetSettings(qq1); //设置波特率,无校验,数据位,停止位     
		m_ctrlComm1.SetInputMode(1); //1:表示以二进制方式检取数据
		m_ctrlComm1.SetRThreshold(1); 
		//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
		m_ctrlComm1.SetInputLen(0); //设置当前接收区数据长度为0
		m_ctrlComm1.GetInput();//先预读缓冲区以清除残留数据
	}

	if(m_port=="COM2"&&m_port1=="COM2")
	{
		if(m_ctrlComm.GetPortOpen())
		    m_ctrlComm.SetPortOpen(FALSE);
		if(m_ctrlComm1.GetPortOpen())
			m_ctrlComm1.SetPortOpen(FALSE);
		m_ctrlComm1.SetCommPort(2);
		if( !m_ctrlComm1.GetPortOpen())
		    m_ctrlComm1.SetPortOpen(TRUE);//打开串口
		else
		    AfxMessageBox("cannot open serial port");
		CString qq1;
		if(m_test1=="None")
			m_test1="n";
		if(m_test1=="Even")
			m_test1="e";
		if(m_test1=="Odd")
			m_test1="o";
		if(m_test1=="Mark")
			m_test1="m";
		if(m_test1=="Spack")
			m_test1="s";
		qq1=m_baud1+m_test1+m_bit1+m_stop1;
		m_ctrlComm1.SetSettings(qq1); //设置波特率,无校验,数据位,停止位     
		m_ctrlComm1.SetInputMode(1); //1:表示以二进制方式检取数据
		m_ctrlComm1.SetRThreshold(1); 
		//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
		m_ctrlComm1.SetInputLen(0); //设置当前接收区数据长度为0
		m_ctrlComm1.GetInput();//先预读缓冲区以清除残留数据
	}	
}

BEGIN_EVENTSINK_MAP(CPortcomDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CPortcomDlg)
	ON_EVENT(CPortcomDlg, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE)
	ON_EVENT(CPortcomDlg, IDC_MSCOMM2, 1 /* OnComm */, OnComm1, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CPortcomDlg::OnComm() 
{
	// TODO: Add your control notification handler code here	
	VARIANT variant_inp;
    COleSafeArray safearray_inp;
    LONG len,k;
    BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
    CString strtemp;
    if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
    {  
		if((m_port=="COM1"&&m_port1=="COM1")||(m_port=="COM2"&&m_port1=="COM1"))
		{        
			variant_inp=m_ctrlComm.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_format1=="16进制方式")
				{
					strtemp.Format("%02X",bt); //将字符以十六进制方式送入临时变量strtemp存放,
					strtemp+="\x00d\x00a";  //这里加入回车换行符
				}
				if(m_format1=="Ascii 方式")
				    strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
				m_strRXData+=strtemp; //加入接收编辑框对应字符串
			}			 
		}
	}
	UpdateData(FALSE); //更新编辑框内容
	m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0  
	m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据*/

}


void CPortcomDlg::OnComm1() 
{
	// TODO: Add your control notification handler code here
	VARIANT variant_inp1;
    COleSafeArray safearray_inp1;
    LONG len1,k1;
    BYTE rxdata1[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
    CString strtemp1;
    if(m_ctrlComm1.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
    { 
		if((m_port=="COM2"&&m_port1=="COM2")||(m_port=="COM1"&&m_port1=="COM2"))
		{				
			variant_inp1=m_ctrlComm1.GetInput(); //读缓冲区
			safearray_inp1=variant_inp1; //VARIANT型变量转换为ColeSafeArray型变量
			len1=safearray_inp1.GetOneDimSize(); //得到有效数据长度
			for(k1=0;k1<len1;k1++)
				safearray_inp1.GetElement(&k1,rxdata1+k1);//转换为BYTE型数组
			for(k1=0;k1<len1;k1++) //将数组转换为Cstring型变量
			{
				BYTE bt1=*(char*)(rxdata1+k1); //字符型
				if(m_format1=="16进制方式")
				{
					strtemp1.Format("%02X",bt1); //将字符以十六进制方式送入临时变量strtemp存放,				
					strtemp1+="\x00d\x00a";  //这里加入回车换行符
				}
				if(m_format1=="Ascii 方式")
				    strtemp1.Format("%c",bt1); //将字符送入临时变量strtemp存放
				m_strRXData+=strtemp1; //加入接收编辑框对应字符串 
			}			 
		}
    }
	UpdateData(FALSE); //更新编辑框内容*/
	m_ctrlComm1.SetInputLen(0); //设置当前接收区数据长度为0  
	m_ctrlComm1.GetInput();//先预读缓冲区以清除残留数据
}

void CPortcomDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_ctrlComm.GetPortOpen()||m_ctrlComm1.GetPortOpen())
	{
	OnButton();
	CDialog::OnTimer(nIDEvent);
	}
}

void CPortcomDlg::OnCheckAutosend() 
{
	// TODO: Add your control notification handler code here
	m_bAutoSend=!m_bAutoSend;
}

int CPortcomDlg::String2Hex(CString str, CByteArray &senddata)
{
	int hexdata,lowhexdata;
	int hexdatalen=0;
	int len=str.GetLength();
	senddata.SetSize(len/2);
	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;
	    i++;
	    senddata[hexdatalen]=(char)hexdata;
	    hexdatalen++;
	}
	senddata.SetSize(hexdatalen);
	return hexdatalen;
}

char CPortcomDlg::ConvertHexChar(char ch) 
{
	if((ch>='0')&&(ch<='9'))
	return ch-0x30;
	else if((ch>='A')&&(ch<='F'))
	return ch-'A'+10;
	else if((ch>='a')&&(ch<='f'))
	return ch-'a'+10;
	else return (-1);
}

⌨️ 快捷键说明

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