1.建立项目:
打开 VC++6.0,建立一个基于对话框的 MFC 应用程序 SCommTest;
2.在项目中插入 MSComm 控件
选择 Project 菜单下 Add To Project 子菜单中的 Components and Controls…选
项,在弹出的对话框中双击 Registered ActiveX Controls 项(稍等一会,这个过
程较慢),则所有注册过的 ActiveX 控件出现在列表框中。 选择 Microsoft
Communications Control, version 6.0,,单击 Insert 按钮将它插入到我们的
Project 中来,接受缺省的选项。(如果你在控件列表中看不到 Microsoft
Communications Control, version 6.0,那可能是你在安装 VC6 时没有把 ActiveX
一项选上,重新安装 VC6,选上 ActiveX 就可以了),
这时在 ClassView 视窗中就可以看到 CMSComm 类了,(注意:此类在
ClassWizard 中看不到,重构 clw 文件也一样),并且在控件工具栏 Controls
中出现了电话图标(如图 1 所示),现在要做的是用鼠标将此图标拖到对话框中,
程序运行后,这个图标是看不到的。
3.利用 ClassWizard 定义 CMSComm 类控制对象
打开 ClassWizard->Member Viariables 选项卡,选择 CSCommTestDlg 类,
为 IDC_MSCOMM1 添加控制变量:m_ctrlComm,这时你可以看一看,在对话
框头文件中自动加入了//{{AFX_INCLUDES() #i nclude "mscomm.h"
//}}AFX_INCLUDES 。
4.在对话框中添加控件
向主对话框中添加两个编辑框,一个用于接收显示数据 ID 为
IDC_EDIT_RXDATA,另一个用于输入发送数据,ID 为 IDC_EDIT_TXDATA,
再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其 ID 设
为 IDC_BUTTON_MANUALSEND。别忘记了将接收编辑框的 Properties
->Styles 中把 Miltiline 和 Vertical Scroll 属性选上,发送编辑框若你想输入多行
文字,也可选上 Miltiline。
再打开 ClassWizard->Member Viariables 选项卡,选择 CSCommTestDlg 类,
为 IDC_EDIT_RXDATA 添加 CString 变量 m_strRXData, 为
IDC_EDIT_TXDATA 添加 CString 变量 m_strTXData。说明: m_strRXData
和 m_strTXData 分别用来放入接收和发送的字符数据。
5.添加串口事件消息处理函数 OnComm()
打开 ClassWizard->Message Maps,选择类 CSCommTestDlg,选择
IDC_MSCOMM1,双击消息 OnComm,将弹出的对话框中将函数名改为
OnComm。
这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串
口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在
OnComm()函数加入相应的处理代码就能实现自已想要的功能了。请你在函数中
加入如下代码:
void CSCommTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置 BYTE 数组 An 8-bit integerthat 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
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();//先预读缓冲区以清除残留数据
现在你可以试试程序了,将串口线接好后(不会接?去看看我写的串口接线基本
方法),打开串口调试助手,并将串口设在 com2,选上自动发送,也可以等会
手动发送。再执行你编写的程序,接收框里应该有数据显示了。
7.发送数据
先为发送按钮添加一个单击消息即 BN_CLICKED 处理函数,打开 ClassWizard
->Message Maps,选择类 CSCommTestDlg,选择
IDC_BUTTON_MANUALSEND,双击 BN_CLICKED 添加
OnButtonManualsend()函数,并在函数中添加如下代码:
void CSCommTestDlg::OnButtonManualsend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); //读取编辑框内容
m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送数据
}
运行程序,在发送编辑框中随意输入点什么,单击发送按钮,啊!看看,在另一
端的串口调试助手(或别的调试工具)接收框里出现了什么。
如果你真是初次涉猎串口编程,又一次成功,那该说声谢谢我了,因为我第一次
做串口程序时可费劲了,那时网上的资料也不好找。开开玩笑,谢谢你的支持,
有什么好东西别忘了给我寄一份。
说明:
由于用到 VC 控件,在没有安装 VC 的计算机上运行时要从 VC 中把
mscomm32.ocx、msvcrt.dll、mfc42.dll 拷到 Windows 目录下的 System 子目录
中(win2000 为 System32)并再进行注册设置。