
其于 MFC 的串口调试助手编辑过程
一、 新建
打开 VC6.0 文件 新建 工程 MFC AppWiard(exe) 位置(选择保存工程位置)
工程名称(输入工程名 XXXX) 确定 选择基本对话框 下一步 下一步 下一
步 选择(CXXXXDlg) 完成 确定 在生成的基本对话框内将不需要按钮及提示
框(自动生成的“确定”“取消” 及提示框)删除或修改使用,至此基本框架完成如下图:
二、 往生成的基本框架中添加控件
1、因为控件列表框内没有串口通信用到的通信控件,所以要先添加到控件列表框内再
将控件添加到基本框内使用,步骤如下:
菜单栏 工程 添加到工程 Components and controls… Registered ActiveX
Controls 选择“Microsoft Communications Control, version 6.0” Insert
确定 OK 关闭此子窗口完成添加操作标志如上图所示。
2、将刚才添加添加到控件列表框内的串口控件添加到基本框架内
点击控件列表框内的串口控件,此时光标变为“十”形,在基本框架内随意划取一矩形
区域,即可以添加串口控件,不需要修改此控件的大小及位置,因为程编译运行后此
控件是看不到的,步骤结果如下图:
此 控 件
(标志)
是下面步
骤添加进
来的串口
控件
基 本 框
架

3、继续往基本框架内添加用于编辑发送数据的输入编辑框及输出编辑框,同理选择控
件列表框内的“编辑框控件”,以相同的操作即可添加两个编辑窗口及一个按纽控件如
下图所示:
这两个窗口需要修改大小及位置,因为程序运行后将会显示而串口通信控件则不显示,
上图是运行后的效果。
4、对以上四个控件编程步骤如下:
a、右击串口通信控件 建立类向导 Member variables Control IDS 中选择
IDC_MSCOMM1 add variable… Member variable name 中 输 入 控 件 变 量 名
m_ctrlComm(变量名可以随意选取,但程序中应与所取变量名一致) OK 确
定
选 择 其 中 任
意 一 个 作 为
输 入 编 辑 框
及 输 出 编 辑
框

