mscomm控件的使用和安装
C#串口通信:MSComm控件使用详解
C#串口通信:MSComm控件使用详解目次MSComm 控件两种处理通讯的方式CommPort 属性RThreshold 属性CTSHolding 属性SThreshold 属性CDHolding 属性DSRHolding 属性Settings 属性InputLen 属性EOFEnable 属性Handshake 常数OnComm 常数InputMode 常数错误消息MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi 等语言中均可使用。
Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
1.MSComm控件两种处理通讯的方式MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。
1.1 事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者Carrier Detect (CD) 或Request To Send (RTS) 线上一个字符到达或一个变化发生时。
在这些情况下,可以利用MSComm 控件的OnComm 事件捕获并处理这些通讯事件。
OnComm 事件还可以检查和处理通讯错误。
所有通讯事件和通讯错误的列表,参阅CommEvent 属性。
在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。
每个MSComm 控件对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个MSComm 控件。
MSComm控件的用法和函数说明
MSComm控件进行串口编程步骤:1. 在建立的程序工程中插入MSComm控件。
2. 添加MSComm控件ID 的控制变量(或者对象)。
3. 对串口进行初始化,设置MSComm控件的属性。
4. 添加串口事件的消息处理函数OnComm()函数,在函数中根据应用需要,编写数据处理代码5. 编写串口发送等其他代码。
6. 关闭串口。
+MSComm控件常用属性:mPort:设置并返回通信端口号2.Settings:以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位3.PortOpen:设置并返回通信端口的状态。
也可以打开和关闭端口4.Input:从接收缓冲区返回和删除字符5.Output:向传输缓冲区写一个字符6.InputLen:设置并返回Input属性从接收缓冲区读取的字符数。
7.InBufferSize:设置或返回输入缓冲区的大小。
8.OutBufferSize:设置或返回输入缓冲区的大小。
9.InBufferCount:设置或返回输入缓冲区内等待读取的字节个数。
10.OutBufferCount:设置或返回输入缓冲区内等待读取的字节个数。
对MSComm控件通过Get/Set函数对来获取或设置控件的属性,每个属性均有与之对应的Get/Set函数对。
用法说明mPort:设置并返回通信端口号Void CMSComm::SetCommPort(short n); 设置串口号Short CMSComm::GetCommPort(); 查询当前串口号说明:n可以设置成1到16中的任何数(缺省值为1)。
但是,如果用PortOpen属性打开一个并不存在的端口是,MSComm控件会产生错误68(设备无效);必须在打开端口之前设置CommPort属性。
2.Settings:以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位Void CMSComm::SetSettings(LPCTSTR lpszNewValue);CString CMSComm::GetSettings();说明:当端口打开时,如果设置值lpszNewValue非法,则MSComm控件产生错误380(非法属性值)。
MSComm控件的应用(串口编程)
MSComm控件的应用(串口编程)MSComm控件通过串行端口发送和接收数据,为应用程序提供了串行通讯功能。
在基于对话框的应用程序中加入一个MSComm控件非常简单。
只需打开“Project->AddToProject->Components and Controls->Registered Activex Controls”,然后选择控件:Microsoft Communication Control,version 6.0插入到当前的工程中。
CMS m类的相关文件 mscomm.cpp 和 mscomm.h 就加到工程中了。
从工具箱中把MSComm控件拖到对话框上,给控件关联成员变量m_Comm。
1.初始化串口,一般在OnInitDialog()函数中m_Comm.SetCommPort(1); //选择COM1m_Comm.SetInputMode(1); //设置数据通讯格式为二进制数组格式0.为文本格式//1.为二进制数组格式m_Comm.SetSettings("9600,n,8,1");//设置波特率为9600bps,无奇偶校验位,数据位8//位,停止位1位m_Comm.SetRThreshold(1); //设置为每次接到一个字节数据就触发OnComm事件m_Comm.SetInputLen(0);//设置当前接收区数据长度为0,表示全部读取波特率:110、300、600、1200、2400、4800、9600、14400、19200、28800、38400、115200 奇偶校验:E偶校验、M标号校验、N无校验、O奇校验、S空格校验数据位:4、5、6、7、8停止位:1、1.5、22.打开串口if(!m_Comm.GetPortOpen()) //如果串口是关闭的,则行打开串口{m_Comm.SetPortOpen(true);m_Comm.GetInput(); //清除串口输入缓冲区中残留数据}else{AfxMessageBox("串口打开失败!");}3.关闭串口if(m_Comm.GetPortOpen()){m_Comm.SetPortOpen(false);}4.接受数据,OnComm()函数中,数据保存在RcvData中VARIANT m_input;char *str;int len,nEvent;CString RcvData;nEvent = m_Comm.GetCommEvent();switch(nEvent){case 2:len=m_Comm.GetInBufferCount(); //接收缓冲区的字符数目if(len>0){m_input=m_Comm.GetInput();str=(char*)(unsigned char*)m_input.parray->pvData;}*(str+len) = '\0’;RcvData.Format("%s", str);}5.发送数据,把str数据发送出去int i,Count;Count=str.GetLength();CByteArray m_Array;m_Array.RemoveAll();m_Array.SetSize(Count);for(i=0;i<Count;i++){m_Array.SetAt(i,str[i]);}m_Comm.SetOutput(COleVariant(m_Array));。
串口通信-MSComm控件使用详解
串口通信-MSComm控件使用详解2012-11-13 09:35 6988人阅读评论(0) 收藏举报控件编程 Delphi编程(13)MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。
Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
1.MSComm控件两种处理通讯的方式1.1 事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。
在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。
OnComm 事件还可以检查和处理通讯错误。
所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。
在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。
每个MSComm 控件对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。
1.2 查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
mscomm控件使用方法
mscomm控件使用方法献花(0)4).InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024字节。
5).InBufferCount:返回接收缓冲区内等待读取的字节数,可通过设置该属性为0来清空接收缓冲区。
8).InputLen:设置或返回接收缓冲区内用Input读入的字节数,设置该属性为0表示Input读取整个缓冲区的内容。
9).Input:从接收缓冲区读取一串字符。
10).OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。
11).OutBufferCount:返回发送缓冲区内等待发送的字节数,可通过设置该属性为0来清空缓冲区。
12).OutPut:向发送缓冲区传送一串字符。
该项目上位机采用Delphi编写,数据采集仪采用研华ADAM5510作为下位机采集实时压力数据,采用AcII方式传送数据,数据传输速率为9600bp,1位开始位,8位数据位,1位停止位,无奇偶校验位。
数据通信的具体格式为:。
程序用到的全局变量为:ReceiveStr:String;//接受Acii码字符数据字符串Setting:=9600,n,8,1;//设置通信口参数InputLen:=1;//设置Input一次从接受缓冲区读取字节数为1InBufferCount:=0;//清除接受缓冲区OutBufferCount:=0;//清除发送缓冲区InBufferSize:=50;//设置接受缓冲区为50字节OutBufferSize:=2;//设置发送缓冲区为2字节ShowMeage(串口已经打开!);end;2).数据接收与处理buffer:Olevariant;Temp:tring;cNow:Char;tmp某:Double;beginif((cLat=Chr(13))and(cNow=Chr(10)))thenbeginF1:=Trim(F1);dF1:=StrToFloat(F1);withSerieDepthdo//利用TChart绘制深度曲线begintmp某:=某Value[1]-某Value[0];Delete(0);Add某Y(某t+tmp某,dF1,,clGed);end;F1:=;end;if((cLat<>Chr(13))and(cNow<>Chr(10)))thenbeginF1:=F1+cNow;end;cLat:=cNow;end;end;3).串口关闭下面这些代码是针对发送和接收为16进制处理的。
C++ builder 中如何使用Mscomm控件
要将Mscomm加入C++ builder,分成两种情况:第一种:机子上,装有VC,VB的。
我们就可以直接打开C++ builder 选择component->import activeX control ->选择“Microsoft comm control 6.0[version1.1]”->安装。
然后,我们就可以在控件栏的activeX下找到代表comm的控件了。
第二种情况:机子上没有装VC,VB的。
我们先到其他装有vc或者vb的机子上的目录C:/WINDOWS/system32 下找到Mscomm32.ocx 1个文件。
将他们拷到我们的C:/WINDOWS/system32 下。
然后点击“开始”->cmd->regsvr32 C:/WINDOWS/system32/Mscomm32.ocx->回车。
显示注册成功。
然后就可以按照第一种情况,在C++ builder中加入控件了。
在这注册成功以后,因为你的机子上并没有装有vc或者vb,所以你还需要自己手动添加注册表来给这个控件授权,把下面这段代码写成1.REG文件,然后运行1.reg,注册就可以了:REGEDIT4[HKEY_CLASSES_ROOT\Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905]@= "kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun"注意最后的kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun字串中,最后没有空格。
以下是参考的一个资料,可以看看,对理解为什么要这么做的原因有帮助。
如何手工注册MSComm控件龚建伟大家知道,当我们安装VC++6.0/VB6.0时,如果选择了ACtiveX控件项(自定义安装),MSComm控件就会自动安装在计算机上了,并在系统文件夹下多了3个文件:Mscomm.srg, Mscomm32.ocx,Mscomm32.dep注意,操作系统不同,则系统文件夹不同:Win98: windows/systemWin2000: winnt/system32那么用了MSComm控件的程序在发布时或者在DELPHI开发环境下如何来注册MSComm控件呢?发布程序时可以用安装程序,我们这里不介绍,只谈谈如何手工来注册安装MSComm控件。
msm控件的用法和函数说明
MSComm控件进行串口编程步骤:1.在建立的程序工程中插入MSComm控件。
2.添加MSComm控件ID 的控制变量(或者对象)。
3.对串口进行初始化,设置MSComm控件的属性。
4.添加串口事件的消息处理函数OnComm()函数,在函数中根据应用需要,编写数据处理代码5.编写串口发送等其他代码。
6.关闭串口。
+MSComm控件常用属性:mPort:设置并返回通信端口号2.Settings:以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位3.PortOpen:设置并返回通信端口的状态。
也可以打开和关闭端口4.Input:从接收缓冲区返回和删除字符5.Output:向传输缓冲区写一个字符6.InputLen:设置并返回Input属性从接收缓冲区读取的字符数。
7.InBufferSize:设置或返回输入缓冲区的大小。
8.OutBufferSize:设置或返回输入缓冲区的大小。
9.InBufferCount:设置或返回输入缓冲区内等待读取的字节个数。
10.OutBufferCount:设置或返回输入缓冲区内等待读取的字节个数。
对MSComm控件通过Get/Set函数对来获取或设置控件的属性,每个属性均有与之对应的Get/Set函数对。
用法说明mPort:设置并返回通信端口号Void CMSComm::SetCommPort(short n);设置串口号Short CMSComm::GetCommPort();查询当前串口号说明:n可以设置成1到16中的任何数(缺省值为1)。
但是,如果用PortOpen属性打开一个并不存在的端口是,MSComm控件会产生错误68(设备无效);必须在打开端口之前设置CommPort属性。
2.Settings:以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位Void CMSComm::SetSettings(LPCTSTR lpszNewValue);CString CMSComm::GetSettings();说明:当端口打开时,如果设置值lpszNewValue非法,则MSComm控件产生错误380(非法属性值)。
Mscomm控件属性、方法及事件
Mscomm控件1、引用Mscomm控件Mscomm控件不是普通的工具箱控件,在VB中首先要引用Mscomm控件,而后才能使用用它。
引用Mscomm控件很简单:选择“工程”主菜单,在“工程”菜单上选择“部件”命令,弹出如图所示的部件对话框,在控件属性页上选定“Microsoft Comm Control 6.0”控件,单击“确定”按钮后,Mscomm就添加到控件面板上。
2、Mscomm控件信息处理Mscomm控件拥有功能完善的串口数据的发送和接收功能,Mscomm控件提供了两种处理方式。
●事件驱动方式:由Mscomm控件的OnComm事件自动捕获并处理通信错误及事件;●查询方式:通过定时查询Mscomm控件CommEvent属性的值来判断事件和错误。
在PC机串行端口通信时,使用了十几条线进行信号传输。
利用Mscomm控件开发串口通信软件,需了解以下5条线的代号及作用,这5条线的高低电平状态分别对应Mscomm 控件的相应属性的True/False值:●DRT线:用于传输PC机发往串口Modem等设备的信号,该信号表示PC机是否已准备好;●RTS线:用于传输PC机发往串口Modem等设备的信号,该信号表示PC机是否允许Modem发数据;●DSR线:用于传输串口Modem等设备发往PC机的信号,该信号表示串口Modem 等设备是否已做好操作准备;●CTS线:用于传输串口Modem等设备发往PC机的信号,该信号表示Modem是否允许发送数据;●CD线:用于传输串口Modem等设备发往PC机的信号,该信号表示Modem已经和远方的设备建立了连接。
Mscomm控件的通信功能实现,实际上是调用了API函数,而API函数是由Comm.drv 解释并传给设备驱动程序执行的,对于VB程序开发者只需要知道MSComm控件的属性和事件的用法即可以实现对串口的操作。
3、Mscomm控件的属性(1)CommPort属性该属性用于设置或返回连接的串口编号,Windows将会利用该串口和外界通信。
MSComm控件使用VisualStudio2010
(2)“关闭串口”按钮,添加方法为从右侧“工具箱”拖放一个“Button”到对话框,并在右侧“属性”卡中修改“Caption”为“关闭串口”,修改“ID”为“IDC_BUTTON_CLOSE”。
}
m_mscomm.put_CommPort(1); //选择COM1
m_mscomm.put_InBufferSize(1024); //接收缓冲区
m_mscomm.put_OutBufferSize(1024);//发送缓冲区
m_mscomm.put_InputLen(0);//设置当前接收区数据长度为0,表示全部读取
}
void CCommTestDlg::OnBnClickedButtonSixteen()
{
// TODO:在此添加控件通知处理程序代码
}
消息映射已经自动关联。
8.
1在控件(电话图标)上“右键”——>添加事件处理程序
2点击“添加编辑”
在CommTestDlg.cpp文件中会增加函数:
BEGIN_EVENTSINK_MAP(CCommTestDlg, CDialogEx)
{
// TODO:在此添加控件通知处理程序代码
UpdateData(true); //读取编辑框内容
m_mscomm.put_Output(COleVariant(m_EditSend));//发送数据
m_EditSend.Empty(); //发送后清空输入框
UpdateData(false); //更新编辑框内容
SMCOMM控件使用
串口通信控件简介MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。
Microsoft Communications Control(以下简称MSComm)是Microsoft 公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
由于MSComm控件不是标准控件,要使用它就必须将MSComm控件添加到控件工具箱中添加控件的方法:选择“工程”|“部件”命令,在出现的“部件”对话框中选择“Microsoft Comm Controls 6.0”选择并单击“确定”按钮。
这时候MSComm控件就被添加到VB的控件工具箱中了。
如右图:(在图中那个电话标识)串口的初始化:1With MSComm1 初始化串口mPort = 13.Settings = "19200,N,8,1"4.OutBufferSize = 10245.InBufferSize = 10246.PortOpen = True7End With在上述初始化中完成了:设置通信端口,串口通信参数(波特率、奇偶校验、数据位、停止位),接收缓冲区的字节数,传输缓冲区的字节数,设置端口的状态为打开。
上述初始化放在窗体加载中完成。
数据的传输:在这里,我们先添加2个按钮控件,1个文本控件,1个标签控件。
点击“生成串号”按钮,读取到当前日期,显示在文本控件中。
1Private Sub Command1_Click()2Dim time_now1 As Date3time_now1 = Now4Text1.Text = Format(time_now1, "yyyymmdd")5used_data = False6End Subused_data为一个全局变量,目的是避免一次的数据发送好几次。
VB中MSComm控件的使用
outbte(0) = Val(Text1(count))
MSComm.OutBufferCount = 0 MSComm.Output = outbte
'清空输出寄存器 '发送数据
Next count
End Sub
Private Sub Command2_Click() Text2(0).Text = "" Text2(1).Text = "" Text2(2).Text = "" Text2(3).Text = "" Text2(4).Text = ""
一、VB:
1.1 界面设计:
MSComm 使用案例
1.2 MSComm 控件设置:
1.3 代码: Private Sub Command1_Click()
'发送
Dim outbte(0) As Byte Dim count As Integer
If MSComm.PortOpen = False Then MSComm.PortOpen = True For count = 0 To 4
PCON |= 0x80;
//SMOD=1:波特率倍增
TH1 = 0xf3;
//波特率设定为 4800bps
TL1 = 0xf3;
TR1 = 1; ES = 1;
//开启串行口中断
EA = 1;
while(1);
}
void uart(void) interrupt 4
{
unsigned char i;
unsigned char receive[5]={0,0,0,0,0};
ES = 0;
毕业设计-VB中MSCOMM串行通信控件的使用方法
VB是Visual Basic的简称,是由美国微软公司于1991年开发的一种可视化的、面向对象和采用事件驱动方式级程序设计语言,可用于开发Windows 环境下的各类应用程序。
它简单易学、效率高,且功能强大可以与Windows 专业开发工具SDK相媲美。
在Visual Basic环境下,利用事件驱动的编程机制、新颖易用的可视化设计工具,使用Windows内部的广泛应用程序接口(API)函数,动态链接库(DLL)、对象的链接与嵌入(OLE)、开放式数据连接(ODBC)等技术,可以高效、快速地开发环境下功能强大、图形界面丰富的应用软件系统。
他的简单易学可以使我们快速实现自己想在Windows下的软件功能。
小则可以做计算器、上位机等符合自己需要的小软件;大则可以连接数据库做些管理系统,比如某公司的人事管理系统。
这里要说的是MSCOMM控件在VB中的使用方法。
MSComm 作为一个串行通讯控件为程序员串口通讯编程节省了很多时间。
在应用中加入一个MSComm控件非常简单。
在VB的常用控件里是没有MSCOMM控件的,我们可以通过工程部件勾取Microsoft comm control 6.0 来添加MSCOMM控件。
下面,让我们来了解其使用方法:1.串口通信基础知识一般悦来,计算机都有一个或多个串行端口,它们依次为com1、Com2、…,这些串口还提供了外部设备与PC进行数据传输和通信的通道。
这些串口在CPU和外设之间充当解释器的角色。
当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特流数据;当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序(COMM.DRV)调用API函数发送和接收数据,当用通信控件或声明调用API函数时,它门由COMM. DRV解释并传递给设备驱动程序,作为一个VB程序员,要编写通信程序.只需知道通信控件提供给Windows通信AP1函数的接口即可.换句话说,只需设定和监视通信控件的属性和事件即可。
mscomm控件操作步骤
使用Mscomm串口控件之前应确保它已经在本机上安装且注册,VC串口通信技术网有文章介绍mscomm串口控件的注册方法,本站出售的资料“VC 串口通信资料集”也专门收到了此控件,不过在安装了VC后都会自动安装此控件,但是发布您的串口应用程序时就得考虑如何在目标计算上机上注册了,参考本站文章:串口控件MSCOMM的注册方法(使用MSCOMM串口控件程序的发布问题)。
Mscomm不仅是一个VC 串口控件,由于它是基于Activex的,所以也可以在VB、Deliph、C++ Builder等其它可以使用Activex控件的开发工具中使用,最重要的一点是它是微软官方的控件,所以有很多人在使用它。
下面介绍如何在VC6工程中使用mscomm串口控件。
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所示),现在要做的是用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的。
BCB下MSComm32控件的安装
BCB下MSComm32控件的安装Win7 32位环境下,在C++ builder中MSComm32的安装主要分为两大步骤:控件注册和控件安装一、控件注册1)将mscomm32.ocx文件拷到C:\Windows\System32文件夹下;2、找到“开始”-“所有程序”-“附件”-“命令提示符”,然后右键“以管理员身份运行”,写入代码:regsvr32 C:\Windows\system32\MSComm32.ocx回车,提示点“确定”,注册完成二、控件安装1、打开C++builder,在菜单中选择“Component”—“Import ActiveX Control”2、在弹出的窗口中的“Import ActiveX”中选择“Microsoft Comm Control 6.0[SP6][Version1.1]”,其余选项保持不变,点左下角的“Install”3、安装成功的MSComm32控件在ActiveX面板下----------------------------------------------------------------------------------------------------------------- Win7 64位环境下,在C++ builder中MSComm32的安装也主要分为两大步骤:控件注册和控件添加。
除了控件注册不一样外,控件安装和32位系统下的步骤是一致的,故参照上述即可控件注册1 将mscomm32.ocx文件拷到C:\Windows\ SysWOW64文件夹下;2 找到“开始”-“所有程序”-“附件”-“命令提示符”,然后右键“以管理员身份运行”,写入代码:regsvr32 C:\Windows\ SysWOW64\MSComm32.ocx3 回车,提示注册成功,点“确定”,注册完成4 添加证书信息新建一个文本文档,在其中写下如下代码:REGEDIT4[HKEY_CLASSES_ROOT\Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905]@="kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun"将其保存为“MSComm32证书注册.reg”,注意一定要保存为后缀是reg的注册表文件。
VB中mscomm控件的添加方法
1.注册MSComm32控件,网上下载这个控件,然后把它拷贝到到C:\Windows\system32文件夹下,我装的是64位的Win7系统,是在C:\Windows\sysWOW64文件夹下,然后打开cmd,写入代码regsvr32 C:\Windows\system32\MSComm32.ocx然后按enter会提示你注册成功2.在对话框中添加控件:打开工具箱->右键选择选择项,等待一会会出现选择工具箱项,在COM组件下找到Microsoft communications control中的MSComm32.ocx项,勾选后添加,成功后在工具箱中就多了这么一个空间图标,可以拖进对话框中使用。
3.功能是实现串口发送出"Hello World!",串口实现自动接受串口数据。
VC++编程,新建个对话框工程,然后添加"打开串口","关闭串口","发送数据","清空数据"等按钮,接受数据可以自动实现就不用添加了,加入一个编辑框用来显示接收到的串口数据。
下面具体实现这几个功能编程:a.头文件添加#include "mscomm1.h",在对话框中拖入这个控件,右键添加事件处理,在里面编程如下:void CtestDlg::OnCommMscomm1() //CtestDlg是我对话框项目实现文件中定义的类{VARIANT input1;BYTE rxdata[2048];long len1,k;COleSafeArray safearray1;int iLineNum=m_Edit1.GetLineCount();CString strDis,strTemp;// short e=m_Com.get_CommEvent();if(iLineNum < 24){switch (m_Com.get_CommEvent()) //响应事件{case 2: //当达到阈值字符时候处理input1 = m_Com.get_Input();safearray1 = input1;len1 = safearray1.GetOneDimSize(); //返回一维参数的长度for(k = 0;k < len1;k ++)safearray1.GetElement(&k,rxdata + k);//第一个参数是开始的数组指针,第二个是存放的数组指针for(k = 0;k < len1;k ++){strTemp.Format("%02X-",rxdata[k]); //十六进制显示strDis += strTemp;m_Edit1.ReplaceSel(strDis);strDis = "";UpdateData(false);}else{m_Edit1.SetSel(0, -1);m_Edit1.Clear();}}b.打开串口按钮处理事件:void CtestDlg::OnBnClickedOpencom(){// TODO: 在此添加控件通知处理程序代码DWORD style = WS_VISIBLE | WS_CHILD; m_Com.put_CommPort(1);m_Com.put_Settings("9600,O,8,1");m_Com.put_InBufferSize(1024);m_Com.put_InBufferCount(0);m_Com.put_InputMode(1);m_Com.put_InputLen(0);m_Com.put_RThreshold(1);m_Com.put_PortOpen(1);AfxMessageBox("串口打开成功!");m_Opencom.EnableWindow(FALSE);m_Closecom.EnableWindow(TRUE);m_Edit1.EnableWindow(TRUE);}c.关闭串口按钮处理事件:void CtestDlg::OnBnClickedClosecom(){// TODO: 在此添加控件通知处理程序代码m_Com.put_PortOpen(0);AfxMessageBox("关闭串口成功!");m_Opencom.EnableWindow(TRUE);m_Closecom.EnableWindow(FALSE);m_Edit1.EnableWindow(TRUE);}d.发送数据按钮事件处理:void CtestDlg::OnBnClickedSenddata(){// TODO: 在此添加控件通知处理程序代码CString aa;aa = "Hello Word!!";m_Com.put_Output(COleVariant(aa));}e.清空数据按钮事件处理:void CtestDlg::OnBnClickedClear(){// TODO: 在此添加控件通知处理程序代码 m_Edit1.SetSel(0, -1);m_Edit1.Clear();UpdateData(false);}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、引言目前,在用计算机进行数据传输时,常用的是串行通信方式。
用C++Builder来编写串行通信程序时,可以调用Windows API函数,也可以利用VB中的MSComm控件。
利用API函数编写实际应用程序时,往往要考虑多线程的问题,这样编出来的程序不但十分庞大,而且结构比较复杂,继承性差,维护困难。
但是使用串行通信控件就相对简单一些,而且功能强大,性能安全可靠。
本文就简单的介绍一下在C++ Builder中利用MSComm 控件进行编程。
二、MSComm控件的常用属性和事件MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
事件驱动方式在使用事件驱动法设计程序时,每当有新字符到达,或端口状态改变,或发生错误时,MSComm控件将解发OnComm事件,而应用程序在捕获该事件后,通过检查MSComm控件的CommEvent属性可以获知所发生的事件或错误,从而采取相应的操作。
这种方法的优点是程序响应及时,可靠性高。
查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查CommEvent 属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
1.MSComm 控件的常用属性CommPort属性:设置或返回通讯端口号,可以设置为1到16之间的任何值,本系统采用缺省值2;Settings属性:以字符串形式设置或返回波特率、奇偶校验、数据位和停止位,本系统采用缺省值"9600,n,8,1";PortOpen属性:设置或返回通讯口的状态以及打开和关闭端口,可通过把该属性设置为true或者false来打开或者关闭端口;InBufferSize和OutBufferSize属性:分别设置接收和发送缓冲区分配的内存数量,单位为字节,缺省值分别为1024byte和512byte;InputLen属性:确定希望从接收缓冲区移出的字符数量,当InputLen=0时,一次把接收缓冲区的字符全部移出;Input属性:从接收缓冲区中读出数据,然后将该数据从缓冲区移走。
OutPut属性:向发送缓冲区传递待发送的数据。
InBufferCount和OutBufferCount属性:分别确定当前驻留在接收缓冲区等待被取出和发送缓冲区准备发送的字符数量,这两个属性设置为0,接收和发送缓冲区的内容将被清除;InputMode属性:设置接收传入数据的格式,设置为0采用文本形式,设置为1采用二进制格式,本系统设置为二进制格式进行发送和接收;SThreshold属性:保存一个产生发送OnComm事件的界限值,本系统设置该属性为0,发送数据时不产生OnComm事件;RThreshold属性:设定当接收几个字符时触发OnComm事件,本系统设置该属性为1,每接收一个字符就产生一个OnComm事件;2.MSComm控件的事件MSCOMM控件只使用一个事件OnComm,用属性CommEvent的十七个值来区分不同的触发时机。
主要有以下几个:(1)CommEvent=1时:传输缓冲区中的字符个数已少于Sthreshold(可设置的属性值)个。
(2)CommEvent=2时:接收缓冲区中收到Rthreshold(可设置的属性值)个字符,利用此事件可编写接收数据的过程。
(3)CommEvent=3时:CTS线发生变化。
(4)CommEvent=4时:DSR线发生变化。
(5)CommEvent=5时:CD线发生变化。
(6)CommEvent=6时:检测到振铃信号。
另外十种情况是通信错误时产生,即错误代码。
三、程序的实现1.注册MSComm控件众所周知,C++Builder本身并不提供串行通讯控件MSComm,但我们却可以通过注册后直接使用它。
启动C++Builder5.0后,然后选择C++Builder主菜单中的Component菜单项,单击Import Active Control命令,弹出Import Active窗口,选择Microsoft Comm Control6.0,再选择Install按钮执行安装命令,系统将自动进行编译,编译完成后即完成MSComm控件在C++Builder中的注册,系统默认安装在控件板的Active页,接下来我们就可以像使用C++Builder本身提供的控件那样使用新注册的MSComm控件了。
(前提条件是你的机子上安装了Visual Basic,或者有它的库)2.具体实现新建一个工程Project1,把注册好的MSComm控件加入到窗体中,然后再加入5个ComboBox用来设置串口的属性,4个Button分别用来"打开串口" "关闭串口""发送数据""保存数据" ,2个Memo控件分别用来显示接收到的数据和发送的数据。
再加入一个Shape控件用来标明串口是否打开。
ComboBox1用来设置串口号,通过它的Items属性设置1,2,3,4四个列表项分别表示COM1,COM2,COM3,COM4口。
ComboBox2用来设置波特率,ComboBox3用来设置奇偶校验位,ComboBox4用来设置数据位,ComboBox5用来设置停止位。
他们的缺省值分别是9600,n,8,1。
Button1用来打开串口,Button2用来关闭串口,Button3用来发送数据,Button4用来保存数据。
Memo1用来显示发送的数据,Memo2显示接收的数据。
Shape1的Shape属性设置为stCircle。
下面给出部分源码:__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){if(MSComm1->PortOpen==true){Button1->Enabled=false;Button2->Enabled=true;Button3->Enabled=true;Button4->Enabled=true;Shape1->Brush->Color=clGreen;}else{Button2->Enabled=true;Button2->Enabled=false;Button3->Enabled=false;Button4->Enabled=false;Shape1->Brush->Color=clRed;}}void __fastcall TForm1::Button1Click(TObject *Sender) / /打开串口{if(MSComm1->PortOpen!=true){MSComm1->CommPort=StrToInt(ComboBox1->Text);//选择串口号MSComm1->Settings=ComboBox2->Text+","+ComboBox3->Text+","+ComboBox4->Text+","+ComboBox5->Text; file://设置串口的属性波特率、奇偶校验、数据位和、//停止位。
MSComm1->InputMode=0;//设置传入数据的格式,0表示文本形式MSComm1->PortOpen=true;//打开串口Button1->Enabled=false;Button2->Enabled=true;Button3->Enabled=true;Button4->Enabled=true;Shape1->Brush->Color=clGreen;}}void __fastcall TForm1::Button2Click(TObject *Sender) / /关闭串口{if(MSComm1->PortOpen!=false){MSComm1->PortOpen=false;Button1->Enabled=true;Button2->Enabled=false;Button3->Enabled=false;Button4->Enabled=false;Shape1->Brush->Color=clRed;}else{Button1->Enabled=false;Button2->Enabled=true;Shape1->Brush->Color=clRed;}}MSComm控件的Input和Output属性在Object Inspector中是看不到的,而且在C++Builder环境下这两个属性已不在是VB、VC中的原类型,而是OleV ariant类型,也就是Ole万能变量,这就需要我们在发送接收数据时要把数据转换成Ole类型。
void __fastcall TForm1::Button3Click(TObject *Sender) file://发送Memo2中的数据{MSComm1->Output=StringToOleStr(Memo2->Text); file://把AnsiString型转化成//Ole形式。
}通过OnComm事件接收数据,必须把MSComm的RThreshold属性设置为大于0,只有这样在接收到字符时才会产生一个OnComm事件。
void __fastcall TForm1::MSComm1Comm(TObject *Sender){AnsiString str; file://声明一个AnsiString类型的变量OleV ariant s; file://声明一个用于接收数据的OleV ariant变量。
if(MSComm1->CommEvent==comEvReceive)// 接收缓冲区中是否收到Rthreshold个字符。
{if(MSComm1->InBufferCount)// 是否有字符驻留在接收缓冲区等待被取出{s=MSComm1->Input;//接收数据str=s.AsType(varString); file://把接收到的OleV ariant变量转换成AnsiString类型Memo1->Text=Memo1->Text+str;//把接收到的数据显示在Memo1中。