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

📄 serialcontroldlg.cpp

📁 该代码是我在做课程设计时编写的一个串口调试的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		wq ="19200";
		break;
	case 10:
		wq="38400";
		break;
	case 11:
		wq ="57600";
		break;
	case 12:
		wq ="115200";
		break;
	default:
		break;
	}
	BR=wq;
	BR+=",";
	switch(m_CheckBitWaiter1.GetCurSel())
	{
	case 0:
		wq="E";
		break;
	case 1:
		wq="M";
		break;
	case 2:
		wq="N";
		break;
	case 3:
		wq="O";
		break;
	case 4:
		wq="S";
		break;
	default:
		break;
	}
	BR+=wq;
	BR+=",";
	switch(m_DateBitWaiter1.GetCurSel())
	{
	case 0:
		wq="8";
		break;
	case 1:
		wq="7";
		break;
	case 2:
		wq="6";
		break;
	case 3:
		wq="5";
		break;
	default:
		break;
	}
	BR+=wq;
	BR+=",";
	switch(m_StopBitWaiter1.GetCurSel())
	{
	case 0:
		wq="1";
		break;
	case 1:
		wq="1.5";
		break;
	case 2:
		wq="2";
		break;
	default:
		break;
	}
	BR+=wq;
	int a;
	a=m_Waiter1Name.GetCurSel();
	m_Waiter1Name.GetLBText(a, wq);
	sh="没有";
	df="串口或串口被占用";
	error=sh + wq + df;
	
	m_Waiter1.SetCommPort(a+1);
	m_Waiter1.SetPortOpen(TRUE);	//打开串口,以判断串口是否存在
	if(m_Waiter1.GetPortOpen()) //如果串口是打开的,则行关闭串口
	{
		m_Waiter1.SetPortOpen(FALSE);
		m_Waiter1.SetInBufferSize(1024); //接收缓冲区
		m_Waiter1.SetOutBufferSize(1024);//发送缓冲区
		m_Waiter1.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读取
		m_Waiter1.SetInputMode(1);//以二进制方式读写数据
		m_Waiter1.SetRThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
		m_Waiter1.SetSettings(BR);//波特率9600无检验位,8个数据位,1个停止位
		m_Waiter1.SetOutBufferCount(0);
		m_Waiter1.SetPortOpen(TRUE);
		m_StatusWaiter1="打开";
		Waiter1Active=TRUE;
		GetDlgItem(IDC_OPEN_MASTER2)->EnableWindow(FALSE);
		GetDlgItem(IDC_CLOSE_MASTER2)->EnableWindow(TRUE);
	}
	else
		MessageBox(error);
	UpdateData(FALSE);
}



void CSerialControlDlg::OnCloseMaster2() 
{
	// TODO: Add your control notification handler code here
	m_Waiter1.SetPortOpen(FALSE);
	GetDlgItem(IDC_OPEN_MASTER2)->EnableWindow(TRUE);
	GetDlgItem(IDC_CLOSE_MASTER2)->EnableWindow(FALSE);
	m_StatusWaiter1="关闭";
	Waiter1Active=FALSE;
	UpdateData(FALSE);	
}

void CSerialControlDlg::OnCloseMaster3() 
{
	// TODO: Add your control notification handler code here
	m_Waiter2.SetPortOpen(FALSE);
	GetDlgItem(IDC_OPEN_MASTER3)->EnableWindow(TRUE);
	GetDlgItem(IDC_CLOSE_MASTER3)->EnableWindow(FALSE);
	m_StatusWaiter2="关闭";
	Waiter2Active=FALSE;
	UpdateData(FALSE);	
	
}

