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);
}
界面图
程序资源链接:
https://download.csdn.net/download/weixin_42403113/11792326