b、右击编辑框、属性、常规、ID:中输入 ID 号,此编辑框用于接收显示数据的其 ID
号为 IDC_EDIT_RXDATA(可以随意选取,但程序中应与所取 ID 号一致),再在此窗
口的样式中勾选”多行”,同时将“自动水平滚动(T)”勾选去掉,再勾选“垂直滚动
(V)”,此勾选操作是用于垂直多行显示的,按回车后即可输入 ;同理右击另一编辑
框输入 ID 号为 IDC_EDIT_TXDATA 此编辑框用于编辑发送数据的,同样也选上用于
垂直多行显示,发送框可以不用垂直 多行显示; 再为按钮控 件添 加 ID 号,为
IDC_BUTTON_MANUALSEND,并将标题中的“Button1”改为“发送”,功能是按一
次就把发送编辑框中的内容发送一次。
C、为以上两个编辑框添加变量,与串口通信控件一样添加,为 IDC_EDIT_RXDATA
添加 CString 型变量 m_strRXData ;为 IDC_EDIT_TXDATA 添加 CString 型变量
m_strTXData。说明: m_strRXData 和 m_strTXData 分别用来放入接收和发送
的字符数据。
D、添加串口事件消息处理函数 OnComm() 打开 ClassWizard->Message Maps,选择
IDC_MSCOMM1,双击消息 OnComm,将弹出的对话框中将函数名改为 OnComm,
(好记而已)OK。
这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接
收数 据缓 冲区 中有 字 符 的 消 息 事件 ,我 们刚 才添 加的 函数 就 会 执 行 , 我们 在
OnComm()函数加入相应的处理代码就能实现自已想要的功能了。在函数中加入如下
代码:
代码段 1:
void CScommTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;//定义一个 VARIANT 类对象
COleSafeArray safearray_inp;//定义一个 COleSafeArray 对象
LONG len,k;
BYTE rxdata[2048];//设置 BYTE 数组 AN 8—intterthat is not signed.
CString strtemp;
if (m_ctrlComm.GetCommEvent()==2)//事件值为 2 表示接收缓冲区内有数据
{
////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_ctrlComm.GetInput();//读缓冲区
safearray_inp=variant_inp;//VARIANT 型变量转换为 ColeSafeArray 型变量
len=safearray_inp.GetOneDimSize();
for(k=0;k<len;k++)
{
safearray_inp.GetElement(&k,rxdata+k);//转换为 BYTE 型数组
}
for(k=0;k<len;k++)//将数组转换为 Cstring 型变量
{
BYTE bt=*(char*)(rxdata+k);
//if(m_ctrlHexSend.GetCheck())//如果是 HEX 显示则转为 16 进制
// strtemp.Format("%02x ",bt); //将 16 进制数送入临时变量 strtemp 存放
提示 2 :此三句是
下面用于是否是十
六进制发送的,暂
时可以不用理会
提示 1 :此句以
下才是我们要添
加的语句

// else
strtemp.Format("%c",bt);//将字符送入临时变量 strtemp 存放
m_strRXData+=strtemp;//加入接收编辑框对应字符串
}
}
UpdateData(FALSE);//更新编辑框内容(主要是接收编辑框中的)
}
到目前为止还不能在接收编辑框中看到数据,因为我们还没有打开串口,但运行程序
不应该有任何错误,不然,你肯定哪儿没看仔细,因为我是打开 VC6 对照着做一步
写一行的,运行试试。没错吧?那么做下一步:
E、打开串口和设置串口参数 你可以在你需要的时候打开串口,例如在程序中做一个
开 始 按 钮 , 在 该 按 钮 的 处 理 函 数 中 打 开 串 口 。 现 在 我 们 在 主 对 话 框 的
CSCommTestDlg::OnInitDialog()打开串口,加入如下代码:
代码段 2:
BOOL CSCommTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
// m_ComboBox.SetCurSel(0);//打开软件时串口选择框默认显示 COM1
// m_BaudRate_M.SetCurSel(0);//打开软件时波特率选择框默认显示 9600
// m_Date_Select_M.SetCurSel(0);//打开软件时数据位选择框默认显示 8
// m_StopBit_M.SetCurSel(0);//打开软件时停止位选择框默认显示 1
提 示 3 : 此 句 以 下
才 是 我 们 要 添加 的
语句
提示 4 :此
5 句是我们
下 面 要 用
到 的 暂 时
可 以 不 用
理会

// m_ParityCheck_M.SetCurSel(0);//打开软件时奇偶校验选择框默认显示无校验 N
//下面 if 语句用于打开默认串口
/************************************************************/
if(m_ctrlComm.GetPortOpen())
{
m_ctrlComm.SetPortOpen(FALSE);//关闭串口
}
m_ctrlComm.SetCommPort(1);//打开软件时默认使用 COM1 串口
if(!m_ctrlComm.GetPortOpen())
{
m_ctrlComm.SetPortOpen(TRUE);//打开串口
}
else
{
AfxMessageBox("cannot open serial port");
}
/*************************************************************/
m_ctrlComm.SetSettings("9600,n,8,1");//打开软件时端口设置默认为波特率 9600,无校
验位,8 位数据,1 位停止位
m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据
m_ctrlComm.SetRThreshold(1); //参数 1 表示每当串口接收缓冲区中有多于或等于 1 个
字符时将引发一个接收数据的 OnComm 事件
m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为 0
m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
return TRUE; // return TRUE unless you set the focus to a control
}
F、发送数据,先为发送按钮添加一个单击消息即 BN_CLICKED 处理函数,打开
ClassWizard - >Message Maps , 选 择 IDC_BUTTON_MANUALSEND , 双 击
BN_CLICKED 添加 OnButtonManualsend()函数,并在函数中添加如下代码:
代码段 3:
void CSCommTestDlg::OnButtonManualsend()
{
// TODO: Add your control noti4cation handler code here
UpdateData(TRUE); //读取编辑框内容
m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送数据
}
此时运行程序,在发送编辑框中随意输入数,单击发送按钮,若出错则修改后再测试,
直到成功再进行以下操作。
5、添加两个“组框”或“静态文本”控件,调整位置及大小,在标师处输入提示文字,这
两个控件不用编程,效果如下图:
- 1
- 2
前往页