VS2017基于MFC 的串口通信上位机总结

VS2017基于MFC 串口通信上位机,实现串口发送、接收数据。
1.打开VS2017 创建 MFC应用程序,选择基于对话框类 完成。

2.将对话框上原有的控件删除,添加所需的控件。
发送部分:Radio Button、Edit Control
接收部分:Edit Control
选择串口、波特率:Combo Box
按键:打开串口、发送数据
图标显示:指示串口打开、关闭状态
Activex 串口控件:Microsoft Communications Control,Version 6.0
( Activex 串口控件添加方法 项目->添加新项-> Activex控件中的MFC类->从可用的控件中选择Microsoft Communications Control,Version 6.0生成CMSComm类)

3.为控件添加变量
串口通道 IDC_CMB_COM m_cmbCom
波特率 IDC_CMB_BAUD m_cmbBaud
Activex 串口控件 IDC_MSCOMM1 m_comm
接受区EDIT IDC_EDT_DATA m_edtData
接受区EDIT IDC_EDT_SEND m_edtSend
3.为各控件添加控制程序
①选择串口 与 波特率 的 Combo Box 设置
在BOOL C串口Dlg::OnInitDialog() 内添加如下代码

m_cmbCom.AddString(L"COM1");
	m_cmbCom.AddString(L"COM2");
	m_cmbCom.AddString(L"COM3");
	m_cmbCom.AddString(L"COM4");
	m_cmbCom.AddString(L"COM5");
	m_cmbCom.AddString(L"COM6");
	m_cmbCom.AddString(L"COM7");
	m_cmbCom.AddString(L"COM8");
	m_cmbCom.AddString(L"COM9");
	m_cmbCom.AddString(L"COM10");
	m_cmbCom.SetCurSel(3);

	m_cmbBaud.AddString(L"600");
	m_cmbBaud.AddString(L"1200");
	m_cmbBaud.AddString(L"2400");
	m_cmbBaud.AddString(L"4800");
	m_cmbBaud.AddString(L"9600");
	m_cmbBaud.AddString(L"38400");
	m_cmbBaud.AddString(L"57600");
	m_cmbBaud.AddString(L"115200");
	m_cmbBaud.SetCurSel(7);

② 打开串口按钮 ,显示指示图标
提示:双击打开按钮 会直接跳转到 void C串口Dlg::OnBnClickedButtonOpen() 函数

void CchuankouDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	if (!m_comm.get_PortOpen())//如果串口未打开
	{

		CString baud;
		GetDlgItemText(IDC_CMB_BAUD, baud);//取得波特率口当前的选择值,存放在baud里
		CString baudPort = baud + _T(",n,8,1");// 设置波特率、无校验,8数据位,1个停止位
		m_comm.put_CommPort(m_cmbCom.GetCurSel());//选择串口,m_cmbCom:串口选择组合框的 成员变量
		m_comm.put_InBufferSize(1024); //   put__InBufferSize(1024); //设置输入缓冲区的大小,Bytes
		m_comm.put_OutBufferSize(1024);   // put__OutBufferSize(512); //设置发送缓冲区的大小,Bytes// 
		m_comm.put_PortOpen(TRUE);//  SetPortOpen(TRUE);
		m_comm.put_InputMode(1);  //  SetInputMode(1); //设置输入方式为二进制方式
		m_comm.put_Settings(baudPort);    //  SetSettings("9600,n,8,1"); //设置波特率等参数
		m_comm.put_RThreshold(1); //SetRThreshold(1); //为1表示有一个字符引发一个事件
		m_comm.put_InputLen(0);// SetInputLen(0); 设置当前接收区数据长度为0,表示全部读取
		SetDlgItemText(IDC_BTN_OPEN, _T("关闭串口"));
	}
	else
	{
		m_comm.put_PortOpen(FALSE);
		SetDlgItemText(IDC_BTN_OPEN, _T("打开串口"));
	}
}

③串口控件程序:点击Activex 控件,右键 为控件添加处理程序

void CchuankouDlg::OnCommMscomm1()
{
	// TODO: 在此处添加消息处理程序代码
	CString strData;
	GetDlgItemText(IDC_EDT_DATA, strData);
	if (m_comm.get_CommEvent() == 2)
	{
		char str[1024] = { 0 };
		long k;
		VARIANT InputData = m_comm.get_Input();	//读缓冲区
		COleSafeArray fs;
		fs = InputData;	//VARIANT型变À量转换为COleSafeArray型变量
		for (k = 0; k < (long)fs.GetOneDimSize(); k++)
			fs.GetElement(&k, str + k);	//转换为BYTE型数组

		strData += str;      //	接收到编辑框里面

		SetDlgItemText(IDC_EDT_DATA, strData);
	}
}

④发送数据按钮程序

void CchuankouDlg::OnBnClickedBtnSendData()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);
	CString sendDAta;
	GetDlgItemText(IDC_EDT_SEND, sendDAta);
	if (sendDAta == "")
	{
		MessageBox(_T("发送数据不能为空"), _T("警告"), MB_OK | MB_ICONWARNING);
		return;
	}
	char *data = CstringToChar(sendDAta);

	m_comm.put_Output(COleVariant(sendDAta));
	UpdateData(FALSE);

}

界面图
VS2017基于MFC 的串口通信上位机总结_第1张图片
程序资源链接:
https://download.csdn.net/download/weixin_42403113/11792326

你可能感兴趣的:(MFC)