关于MFC 创建一个新的串口上位机通讯程序:
1.
百度里面输入搜索一个像
这样的一个控件,
2.MFC编译中找到选择工具项
COM组件添加控件在工具箱内拖动在窗口内使用;
注意:我使用的编译配置管理器时X86,切换到X64就会报错,
3.创建一个新的MFC应用程序;
添加如上图中功能控件,给OnCommMscomm1(像电话的这个控件)右击添加事件处理程序
void C串口通讯Dlg::OnCommMscomm1()
{
// TODO: 在此处添加消息处理程序代码
if (m_mscom.get_CommEvent() == 2) //事件值为2表示接收缓冲区内有字符
{
char str[1024] = { 0 };
long k;
VARIANT InputData = m_mscom.get_Input(); //读缓冲区
COleSafeArray fs;
fs = InputData; //VARIANT型变量转换为COleSafeArray型变量
for (k = 0; k<fs.GetOneDimSize(); k++)
fs.GetElement(&k, str + k); //转换为BYTE型数组
m_EditReveive += str; // 接收到编辑框里面
//SetTimer(1,10,NULL); //延时10ms
UpdateData(false); //更新到控件
}
}
4.添加串口号:
void C串口通讯Dlg::GetCom()
{
//程序启动时获取全部可用串口
HANDLE hCom;
int i, k;
CString str;
BOOL flag;
((CComboBox *)GetDlgItem(IDC_COMBO1))->ResetContent();
flag = FALSE;
num = 0;
for (i = 1; i <= 16; i++)
{//此程序支持16个串口
str.Format(L"\\\\.\\COM%d", i);
hCom = CreateFile(str, 0, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (INVALID_HANDLE_VALUE != hCom)
{//能打开该串口,则添加该串口
CloseHandle(hCom);
str = str.Mid(4);
((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString(str);
if (flag == FALSE)
{
flag = TRUE;
num = i;
}
}
}
i = ((CComboBox *)GetDlgItem(IDC_COMBO1))->GetCount();
if (i == 0)
{//若找不到可用串口则禁用“打开串口”功能
((CComboBox *)GetDlgItem(IDC_COMBO1))->EnableWindow(FALSE);
}
else
{
k = ((CComboBox *)GetDlgItem((IDC_COMBO1)))->GetCount();
((CComboBox *)GetDlgItem(IDC_COMBO1))->SetCurSel(k - 1);
//mCom.BindCommPort(num);
}
}
5.添加按钮程序:
void C串口通讯Dlg::OnBnClickedButton1()//打开串口按钮
{
// TODO: 在此添加控件通知处理程序代码
CString str, n; //定义字符串
GetDlgItemText(IDC_BUTTON1, str); //获取给定控件的文本
CWnd *h1;
h1 = GetDlgItem(IDC_BUTTON1); //指向控件的caption
if (!m_mscom.get_PortOpen())
{
try
{
m_mscom.put_CommPort(num); //选择串口
}
catch (CException* e)
{
m_mscom.put_OutBufferCount(0);
AfxMessageBox(L"打开串口 失败");
return;
}
m_mscom.put_InputMode(1); //设置输入方式为二进制方式
m_mscom.put_Settings(_T("9600,n,8,1")); //设置串口参数,波特率,无奇偶校验,位停止位,位数据位
m_mscom.put_InputLen(1024); //设置当前接收区数据长度为1024
m_mscom.put_RThreshold(1); //接收缓冲区有1个及1个以上字符时,触发OnComm事件
m_mscom.put_RTSEnable(1); //设置RT允许
m_mscom.put_PortOpen(true); //打开串口
if (m_mscom.get_PortOpen())
{
str = _T("关闭串口");
UpdateData(true);
h1->SetWindowText(str); //改变按钮名称为‘’关闭串口”
}
}
else
{
m_mscom.put_PortOpen(false); //关闭串口
if (str != _T("打开串口"))
{
str = _T("打开串口");
UpdateData(true); //将控件的状态传给其关联的变量
h1->SetWindowText(str); //改变按钮名称为打开串口
}
}
}
6。添加初始化程序;
// TODO: 在此添加额外的初始化代码
//m_Combo.AddString(_T("COM1"));
//m_Combo.AddString(_T("COM2"));
//m_Combo.AddString(_T("COM3"));
//m_Combo.AddString(_T("COM4"));
//m_Combo.AddString(_T("COM5"));
//m_Combo.AddString(_T("COM6"));
//m_Combo.AddString(_T("COM7"));
//m_Combo.AddString(_T("COM8"));
//m_Combo.AddString(_T("COM9"));
//m_Combo.SetCurSel(0);//初始时下拉列表为COM1
//程序启动时获取全部可用串口
HANDLE hCom;
int i, k;
CString str;
BOOL flag;
((CComboBox *)GetDlgItem(IDC_COMBO1))->ResetContent();
flag = FALSE;
num = 0;
for (i = 1; i <= 16; i++)
{//此程序支持16个串口
str.Format(L"\\\\.\\COM%d", i);
hCom = CreateFile(str, 0, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (INVALID_HANDLE_VALUE != hCom)
{//能打开该串口,则添加该串口
CloseHandle(hCom);
str = str.Mid(4);
((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString(str);
if (flag == FALSE)
{
flag = TRUE;
num = i;
}
}
}
i = ((CComboBox *)GetDlgItem(IDC_COMBO1))->GetCount();
if (i == 0)
{//若找不到可用串口则禁用“打开串口”功能
((CComboBox *)GetDlgItem(IDC_COMBO1))->EnableWindow(FALSE);
}
else
{
k = ((CComboBox *)GetDlgItem((IDC_COMBO1)))->GetCount();
((CComboBox *)GetDlgItem(IDC_COMBO1))->SetCurSel(k - 1);
//mCom.BindCommPort(num);
}
读取COM程序可以自己修改该为手动选择模式。
程序功能实现: