前期准备参考:https://blog.csdn.net/qq_20044829/article/details/82902000
在VS2015下通过串口成功之后,移植到MFC上进行串口通信,具体就是通过设置下拉列表选择COM口而不是直接在程序中固定COM口,然后实现数据的发送。
1.新建一个MFC对话框工程,删除中间的框。
2.点击右侧工具箱分别选择l两个按钮控件和ComboBox控件,右键点击各个控件进入属性进行设置。第一个按钮名字设置为“打开串口”,ID为IDC_BUTTON_OPEN。第二个按钮名字设置为“发送数据”,ID为IDC_BUTTON_SEND。ComboBox设置为下拉列表,也就是不能编辑只能选择。设置完具体如下图
3.为ComboBox控件添加变量。
(注意)1)如果对ComboBox控件添加变量时发现控件控件变量是灰色的无法选择时,需要对ComboBox重新定义一个类。右键点击ComboBox控件,选择添加类。因为本文博客工程为MFC_UART,类名写为:CMFC_UARTDlg;基类选择为:CDialog。
2)如果直接添加变量可以第一步不用管。对ComboBox右键点击添加变量,变量名为:m_Combo,保存工程。
4.添加CnComm.h并添加SerialThread.cpp与SerialThread.h。在建的工程MFC_UARTDlg.cpp的OnInitDialog()中添加如下代码。
BOOL CMFC_UARTDlg::OnInitDialog()
{
........//这些都是系统代码
// 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
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
编译程序,然后会出错,这里是因为没有加入#include"stdafx.h",这里需要在SerialThread.cpp的第一行添加,一定记住是第一行添加#include"stdafx.h",添加完之后编译,运行。
5.在MFC_UARTDlg.h添加#include "SerialThread.h"。在#include "SerialThread.h"和#include "SerialThread.cpp"中对应修改。
bool SerialThread::ThreadInit(char dat)
{
if (!Com.IsOpen())
{
//CnComm::Open函数就是用来打开串口
//bool Open(DWORD dwPort, LPCTSTR szPortName, DWORD dwBaudRate, BYTE btParity = NOPARITY, BYTE btByteSize = 8, BYTE btStopBits = ONESTOPBIT)
//dwPort,szPortName可以在“计算机管理->设备管理器->端口(COM和LPT)->双击设备名:位置”
//if (!Com.Open(9, _T("COM5"), 115200))//
if(!Com.Open(dat, 115200))//选择串口4
{
//cout << "open fail" << endl;
::MessageBox(NULL, _T("串口打开失败"), _T("错误"), MB_OK);
return false;
}
return true;
}
else
{
//cout << "already open" << endl;
::MessageBox(NULL, _T("串口已经打开"), _T("错误"), MB_OK);
}
return true;
}
这里做的步骤主要是通过获取COMx,然后把x取出来进行输入。
6.修改断言,如果串口没有打开直接返回然后继续选择串口就可以了。
点击上面程序中的open进行修改断言。如下图
7.双击打开串口,在该OnBnClickedButtonOpen()下添加代码
void CMFC_UARTDlg::OnBnClickedButtonOpen()
{
// TODO: 在此添加控件通知处理程序代码
char com_ch[5]; char com_data = 0;
int nIndex = m_Combo.GetCurSel();
CString strCom; CString strtmp;
m_Combo.GetLBText(nIndex, strCom);
strcpy(com_ch, CW2A(strCom));
com_data = com_ch[3] - 0x30;
//strtmp.Format(_T("COM:%d\n"), com_data);// 消息显示数字
//MessageBox(strtmp);
SerialThread st;
m_ComPortFlag = st.ThreadInit(com_data);
}
在MFC_UARTDlg.cpp上面定义 bool m_ComPortFlag = false;
8.双击发送数据添加如下代码
void CMFC_UARTDlg::OnBnClickedButtonSend()
{
// TODO: 在此添加控件通知处理程序代码
if (m_ComPortFlag == true)
{
::MessageBox(NULL, _T("串口打开成功"), _T("提示"), MB_OK);
int num = 6666;
char str[25];
itoa(num, str, 10);// 数字转换成字符串
SerialThread st;
st.SendDatas(str);//发送控制字符
}
}
9.结果
这里由于没有写显示因此打开成功直接弹出消息。