void CSerialControlDlg::OnOpenMaster3() 
{
	// TODO: Add your control notification handler code here
	CString error,sh,df,wq,BR;
	switch(m_BoudRateMaster.GetCurSel())
	{
	case 0:
		wq="300";
		break;
	case 1:
		wq="600";
		break;
	case 2:
		wq="1200";
		break;
	case 3:
		wq="1800";
		break;
	case 4:
		wq="2400";
		break;
	case 5:
		wq="4800";
		break;
	case 6:
		wq="7200";
		break;
	case 7:
		wq="9600";
		break;
	case 8:
		wq="14400";
		break;
	case 9:
		wq ="19200";
		break;
	case 10:
		wq="38400";
		break;
	case 11:
		wq ="57600";
		break;
	case 12:
		wq ="115200";
		break;
	default:
		break;
	}
	BR=wq;
	BR+=",";
	switch(m_CheckBitWaiter2.GetCurSel())
	{
	case 0:
		wq="E";
		break;
	case 1:
		wq="M";
		break;
	case 2:
		wq="N";
		break;
	case 3:
		wq="O";
		break;
	case 4:
		wq="S";
		break;
	default:
		break;
	}
	BR+=wq;
	BR+=",";
	switch(m_DateBitWaiter2.GetCurSel())
	{
	case 0:
		wq="8";
		break;
	case 1:
		wq="7";
		break;
	case 2:
		wq="6";
		break;
	case 3:
		wq="5";
		break;
	}
	BR+=wq;
	BR+=",";
	switch(m_StopBitWaiter2.GetCurSel())
	{
	case 0:
		wq="1";
		break;
	case 1:
		wq="1.5";
		break;
	case 2:
		wq="2";
		break;
	default:
		break;
	}
	BR+=wq;
	int a;
	a=m_Waiter2Name.GetCurSel();
	m_Waiter2Name.GetLBText(a, wq);
	sh="没有";
	df="串口或串口被占用";
	error=sh + wq + df;
	m_Waiter2.SetCommPort(a+1);
	m_Waiter2.SetPortOpen(TRUE);	//打开串口,以判断串口是否存在
	if(m_Waiter2.GetPortOpen()) //如果串口是打开的,则行关闭串口
	{
		m_Waiter2.SetPortOpen(FALSE);
		m_Waiter2.SetInBufferSize(1024); //接收缓冲区
		m_Waiter2.SetOutBufferSize(1024);//发送缓冲区
		m_Waiter2.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读取
		m_Waiter2.SetInputMode(1);//以二进制方式读写数据
		m_Waiter2.SetRThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
		m_Waiter2.SetSettings(BR);//波特率9600无检验位,8个数据位,1个停止位
		m_Waiter2.SetOutBufferCount(0);
		m_Waiter2.SetPortOpen(TRUE);
		m_StatusWaiter2="打开";
		Waiter2Active=TRUE;
		GetDlgItem(IDC_OPEN_MASTER3)->EnableWindow(FALSE);
		GetDlgItem(IDC_CLOSE_MASTER3)->EnableWindow(TRUE);
		GetDlgItem(IDC_SEND_MASTER3)->EnableWindow(TRUE);
		UpdateData(FALSE);
	}
	else
		MessageBox(error);
}

void CSerialControlDlg::OnSendMaster2() 
{
	// TODO: Add your control notification handler code here
	if(m_Waiter1.GetPortOpen())
	{
		UpdateData(TRUE);
		CByteArray OutBuf;
		COleVariant varOutput;
		OutBuf.SetSize(m_SendDateWaiter1.GetLength());
		for(int i=0;i<m_SendDateWaiter1.GetLength();i++)
			OutBuf[i]=m_SendDateWaiter1.GetAt(i);
		varOutput=OutBuf;
		m_Waiter1.SetOutput(varOutput);
	}
}

void CSerialControlDlg::OnSendMaster3() 
{
	// TODO: Add your control notification handler code here
	if(m_Waiter2.GetPortOpen())
	{
		UpdateData(TRUE);
		CByteArray OutBuf;
		COleVariant varOutput;
		OutBuf.SetSize(m_SendDateWaiter2.GetLength());
		for(int i=0;i<m_SendDateWaiter2.GetLength();i++)
			OutBuf[i]=m_SendDateWaiter2.GetAt(i);
		varOutput=OutBuf;
		m_Waiter2.SetOutput(varOutput);
	}
	UpdateData();
}

void CSerialControlDlg::OnOnCommMscomwaiter1() 
{
	// 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_Waiter1.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
    {             ////////以下你可以根据自己的通信协议加入处理代码
        variant_inp=m_Waiter1.GetInput(); //读缓冲区
		if(!m_T_R)
		{
			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_ReciveWaiter1+=strtemp; //加入接收编辑框对应字符串 
			}
			UpdateData(FALSE);
		}
    }
    //更新编辑框内容
	
    if(m_Master.GetPortOpen())
	{
		m_Master.SetOutput(variant_inp);//发送数据
	}
}

void CSerialControlDlg::OnOnCommMscomwaiter2() 
{
	// 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_Waiter2.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
    {             ////////以下你可以根据自己的通信协议加入处理代码
        variant_inp=m_Waiter2.GetInput(); //读缓冲区
		if(!m_T_R)
		{
			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_ReciveWaiter2+=strtemp; //加入接收编辑框对应字符串 
			}
			UpdateData(FALSE);
		}
    }
    //更新编辑框内容
	
    if(m_Master.GetPortOpen())
	{
		m_Master.SetOutput(variant_inp);//发送数据
	}
}


void CSerialControlDlg::OnSelchangeMasterName() 
{
	// TODO: Add your control notification handler code here
	if(m_Master.GetPortOpen()) 
	{
		m_Master.SetPortOpen(FALSE);
		GetDlgItem(IDC_OPEN_MASTER)->EnableWindow(TRUE);
		GetDlgItem(IDC_CLOSE_MASTER)->EnableWindow(FALSE);
	}
	if(m_Waiter1.GetPortOpen())
	{
		m_Waiter1.SetPortOpen(FALSE);
		GetDlgItem(IDC_OPEN_MASTER2)->EnableWindow(TRUE);
		GetDlgItem(IDC_CLOSE_MASTER2)->EnableWindow(FALSE);
	}
	if(m_Waiter2.GetPortOpen())
	{
		m_Waiter2.SetPortOpen(FALSE);
		GetDlgItem(IDC_OPEN_MASTER3)->EnableWindow(TRUE);
		GetDlgItem(IDC_CLOSE_MASTER3)->EnableWindow(FALSE);
	}
}

void CSerialControlDlg::OnSelchangeMasterName2() 
{
	// TODO: Add your control notification handler code here
	if(m_Master.GetPortOpen()) 
	{
		m_Master.SetPortOpen(FALSE);
		GetDlgItem(IDC_OPEN_MASTER)->EnableWindow(TRUE);
		GetDlgItem(IDC_CLOSE_MASTER)->EnableWindow(FALSE);
	}
	if(m_Waiter1.GetPortOpen())
	{
		m_Waiter1.SetPortOpen(FALSE);
		GetDlgItem(IDC_OPEN_MASTER2)->EnableWindow(TRUE);
		GetDlgItem(IDC_CLOSE_MASTER2)->EnableWindow(FALSE);
	}
	if(m_Waiter2.GetPortOpen())
	{
		m_Waiter2.SetPortOpen(FALSE);
		GetDlgItem(IDC_OPEN_MASTER3)->EnableWindow(TRUE);
		GetDlgItem(IDC_CLOSE_MASTER3)->EnableWindow(FALSE);
	}
}

