2024年3月14日发(作者:)

我在VS2010里试过了,也可以实现。

这篇我是转的网友的,我试了一下,出了一点问题,对原文做了些添加说明,文章如下:

前几天需要做一个COM口的通讯程序,主要是要接收一个传感器送来的船舶航行状态参数。过去没有接触过

COM口编程,上网查查VC6下有个Communication Control可用,挺方便的,遂研究研究拿来用,整理一下学习笔记

存档,并与网友分享。

首先,我用的是VC2005,但在VC2005下没有这个控件,所以要借用一下VC6。控件名是,

如果安装了VC6或VB6的话,就能在/WINDOWS/System32下找到,,

三个文件。如果在开发的机器上没有安装VC6或VB6,同时也没有安装过使用的这个控件,则首先

要对这个控件进行注册。注册方法是使用命令regsvr32 ,比如我就直接把找来的这三个文件放到我

的System32下,同时新建一个文本文件,把命令regsvr32 写到文本文件中,改扩展名为bat,直

接双击这个bat就完成空间注册。另外,为了在VC2005中开发的时候能正常使用这个控件,还需要修改一下注册表,

否则会出错。修改方法是将以下内容写到一个文本文件中,扩展名改为reg,然后双击这个文件导入就可以了。(此处

注册表修改的内容也可以在中找到)

REGEDIT

HKEY_CLASSES_ROOT/Licenses = Licensing: Copying the keys may be a violation of established copyrights.

// Comm Control 6.0 license key

HKEY_CLASSES_ROOT/Licenses/4250E830-6AC2-11cf-8ADB-00AA00C00905 =

kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun

完成以上的控件注册和注册表的修改后就可以开始程序的开发了。

另外有个简单的方法就是:

1.下载控件:下载地址:

/detail/tianhen791/4023983

2.下载完成后解压-》点击 即可此控件的安装和注册。

如果注册后,在COM组件中仍然无法找到Microsoft Communications Control,不妨重启一下电脑试试。

另外,有些人可能无法成功注册,提示:无法成功调用DllRegisterServer 错误代码: 0x8002801c

可通过以下步骤实现成功注册:

1、新建一个文本文档输入:NET LOCALGROUP 用户名 administrators /add

2、另存为.bat文件

3、再打开组策略(运行:)windows设置,脚本启动脚本找到刚才新建的bat文件

4、重新启动您的爱机一工切OK!

首先新建一个MFC对话框程序。然后在IDE的右侧打开“工具箱”,鼠标右击,在弹出菜单中点击“选择项”,在

COM组件下找到Microsoft Communications Control,在其前面的选择框中打勾,一个黄色电话图标就会出现在工具箱

里,用鼠标把这个图标拖进对话框资源编辑器里,控件就被添加到项目的程序中。

另外也可以菜单里“工具(T)”下拉菜单里,选择“选择工具箱”,英文是choose Toolbox Items ,同样可以打开COM

组件选项。

为了便于使用,我们可以给这个控件绑定一个控件变量,比如叫做m_mscomm,程序会自动添加一个CMscomm

类封装这个控件,而m_mscomm就是这个类的一个对象。接下来就可以以此控件变量来使用控件了。

在正式开始收发数据前,要给控件设置适当的几个参数来初始化。

首先是指定端口号,使用方法m__CommPort(1);,参数就是端口号,比如此处程序要使用COM1

端口。

然后是波特率、奇偶校验、数据位和停止位,使用方法put_Settings(LPCTSTR newValue),参数是一个形如”*,*,*,*”

字符串,比如我需要波特率4800,无奇偶校验,8位数据位和1作为停止位就可以如此操作,

m__Settings(_T(“4800, n, 8, 1”))。

m__RThreshold(1)和m__SThreshold(0)分别设定接收和发送数据的时候,引发接收数

据的OnComm事件时缓冲区中的字符数量,0表示不触发OnComm事件,比如put_RThreshold(1)表示每接收到一个

字符就处理OnComm事件。

m__InputLen(0)设定当前接收区数据长度为0,表示全部读取。

m__InputMode(1)用来设定数据接收模式,1表示二进制,0表示文本。

m__OutBufferSize(1024)和m__InBufferSize(1024)分别设定输出和接收的缓冲区大

小,单位是字节。

比如,现在要接收数据的话,可以如下初始化程序。

// 函数 BOOL CMSCommDemoDlg::OnInitDialog() 初始化过程

m__CommPort(4); //设定串口为 COM4

m__Settings(_T("9600,n,8,1")); //设定波特率9600,无奇偶校验,8位数据位,1作为停止位

m__InputMode(1); //设定数据接收模式,1为二进制,0为文本

m__InputLen(0); //设定当前接收区数据长度

m__InBufferSize(1024); //设置输入缓冲区大小为1024 byte

m__OutBufferSize(1024); //设置输出缓冲区大小为1024 byte

m__RThreshold(1); //每接收到一个字符时,触发OnComm事件

m__SThreshold(0); //每发送一个字符时,不触发OnComm事件

m__PortOpen(true); //打开串口

初始化完成后就可以用m__PortOpen(TRUE)来打开端口开始接收数据了。

根据我们在RThreshold中设定的参数,程序会在接收到参数中指定的字符后触发一个OnComm事件,我们就

需要处理这个事件来提取接收到的数据。我们需要通过查询m__CommEvent()来确定具体的事件类型,比

如可能是发送也可能接收到了数据,比如在此我们要提取接收数据,事件对应的返回值应当是2。然后获得的数据就可

以用m__Input()来获得,这个函数返回一个VARIANT结构变量,如果我们接收的是字符串数据,那就是

保存在bstrVal中,比如下面的代码就是在接收到数据时将接收到的字符串保存在str变量中。

OnComm消息处理部分:

void CMSCommDemoDlg::OnCommMscomm()

{

// TODO: 在此处添加消息处理程序代码

VARIANT m_input ;

char * str ,*str1 ;

int k , nEvent , i ;

CString str2 ;

nEvent = m__CommEvent() ;

switch( nEvent )

{

case 2:

k = m__InBufferCount() ;

if( k > 0 )

{

str = (char*)(unsigned char*)m__Input().parray->pvData ;

}

i = 0;

str1 = str ;

while( i

{

i++ ;

str1++ ;

}

*str1 = '0' ;

str2 = (const char *) str ;

m_strReceive = str2 ; //m_strReceive 是关联接收编辑框的CString变量

break ;

default:

break ;

}

UpdateData(false);

}

如果要发送数据的话,只需调用m__Output(VARIANT newValue)将保存在newValue中的数据发

送出去。在此我们可以使用一个COleVariant类对象来代替直接使用VARIANT类型变量,COleVariant直接提供了将

字符串变量转化为兼容VARIANT类型的构造函数,比如我们将数据保存在CString类型的str变量中,然后用

COleVariant 包一下送给put_Output ,如m__Output(COleVariant(str))就可以将str中的字符通过串口发

送出去。

发送数据部分:

bool CMSCommDemoDlg::ComSendData(void)

{

int i , Count ;

Count = m_gth(); //m_strSend 是关联发送编辑框的CString变量

CByteArray m_Array ;

m_All();

m_e(Count);

for( i=0 ; i

m_(i,m_strSend[i] );

m__Output( COleVariant(m_Array) );

return false;

}