VC2005添加mscomm
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在你要添加控件的对话框上,单击右键,然后点击“插入Acti v eX控件”;
在弹出的对话框中,选择“Microsoft Communications Control,Version 6.0”,然后确定即可
VS2005 VC2005 MSCOMM 控件添加方法
2010年01月08日星期五 17:50
电脑不知什么问题VC6.0装不上了,所以干脆装了个VS2005(只有VC++2005),只是用着不太习惯,最近要编一个串口的小软件,以前用6.0编的,现在用8.0却不知道去哪添加那个ActiveX 控件了,在网上搜了半天,找到了添加方法,发现自己的电脑里就没有那个mscomm.ocx文件,直接下了一个放到C:\Windows\system32下,也不能用,在VS2005内,Tools->ActiveX Control 添加上,说确实license,在msdn上看MSCOMM是在VB下介绍的,了解到是VB的一个组建,于是重新安装VS2005,把VC++2005和VB2005都装上,终于OK。
具体添加方法有很多,
1.直接在要添加的对话框上,右键->Insert ActiveX Control,在里面找Microsoft Communications Control, version 6.0,添加完成。
2.在窗口右边Toolbox空白处,右键->Choose Item,在COM Components中,找到Microsoft Communications Control, version 6.0,前面打对勾,OK。
3.在菜单Tools中选择Choose Item Control,后面和2一样。
近来又要做个串口通信的程序,由于以前没有做过,所以不知道怎么写,网上搜了一圈,全是在VC6.0下写的,于是找葫芦画瓢,好不容易总算成功了,只是我这里用的是VC2005,但是VC2005中是没有MSCOMM的,所以我们需要借助VC6.0的MSCOMM控件;
首先去网上下载MSCOMM32.OCX,MSCOMM32.DEP,MSCOMM.SRG三个文档,然后把它拷贝到c:\windows\sy stem32目录下面;
然后注册控件:在命令行里面敲regsv r32 c:\windows\sy stem32\mscomm32.ocx 回车。
我们还需要到注册表中增加键值,否则你使用mscomm控件的时候会提示没有经过授权的错误。
编辑1.reg文档,内容如下:
REGEDIT
HKEY_CLASSES_ROOT\Licenses = Licensing: Copy ing the keys may be a v iolation of established copy rights.
// The MsComm32 Control License f ollows:
HKEY_CLASSES_ROOT\Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905 = kjljv jjjoquqmjjjv pqqkqmqy ky poqjquoun
保存后,双击1.reg。
这样就可以使用了。
如果实在不行,请手动到注册表HKEY_CLASSES_ROOT\Licenses里添加4250E830-6AC2-11cf-8ADB-00AA00C00905项目,设定其值为kjljv jjjoquqmjjjv pqqkqmqy ky poqjquoun。
下面就可以开始使用MSCOMM控件编写串口处理程序了。
1.首先建立一个工程,无论你是建立单文档、基于对话框、多文档等等。
然后点击工程--->添加类;在添加表单中选择activ eX控件中的MFC类,点击添加;在弹出的表单中选择可用的控件,选择Mcriosof t Commmunications Control,V6.0 确定添加就OK了。
哈哈,现在你的工程里面就有了MSCOMM类了,你可以使用此类。
2.在你的工程的.h文件中#include"mscomm.h",然后添加如下:
在protected下面添加://如果你要使用事件处理函数
DECLARE_EVENTSINK_MAP()
在public下面添加:
CMSComm m_MSComm;//这里只是为了申明一个C MSComm类实例,以便后续和你添加到MSComm1控件关联使用。
3.然后的任务就是使用m_MSComm实例使用串口,你可以新建一个按钮,然后在其双击事件中加入初始化串口的代码如下:
v iew plaincopy to clipboardprint?
m_MSComm.Create(NULL,0,CRect(0,0,0,0),this,IDC_MSCOMM1);
if(m_MSComm.get_PortOpen())//如果串口已经打开,先关闭它
{
m_MSComm.put_PortOpen(FALSE);
}
m_MSComm.put__CommPort(1);//设定使用串口1
m_MSComm.put_InBuff erSize(1024);//设定串口发送数据缓冲区大小
m_MSComm.put_OutBuff erSize(1024);//设定串口接收数据缓冲区大小
m_MSComm.put_InputLen(0);//设置当前接收区数据为0表示全部读取
m_MSComm.put_InputMode(1);//以二进制方式读取数据
m_MSComm.put_RThreshold(1);//当接收缓冲区有1个或以上数据时读取
m_MSComm.put_Settings(_T("9600,n,8,1"));//设定波特率9600无检验位,8个数据位,1个停止位
if (!m_MSComm.get_PortOpen())//如果串口是关闭的,打开串口
{
m_MSComm.put_PortOpen(TRUE);
}
else//如法打开则提示错误
{
AfxMessageBox(_T("Open Serial Port f ailue!"),MB_OK,0);
}
m_MSComm.get_Input();
Sleep(3000);
COleVariant V1(L"OK,YOU CAN SEND DATA TO COMM1!");//这里定义你要发送到字符
m_MSComm.put_Output(V1.Detach());//发送数据
Sleep(3000);
MessageBox(TEXT("ok,the port will close!"),MB_OK,0);
m_MSComm.put_PortOpen(FALSE);//先预读取缓冲区,清空缓冲区数据
好了,到这里你的串口发送数据就实现了,后面的我也还不是很清楚,自己琢磨吧。
哈哈。
前几天需要做一个COM口的通讯程序,主要是要接收一个传感器送来的船舶航行状态参数。
过去没有接触过COM口编程,上网查查VC6下有个Communication Control可用,挺方便的,遂研究研究拿来用,整理一下学习笔记存档,并与网友分享。
首先,我用的是VC2005,但在VC2005下没有这个控件,所以要借用一下VC6。
控件名是MSCOMM32.OC X,如果安装了VC6或VB6的话,就能在/WINDOWS/Sy stem32下找到MSCOMM32.OC X,MSCOMM32.SRG,MSCOMM32.DEP三个文件。
如果在开发的机器上没有安装VC6或VB6,同时也没有安装过使用的这个控件,则首先要对这个控件进行注册。
注册方法是使用命令regsv r32 MSCOMM32.OC X,比如我就直接把找来的这三个文件放到我的Sy stem32下,同时新建一个文本文件,把命令regsv r32
MSCOMM32.OC X写到文本文件中,改扩展名为bat,直接双击这个bat就完成空间注册。
另外,为了在VC2005中开发的时候能正常使用这个控件,还需要修改一下注册表,否则会出错。
修改方法是将以下内容写到一个文本文件中,扩展名改为reg,然后双击这个文件导入就可以了。
(此处注册表修改的内容也可以在MSCOMM32.SRG中找到)
REGEDIT
HKEY_CLASSES_ROOT\Licenses = Licensing: Copy ing the keys may be a v iolation of established copy rights.
// Comm Control 6.0 license key
HKEY_CLASSES_ROOT\Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905 = kjljv jjjoquqmjjjv pqqkqmqy ky poqjquoun 完成以上的控件注册和注册表的修改后就可以开始程序的开发了。
首先新建一个MFC对话框程序。
然后在IDE的右侧打开“工具箱”,鼠标右击,在弹出菜单中点击“选择项”,在COM组件下找到Microsof t Communications Control,在其前面的选择框中打勾,一个黄色电话图标就会出现在工具箱里,用鼠标把这个图标拖进对话框资源编辑器里,控件就被添加到项目的程序中。
为了便于使用,我们可以给这个控件绑定一个控件变量,比如叫做m_mscomm,程序会自动添加一个C Mscomm类封装这个控件,而m_mscomm就是这个类的一个对象。
接下来就可以以此控件变量来使用控件了。
在正式开始收发数据前,要给控件设置适当的几个参数来初始化。
首先是指定端口号,使用方法m_mscomm.put_CommPort(1);,参数就是端口号,比如此处程序要使用COM1端口。
然后是波特率、奇偶校验、数据位和停止位,使用方法put_Settings(LPCTSTR newValue),参数是一个形如”*,*,*,*”字符串,比如我需要波特率4800,无奇偶校验,8位数据位和1作为停止位就可以如此操作,m_mscomm.put_Settings(_T(“4800, n, 8, 1”))。
m_mscomm.put_RThreshold(1)和m_mscomm.put_SThreshold(0)分别设定接收和发送数据的时候,引发接收数据的OnComm 事件时缓冲区中的字符数量,0表示不触发OnComm 事件,比如put_RThreshold(1)表示每接收到一个字符就处罚OnComm 事件。
m_mscomm.put_InputLen(100)设定当前接收区数据长度为0,表示全部读取。
m_mscomm.put_InputMode(0)用来设定数据接收模式,1表示二进制,0表示文本。
m_mscomm.put_OutBufferSize(1024)和m_mscomm.put_InBuff erSize(1024)分别设定输出和接收的缓冲区大小,单位是字节。
比如,现在要接收数据的话,可以如下初始化程序。
1 2 3 4 5 6 7 m_mscomm.put_CommPort(1);
m_mscomm.put_Settings(_T(“4800, n, 8, 1”));
m_mscomm.put_RThreshold(1);
m_mscomm.put_SThreshold(0);
m_mscomm.put_InputLen(100);
m_mscomm.put_InputMode(0);
m_mscomm.put_InBufferSize(1024);
初始化完成后就可以用m_mscomm.put_PortOpen(TRUE)来打开端口开始接收数据了。
根据我们在RThreshold 中设定的参数,程序会在接收到参数中指定的字符后触发一个OnComm 事件,我们就需要处理这个事件来提取接收到的数据。
我们需要通过查询m_mscomm.get_CommEv ent()来确定具体的事件类型,比如可能是发送也可能接收到了数据,比如在此我们要提取接收数据,事件对应的返回值应当是2。
然后获得的数据就可以用m_mscomm.get_Input()来获得,这个函数返回一个VARIANT 结构变量,如果我们接收的是字符串数据,那就是保存在bstrVal 中,比如下面的代码就是在接收到数据时将接收到的字符串保存在str 变量中。
1 2 3 4 5 6 7 8 9 10 11 12 13 void CMScomDlg::OnCommMscomm()
{
// TODO: 在此处添加消息处理程序代码
CString str;
switch(m_mscomm.get_CommEvent())
{
case 2:
str=CString(m_mscomm.get_Input().bstrVal);
break;
default:
break;
}
}
如果要发送数据的话,只需调用m_mscomm.put_Output(VARIANT newValue)将保存在newValue 中的数据发送出去。
在此我们可以使用一个COleVariant 类对象来代替直接使用VARIANT 类型变量,COleVariant 直接提供了将字符串变量转化为兼容VARIAN T 类型的构造函数,比如我们将数据保存在CString 类型的str 变量中,然后用COleVariant 包一下送给put_Output ,如
m_mscomm.put_Output(COleVariant(str))就可以将str 中的字符通过串口发送出去。