void CSerialControlDlg::OnSelchangeMasterName3() 
{
	// TODO: Add your control notification handler code here
	if(m_Master.GetPortOpen()) 
	{
		m_Master.SetPortOpen(FALSE);
		GetDlgItem(IDC_OPEN_MASTER)->EnableWindow(TRUE);
		GetDlgItem(IDC_CLOSE_MASTER)->EnableWindow(FALSE);
	}
	if(m_Waiter1.GetPortOpen())
	{
		m_Waiter1.SetPortOpen(FALSE);
		GetDlgItem(IDC_OPEN_MASTER2)->EnableWindow(TRUE);
		GetDlgItem(IDC_CLOSE_MASTER2)->EnableWindow(FALSE);
	}
	if(m_Waiter2.GetPortOpen())
	{
		m_Waiter2.SetPortOpen(FALSE);
		GetDlgItem(IDC_OPEN_MASTER3)->EnableWindow(TRUE);
		GetDlgItem(IDC_CLOSE_MASTER3)->EnableWindow(FALSE);
	}
}
void CSerialControlDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	CDialog::OnSysCommand(nID, lParam);
	switch(nID)
	{
	case SC_MINIMIZE:
		Shell_NotifyIcon(NIM_ADD,&m_NotiIconData);//在托盘区添加图标 
		ShowWindow(SW_HIDE);//隐藏主窗口 
		m_IsHided=true;
		break;
	}
}

void CSerialControlDlg::OnBnClickedOk()
{
	// TODO: Add your control notification handler code here
	SendMessage(WM_SYSCOMMAND,SC_MINIMIZE);
}
void CSerialControlDlg::OnCancel()
{
	int ret;
	
	if(m_IsHided)
		ret=MessageBox("真的要退出吗?","确认",MB_YESNO);
	else
		ret=MessageBox("真的要退出吗?(按否最小化到系统托盘图标中.)","确认",MB_YESNOCANCEL);
	if(IDYES==ret)
	{
		Shell_NotifyIcon(NIM_DELETE,&m_NotiIconData);//删掉托盘区图标 
        CDialog::OnCancel();
	}
	if(IDNO==ret)
		SendMessage(WM_SYSCOMMAND,SC_MINIMIZE);
}
LRESULT CSerialControlDlg::OnTaskbarRecreate( WPARAM wParam,LPARAM lParam) 
{
	Shell_NotifyIcon(NIM_DELETE,&m_NotiIconData);//删掉托盘区图标 
	if(m_IsHided)
		Shell_NotifyIcon(NIM_ADD,&m_NotiIconData);//
	return 0;
}
//wParam接收的是图标的ID,而lParam接收的是鼠标的行为 
LRESULT CSerialControlDlg::OnClickTaskIcon(WPARAM wParam,LPARAM lParam) 
{
	if(wParam!=IDR_MAINFRAME) 
		return 1; 
	switch(lParam) 
	{ 
	case WM_RBUTTONUP://右键起来时弹出快捷菜单		
					  /*{ 
					  LPPOINT lpoint=new tagPOINT; 
					  ::GetCursorPos(lpoint);//得到鼠标位置 
					  CMenu menu; 
					  menu.CreatePopupMenu();//声明一个弹出式菜单 
					  //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已 
					  //隐藏),将程序结束。 
					  menu.AppendMenu(MF_STRING,WM_DESTROY,"关闭"); 
					  //确定弹出式菜单的位置 
					  menu.TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON|TPM_LEFTBUTTON ,lpoint->x,lpoint->y,this); 
					  //资源回收 
					  HMENU hmenu=menu.Detach(); 
					  menu.DestroyMenu(); 
					  delete lpoint; 
					  } 
		break; */
		
	case WM_LBUTTONDBLCLK:
	case WM_RBUTTONDBLCLK:
	case WM_LBUTTONUP:
		{ 
			m_IsHided=false;
			Shell_NotifyIcon(NIM_DELETE,&m_NotiIconData);//删掉托盘区图标 
			
			//SetWindowPos(&CWnd::wndTop, 0, 0, 0, 0,SWP_NOMOVE|SWP_NOSIZE);
			this->ShowWindow(SW_SHOW   );//显示主窗口
			this->ShowWindow(SW_SHOWNORMAL   );//显示主窗口
			
		} 
		break; 
	} 
	return 0; 
	
}

⌨️ 快捷键说明

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