转自:VS2010基于对话框的MFC串口通信简明例程 作者:NodYoung
修改了原作者的一些小笔误,完善了一下整个过程
本例程是在VS2010环境下,使用MFC做的是一个简单的串口通信程序。欢迎交流。
程序源码(含一个虚拟串口软件):http://download.csdn.net/detail/nnnnnnnnnnnny/8643049
1.首先,在VS2010环境下创建基于对话框的MFC应用程序。
a.选择菜单项 文件—>新建—>项目,弹出新建项目
对话框。
b.左侧面板中选择Visual C++
下的MFC
,中间窗口中选择MFC应用程序
,然后在下面的名称编辑框中键入工程名称,本例取名SerialTest
,在位置
编辑框中设置工程的保存路径。点击确定
。
c.在弹出的MFC应用程序向导
中,点下一步
到应用程序类型
界面,在应用程序类型
下选择基于对话框
,其他使用默认设置,点击完成
。
2.接下来为对话框添加所需要的控件
a.在资源视图
的资源树中双击Dialog
下的IDD_SERIALTEST_DIALOG
,出现如下对话框编辑窗口(默认新建项目也是出现此界面,所以此步无需操作,仅作说明)
b.选中控件按Delete
键删除自动生成的静态文本框TODO:在此放置对话框控件
、按钮控件确定
和取消
。
c.从右侧工具箱
中添加两个Button
按钮,两个Edit Control
编辑框,一个StaticText
静态文本框和一个Combo Box
组合框。(提示:在工具箱
中鼠标左键点下所需控件不放开,并拖到IDD_ADDITION_DIALOG
对话框模板上,模板上会出现一个虚线框,我们找到合适的位置松开鼠标左键放下它,即可成功添加所需控件)。
d.适当改变控件大小,并合理布局控件,使之如下图所示(提示:1.用鼠标左键选中控件后周围出现虚线框,然后鼠标移到虚线框上几个黑点的位置会变成双向箭头的形状,此时就可以按下鼠标左键并拖动来改变控件大小了。当然,整个对话框模板也可以用这种方法改变大小。2.几个控件的对齐等操作可按Ctrl键同时选中几个控件,然后选择软件左上侧工具条中的几个按钮进行操作)
e.更改控件属性(选中控件,鼠标移至右侧属性,即出现该控件的属性面板):更改
Button1
的Caption
为清除接收框
、ID
为IDC_BUTTON_CLEANUP
;
Button2
的Caption
为发送数据
、ID
为IDC_BUTTON_SEND
;下面的编辑框用于显示发送数据,ID
设为IDC_EDIT_TXDATA
;
上面的编辑框用于显示接收到的数据,
ID
设为IDC_EDIT_RXDATA
;静态文本框的Caption
为选择COM口:
;ComboBox
的
ID
设为IDC_COMBO_COM
,Type
属性设为DropList
(即下拉列表式组合框,其编辑框是不能编辑的,只能由用户在下拉列表框中选择了某项后,在编辑框中显示其文本),Sort
属性设为False
,以取消自动排序显示。
f.添加串口通信控件。首先把串口通信控件加入到工具箱中,因为默认的工具箱是不带 MS 串口通信控件的(MS 串口通信工具箱下载地址和安装方法 (可私信我发送))。方法如下:
在工具箱界面点击鼠标右键出现如下界面:
这样串口控件就已经添加至工具箱了,
将其拖入对话框里,如图所示(串口控件在运行时是看不到的)
至此控件添加基本上就完成了。
3.编写消息处理函数
a. 给Combo Box
组合框添加列表项。选中ComboBox
控件,右键
->添加变量
,设置变量名为m_comboCom
,如图所示,点击完成。
在左侧类视图面板中,选择
CSerialTestDlg
类,双击下方的OnInitDialog()
函数进入CSerialTestDlg::OnInitDialog()
函数
在
//TODO:在此添加额外的初始化代码
添加如下代码:
// TODO: 在此添加额外的初始化代码
m_comboCom.AddString(_T("COM1")); // 为组合框控件的列表框添加列表项
m_comboCom.AddString(_T("COM2"));
m_comboCom.AddString(_T("COM3"));
m_comboCom.AddString(_T("COM4"));
m_comboCom.AddString(_T("COM5"));
m_comboCom.AddString(_T("COM6"));
m_comboCom.AddString(_T("COM7"));
m_comboCom.AddString(_T("COM8"));
m_comboCom.AddString(_T("COM9"));
m_comboCom.AddString(_T("COM10"));
b.我们希望在组合框中选中的列表项改变时,以打开相应串口并设置串口参数,那么这就要用到CBN_SELCHANGE
通知消息。选中ComboBox
,右键
->添加事件处理程序
,出现如图所示界面,点击添加编辑
。
在
CSerialTestDlg::OnCbnSelchangeComboCom()
函数中添加代码之前我们需要给串口控件添加控制变量m_ctrlComm
(方法见3.->a.),如图
然后我们创建一个类,类名为
mscomm1
:
mscomm1.h
复制如下代码:
#pragma once
// 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类
// 注意: 不要修改此文件的内容。如果此类由
// Microsoft Visual C++ 重新生成,您的修改将被覆盖。
/////////////////////////////////////////////////////////////////////////////
// CMscomm1 包装类
class CMscomm1 : public CWnd
{
protected:
DECLARE_DYNCREATE(CMscomm1)
public:
CLSID const& GetClsid()
{
static CLSID const clsid
= { 0x648A5600, 0x2C6E, 0x101B, { 0x82, 0xB6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14 } };
return clsid;
}
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect, CWnd* pParentWnd, UINT nID,
CCreateContext* pContext = NULL)
{
return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID);
}
BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
UINT nID, CFile* pPersist = NULL, BOOL bStorage = FALSE,
BSTR bstrLicKey = NULL)
{
return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,
pPersist, bStorage, bstrLicKey);
}
// 特性
public:
enum
{
NoHandshaking = 0,
XonXoff = 1,
RtsCts = 2,
XonXoffAndRtsCts = 3
}HandshakingConstants;
enum
{
comNone = 0,
comXOnXoff = 1,
comRTS = 2,
comRTSXOnXOff = 3
}HandshakeConstants;
enum
{
comInvalidPropertyValue = 380,
comGetNotSupported = 394,
comSetNotSupported = 383,
comPortInvalid = 8002,
comPortAlreadyOpen = 8005,
comPortOpen = 8000,
comNoOpen = 8012,
comSetCommStateFailed = 8015,
comPortNotOpen = 8018,
comReadError = 8020,
comDCBError = 8021,
comBreak = 1001,
comCTSTO = 1002,
comDSRTO = 1003,
comFrame = 1004,
comOverrun = 1006,
comCDTO = 1007,
comRxOver = 1008,
comRxParity = 1009,
comTxFull = 1010,
comDCB = 1011
}ErrorConstants;
enum
{
comEventBreak = 1001,
comEventCTSTO = 1002,
comEventDSRTO = 1003,
comEventFrame = 1004,
comEventOverrun = 1006,
comEventCDTO = 1007,
comEventRxOver = 1008,
comEventRxParity = 1009,
comEventTxFull = 1010,
comEventDCB = 1011
}CommEventConstants;
enum
{
comEvSend = 1,
comEvReceive = 2,
comEvCTS = 3,
comEvDSR = 4,
comEvCD = 5,
comEvRing = 6,
comEvEOF = 7
}OnCommConstants;
enum
{
comInputModeText = 0,
comInputModeBinary = 1
}InputModeConstants;
// 操作
public:
// IMSComm
// Functions
//
void put_CDHolding(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x1, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_CDHolding()
{
BOOL result;
InvokeHelper(0x1, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_CDTimeout(long newValue)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0x2, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long get_CDTimeout()
{
long result;
InvokeHelper(0x2, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void put_CommID(long newValue)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0x3, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long get_CommID()
{
long result;
InvokeHelper(0x3, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void put_CommPort(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0x4, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get_CommPort()
{
short result;
InvokeHelper(0x4, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put__CommPort(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0x0, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get__CommPort()
{
short result;
InvokeHelper(0x0, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put_CTSHolding(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x5, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_CTSHolding()
{
BOOL result;
InvokeHelper(0x5, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_CTSTimeout(long newValue)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0x6, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long get_CTSTimeout()
{
long result;
InvokeHelper(0x6, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void put_DSRHolding(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x7, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_DSRHolding()
{
BOOL result;
InvokeHelper(0x7, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_DSRTimeout(long newValue)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0x8, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long get_DSRTimeout()
{
long result;
InvokeHelper(0x8, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void put_DTREnable(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x9, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_DTREnable()
{
BOOL result;
InvokeHelper(0x9, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_Handshaking(long newValue)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0xa, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long get_Handshaking()
{
long result;
InvokeHelper(0xa, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void put_InBufferSize(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0xb, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get_InBufferSize()
{
short result;
InvokeHelper(0xb, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put_InBufferCount(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0xc, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get_InBufferCount()
{
short result;
InvokeHelper(0xc, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put_Break(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0xd, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_Break()
{
BOOL result;
InvokeHelper(0xd, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_InputLen(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0xe, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get_InputLen()
{
short result;
InvokeHelper(0xe, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put_Interval(long newValue)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0xf, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long get_Interval()
{
long result;
InvokeHelper(0xf, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void put_NullDiscard(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x10, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_NullDiscard()
{
BOOL result;
InvokeHelper(0x10, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_OutBufferSize(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0x11, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get_OutBufferSize()
{
short result;
InvokeHelper(0x11, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put_OutBufferCount(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0x12, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get_OutBufferCount()
{
short result;
InvokeHelper(0x12, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put_ParityReplace(LPCTSTR newValue)
{
static BYTE parms[] = VTS_BSTR ;
InvokeHelper(0x13, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
CString get_ParityReplace()
{
CString result;
InvokeHelper(0x13, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
return result;
}
void put_PortOpen(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x14, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_PortOpen()
{
BOOL result;
InvokeHelper(0x14, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_RThreshold(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0x15, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get_RThreshold()
{
short result;
InvokeHelper(0x15, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put_RTSEnable(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x16, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_RTSEnable()
{
BOOL result;
InvokeHelper(0x16, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_Settings(LPCTSTR newValue)
{
static BYTE parms[] = VTS_BSTR ;
InvokeHelper(0x17, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
CString get_Settings()
{
CString result;
InvokeHelper(0x17, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
return result;
}
void put_SThreshold(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0x18, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get_SThreshold()
{
short result;
InvokeHelper(0x18, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put_Output(VARIANT newValue)
{
static BYTE parms[] = VTS_VARIANT ;
InvokeHelper(0x19, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, &newValue);
}
VARIANT get_Output()
{
VARIANT result;
InvokeHelper(0x19, DISPATCH_PROPERTYGET, VT_VARIANT, (void*)&result, NULL);
return result;
}
void put_Input(VARIANT newValue)
{
static BYTE parms[] = VTS_VARIANT ;
InvokeHelper(0x1a, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, &newValue);
}
VARIANT get_Input()
{
VARIANT result;
InvokeHelper(0x1a, DISPATCH_PROPERTYGET, VT_VARIANT, (void*)&result, NULL);
return result;
}
void put_CommEvent(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0x1b, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get_CommEvent()
{
short result;
InvokeHelper(0x1b, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put_EOFEnable(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x1c, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_EOFEnable()
{
BOOL result;
InvokeHelper(0x1c, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_InputMode(long newValue)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0x1d, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long get_InputMode()
{
long result;
InvokeHelper(0x1d, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void AboutBox()
{
InvokeHelper(DISPID_ABOUTBOX, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}
// Properties
//
};
mscomm1.cpp
复制如下代码:
// 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类
// 注意: 不要修改此文件的内容。如果此类由
// Microsoft Visual C++ 重新生成,您的修改将被覆盖。
#include "stdafx.h"
#include "mscomm1.h"
/////////////////////////////////////////////////////////////////////////////
// CMscomm1
IMPLEMENT_DYNCREATE(CMscomm1, CWnd)
/////////////////////////////////////////////////////////////////////////////
// CMscomm1 属性
/////////////////////////////////////////////////////////////////////////////
// CMscomm1 操作
在SerialTestDlg.h
中添加头文件:
// SerialTestDlg.h : 头文件
//
#pragma once
#include "afxwin.h"
#include "mscomm1.h"
// CSerialTestDlg 对话框
并在CSerialTestDlg
类中添加变量m_setOk
(用于标记串口是否设置好),方法:在类视图面板中选中CSerialTestDlg
,右键
->添加
->添加变量
,
在弹出的界面中,选择访问:
private
,变量类型:bool
,变量名:m_setOk
。这里看到SerialTestDlg.h中已经添加了此变量,并在构造函数中进行初始化:
现在我们回到
CSerialTestDlg::OnCbnSelchangeComboCom()
中,添加如下代码:
void CSerialTestDlg::OnCbnSelchangeComboCom()
{
// TODO: 在此添加控件通知处理程序代码
int nSel;
nSel = m_comboCom.GetCurSel();//获取组合框控件的列表框中选中项的索引
m_ctrlComm.put_CommPort(nSel+1);//选择串口号(这里因为列表框的索引号是从0开始,所以(nSel+1)对应的才是我们所选的串口号)
m_ctrlComm.put_PortOpen(TRUE);//打开串口
m_ctrlComm.put_RThreshold(2);//收到两个字节引发OnComm事件
m_ctrlComm.put_InputMode(1);//输入模式选为二进制
m_ctrlComm.put_Settings(_T("9600,n,8,1"));//设置串口参数,波特率,无奇偶校验,位停止位,位数据位
m_ctrlComm.put_InputMode(1); // 以二进制方式检取数据
m_ctrlComm.put_RThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_ctrlComm.put_InputLen(0); //设置当前接收区数据长度为0
m_ctrlComm.get_Input();//先预读缓冲区以清除残留数据
m_setOk = true; //标记串口设置OK
}
c.添加串口事件消息处理函数。在此步之前,我们先给IDC_EDIT_TXDATA
编辑框添加CString
变量m_strTXData
和IDC_EDIT_RXDATA
编辑框添加CString
变量m_strRXData
(方法见3.->a.
,注意变量类型改为CString
,类别改为Value
)
然后我们添加串口消息事件处理函数(方法见3.->b.
),并将函数改名为OnComm
在
CSerialTestDlg::OnComm()
函数中添加如下代码:
void CSerialTestDlg::OnComm()
{
// TODO: 在此处添加消息处理程序代码
VARIANT variant_inp; //Variant 是一种特殊的数据类型,除了定长String数据及用户定义类型外,可以包含任何种类的数据。
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integer that is not signed.
CString strtemp;
if(m_ctrlComm.get_CommEvent() == 2) //事件值为2表示接收缓冲区内有字符
{
////////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_ctrlComm.get_Input(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k
d.添加发送数据按钮的BN_CLICKED
消息的处理函数(方法见3.->b.
),
在
CSerialTestDlg::OnBnClickedButtonSend()
中添加如下代码:
void CSerialTestDlg::OnBnClickedButtonSend()
{
// TODO: 在此添加控件通知处理程序代码
if (m_setOk == true) //判断是否打开并初始化串口
{
UpdateData(TRUE); //读取编辑框内容
m_ctrlComm.put_Output(COleVariant(m_strTXData)); //发送数据
}
else
{
MessageBox(_T("请先选择COM口"));
}
}
e.同理,添加清楚接收框按钮的BN_CLICKED
消息的处理函数(方法见3.->b.
),
在CSerialTestDlg::OnBnClickedButtonCleanup()
中添加如下代码:
void CSerialTestDlg::OnBnClickedButtonCleanup()
{
// TODO: 在此添加控件通知处理程序代码
m_strRXData="";
UpdateData(FALSE);//更新编辑框内容
}
4.生成可执行代码
a.点击启动调试
按钮或摁F5
,编译成功
b.点击菜单栏
生成
->配置管理器
,
在活动解决方案配置下拉菜单中选择
Release
,点击关闭
。
再次编译,即可看到在目录中生成了的Release文件夹下生成了.exe文件。
5.检测软件是否能正常工作,
a.这里首先要下一个虚拟串口。下载地址:http://www.cr173.com/soft/21406.html(也可在文首提供的链接处下载)
安装完成后,打开软件
虚拟串口COM3和COM5:在右侧端口一、二分别改为COM3和COM5,点击添加端口。
b.然后打开两个刚才生成的.exe文件,分别选择COM3和COM5。
分别在发送数据的编辑框里随便输入几个字符,点击发送数据
成功。