最新delphi中使用mscomm控件
mscomm控件的使用和安装
一、引言目前,在用计算机进行数据传输时,常用的是串行通信方式。
用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属性:从接收缓冲区中读出数据,然后将该数据从缓冲区移走。
Delphi中Spcomm使用属性及用法详解
Delphi中Spcomm使用属性及用法详解Delphi中Spcomm使用属性及用法详解Delphi是一种具有功能强大、简便易用和代码执行速度快等优点的可视化快速应用开发工具,它在构架企业信息系统方面发挥着越来越重要的作用,许多程序员愿意选择Delphi作为开发工具编制各种应用程序.但是,美中不足之处是Delphi没有自带的串口通信控件,在它的帮助文档里也没有提及串口通信,这就给编制通信程序的开发人员带来许多不便。
目前,利用Delphi实现串口通信的常用的方法有3种:一是利用控件,如MSCOMM控件和SPCOMM控件;二是使用API函数;三是调用其他串口通信程序。
其中利用API编写串口通信程序较为复杂,需要掌握大量的通信知识。
相比较而言,利用SPCOMM控件则相对较简单,并且该控件具有丰富的与串口通信密切相关的属性及事件,提供了对串口的各种操作,而且还支持多线程.下面本文结合实例详细介绍SPCOMM控件的使用。
SPCOMM的安装1.选择下拉菜单Component中的Install Component选项,弹出如图1所示的窗口。
图1在Unit file name处填写SPCOMM控件所在的路径,其他各项可用默认值,点击OK按钮.2.安装后,在System控件面板中将出现一个红色控件COM。
现在就可以像Delphi自带控件一样使用COM控件了。
SPCOMM的属性、方法和事件1.属性●CommName:表示COM1、COM2等串口的名字;●BaudRate:根据实际需要设定的波特率,在串口打开后也可更改此值,实际波特率随之更改;●ParityCheck:表示是否需要奇偶校验;●ByteSize:根据实际情况设定的字节长度;●Parity:奇偶校验位;●StopBits:停止位;●SendDataEmpty:这是一个布尔型属性,为true时表示发送缓存为空,或者发送队列里没有信息;为false时表示发送缓存不为空,或者发送队列里有信息。
Delphi封装MSComm供C#调用
Delphi设计串口通信组件1、创建一个ActiveX Library这样就建立一个COM 组件,保存工程名称为MyCommTest.然后新建一个ActiveX Form,命名为frmMyActivex点击OK后,delphi会自动生成MyCommTest_TLB.pas及窗体frmMyActivexlmpl1.在frmMyActivexlmpl1界面拖放一个MSComm控件和一个Timer控件,Time的Enable设置为False,interval设置为300ms.(可适当将界面调整小点)。
然后点击”View” -> “Type Library”,打开类型库界面.我们点击lfrmMyActivex接口新建一个属性,比如卡号CardNo.\设置卡号的名字,类型为BSTR (BSTR为Delphi兼容COM接口的字符串类型),点击”刷新”图标,自动将该属性加入到接口模块中.我们可以看到在MyCommTest_LIB.pas的IfrmMyActivex = interface(IDispatch)接口中增加了一格CardNo属性.在unit frmMyActivexImpl1中增加了两个属性操作函数现在我们回到unit frmMyActivexImpl1;我们需要实现对属性的操作,保存属性数据,就需要在该单元中新建一个私有的_CardNo变量。
然后需要手动实现两个属性操作函数的内容,在属性函数中填入以下代码。
为了实现对串口的操作,我们还需要自定义几个函数用于打开,关闭串口及发送串口通信指令。
点击”View” -> “Type Library”,进入类型库界面右键点击IfrmMyActivex,选择”new”-Method输入函数名称InitComm然后选择Parameters选项卡,生成一个输入参数CommPort 串口号,类型为Short点击刷新按钮,刷新接口模块,,我们在MyCommTest_TLB.pas界面看到,已经自动生成函数。
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(非法属性值)。
在delphi7中利用mscomm控件编程
MSCOmm是微软一个强大的串口通讯的控件,其强大,简单的特点今我们不舍,在Delphi中我们也可以使用它。
下面这些代码是针对发送和接收为16进制处理的。
varsenddata:array[1..10] of char;reData:array of Variant;sendstr:string;restr:string;i:longint;beginmPort := 1; //指定端口mscomm1.Settings := '9600,N,8,1'; //其它参数mscomm1.InBufferSize := 1024; //接收缓冲区mscomm1.OutBufferSize := 1024; //发送缓冲区mscomm1.InputMode := comInputModeBinary; //接收模式mscomm1.InputLen := 0; //一次读取所有数据mscomm1.SThreshold := 0; //一次发送所有数据mscomm1.InBufferCount := 0; //清空读取缓冲区mscomm1.OutBufferCount := 0; //清空发送缓冲区mscomm1.PortOpen:=true; //打开端口MSComm1.RThreshold := 16; //设置接收多少字节开产生oncomm事件senddata[1]:=chr($06); //要发送的数据senddata[2]:=chr($03);senddata[3]:=chr($00);senddata[4]:=chr($03);senddata[5]:=chr($10);sendstr:='';for i:=1 to 5 dosendstr:=sendstr + senddata[i];mscomm1.output:=sendstr; //发送数据i:=0;bzw:=false;repeatsleep(10);Application.ProcessMessages;i := i + 1;If i > 30000 Thenbeginshowmessage('发送超时!');break;end;Until bzw = true;redata:=mscomm1.Input; 接收数据restr:='';for i:=0 to vararrayhighbound(redata,1) dorestr:=restr + inttohex(redata[i],2)+' '; mscomm1.PortOpen:=false;flatmemo1.Text:=restr;end;//oncomm事件procedure TForm1.MSComm1Comm(Sender: Tobject); begincase mEvent ofcomEvReceive: bzw := true;end;end;最后,记事发布软件时要带上Mscomm32.ocx文件。
delphi messagebox用法
文章标题:深入探讨Delphi中MessageBox的用法及其实际应用在Delphi编程语言中,MessageBox是一个非常常见且实用的函数,用于在程序中显示各种提示、警告和错误信息。
在本文中,我们将从浅入深地探讨MessageBox的使用方法及其实际应用。
1. MessageBox的基本语法在Delphi中,使用MessageBox函数可以在程序中创建一个消息框来显示提示信息。
其基本语法如下:```ShowMessage('这是一个简单的提示信息');```上面的代码将在程序中弹出一个消息框,显示内容为“这是一个简单的提示信息”。
2. MessageBox的参数MessageBox函数还可以接受多个参数,以便实现更丰富的提示信息展示。
常用的参数包括:- 弹出消息框的标题- 指定显示的消息内容- 消息框的类型(比如信息、警告、错误等)- 消息框的按钮类型(比如确定、取消、是、否等)3. MessageBox的实际应用在实际开发中,MessageBox函数可以帮助程序员完成很多任务,比如:- 在用户操作错误时给出友好的提示- 在程序出现异常时提醒用户- 在特定条件下展示重要的信息4. MessageBox的深入使用除了基本的使用方法,MessageBox还可以通过结合其他功能来实现更复杂的效果。
比如可以在MessageBox弹出后执行一些额外的逻辑,或者定制化消息框的外观和行为。
5. 个人观点和总结对于MessageBox的用法,我的个人观点是,在实际开发中要灵活运用MessageBox函数,根据不同的场景和需求来选择合适的参数和样式,以展现出更好的用户体验。
也要注意不要过多地使用MessageBox,以免影响用户的操作流畅性。
通过本文的阐述,相信大家对Delphi中MessageBox的用法有了更深入的了解。
在实际开发中,熟练掌握MessageBox函数的使用方法将有助于提高程序的用户友好性和交互性。
delphi中使用mscomm控件
delphi中使用mscomm控件Mscomm是微软一个强大的串口通讯的控件,其强大,简单的特点今我们不舍,在delphi 中我们也可以使用它。
下面这些代码是针对发送和接收为16进制处理的。
varsenddata:array[1..10] of char;reData:array of Variant;sendstr:string;restr:string;i:longint;beginmscomm1 mPort := 1; //指定端口ms comm1.Settings := ‘9600,N,8,1‘; //其它参数mscomm1.InBufferSize := 1024; //接收缓冲区mscomm1.OutBufferSize := 1024; //发送缓冲区mscomm1.InputMode := comInputModeBinary; //接收模式mscomm1.InputLen := 0; //一次读取所有数据mscomm1.SThreshold := 0; //一次发送所有数据mscomm1.InBufferCount := 0; //清空读取缓冲区mscomm1.OutBufferCount := 0; //清空发送缓冲区mscomm1.PortOpen:=true; //打开端口MSComm1.RThreshold := 16; //设置接收多少字节开产生oncomm事件senddata[1]:=chr($06); //要发送的数据senddata[2]:=chr($03);senddata[3]:=chr($00);senddata[4]:=chr($03);senddata[5]:=chr($10);sendstr:=‘‘;for i:=1 to 5 dosendstr:=sendstr + senddata[i];mscomm1.output:=sendstr; //发送数据i:=0;bzw:=false;repeatsleep(10);Application.ProcessMessages;i := i + 1;If i > 30000 Thenbeginshowmessage(‘发送超时!‘);break;end;Until bzw = true;redata:=mscomm1.Input; 接收数据restr:=‘‘;for i:=0 to vararrayhighbound(redata,1) dorestr:=restr + inttohex(redata[i],2)+‘ ‘;mscomm1.PortOpen:=false;flatmemo1.Text:=restr;end;//oncomm事件procedure TForm1.MSComm1Comm(Sender: TObject); begincase mscomm1 mEvent ofcomEvReceive: bzw := true;end;end;最后,记事发布软件时要带上Mscomm32.ocx文件。
Delphi中使用串口控件MSComm的0字符接收例程祥解
在Delphi中使用串口控件MSComm的0字符接收例程祥解//以下是创建窗体时的MSCOMM参数设置过程//MSComm1.InputMode := comInputModeBinary;//和MSComm1.InputMode := comInputModeText;//实验结果基本对Delghi不太起作用procedure TForm1.FormCreate(Sender: TObject);varstr: string;begin//MSCOMM参数设置mPort := 1;//使用COM1MSComm1.Settings := ''9600,N,8,1'';//设置通信口参数MSComm1.InBufferSize := 32;//设置MSComm1接收缓冲区为32字节MSComm1.OutBufferSize := 2;//设置MSComm1发送缓冲区为2字节MSComm1.InputMode := comInputModeBinary;//设置接收数据模式为二进制形式MSComm1.InputLen := 1;//设置Input 一次从接收缓冲读取字节数为1MSComm1.SThreshold := 1;//设置Output 一次从发送缓冲读取字节数为1 MSComm1.InBufferCount := 0;//清除接收缓冲区MSComm1.OutBufferCount := 0;//清除发送缓冲区MSComm1.RThreshold := 1;//设置接收一个字节产生OnComm事件MSComm1.PortOpen := true;//打开串口1/////////////////////////////////////////////////////////////Buffers := '''';CheckSum := 0;//发送串口命令Command := 34;str := ''$'' + #2 + #$22 + #1;//读MP3总曲目str := str + Char(GetCheckSum(str));//计算校验和MSComm1.Output := str;//发送串口命令end;//以下是接收事件处理过程,在MCU中相当于串口中断//注意其中2个语句//while MSComm1.InBufferCount > 0 do//输入FiFO不为空//if str = '''' then str := #0; //0字符处理//例接收的数据为#24#02#00#01#03//此时InBufferCount=5.若设置Input 一次从接收缓冲读取字节数不限//即:MSComm1.InputLen := 0;则str := MSComm1.Input;后str好象为#24#02#00#01#03//但实际为''??''#24#02.总得不到结果,至少0字符后的#01#03无法读出.//采用MSComm1.InputLen := 1;后,并配合while MSComm1.InBufferCount > 0 do//当读到0字符时,由于str=''''(空),故访问str[1]将会引发异常的发生而导致程序的终止.//故用if str = '''' then str := #0; 来向str[1]内认为地填入字符#0且str 的长度也为1了.//故此要点是用if str = '''' then str := #0;语句渡过读0字符的难关~~~procedure TForm1.MSComm1Comm(Sender: TObject);varstr: string;i: integer;begincase mEvent ofcomEvReceive://接收事件处理beginwhile MSComm1.InBufferCount > 0 do//输入FiFO不为空beginstr := MSComm1.Input;//从FIFO中只取1个字符,因为MSComm1.InputLen := 1if str = '''' then str := #0; //0字符处理if (Buffers = '''') and (str = ''$'') then//同步符测试beginBuffers := str;//存入同步符''$''CheckSum := 0;//初始化校验和endelse if (Buffers <> '''') and (Buffers[1] = ''$'') then begin//必须用同步符起始Buffers := Buffers + str;//加入数据串CheckSum := CheckSum xor Byte(str[1]);//求校验和(除同步符''$''外)if Length(Buffers) = Byte(Buffers[2]) + 3 then//结束符测试beginif CheckSum = 0 then//此时校验和必须为0表示校验和正确 begincase Command of$22: begin//取歌曲总数ComboBox1.Items.Clear;for i := 1 to Byte(Buffers[4]) dobeginstr := ''第'' + inttostr(i) + ''首歌曲''; ComboBox1.Items.Add(str);//end;Command := 0;end;1: ;else ;end;end;Buffers := '''';//接收完毕清空缓冲区CheckSum := 0;//初始化校验和end;endelsebeginBuffers := '''';//接收错误清空缓冲区,放弃所有数据CheckSum := 0;//初始化校验和end;end;end;end;end;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控件使用详解
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控件处理通信的方式编程用MSComm控件实现通过串行端口传输和接收数据,为应用程序提供串行通信功能。
它提供下列两种处理通信的方式。
1.事件驱动方式该方式相当于一般程序设计中的中断方式。
当串口发生事件或错误时,MSComm控件会产生OnComm 事件,用户程序可以捕获该事件并进行相应处理。
它是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时程序应该能处理它,例如,在串口接收缓冲区中有一个字符到达或一个变化发生时,程序都可以利用MSComm控件的OnComm事件捕获并处理这些通信事件;OnComm事件还可以检查和处理通信错误。
在程序的每个关键功能执行之后,可以通过检查CommEvent 属性的值来查询事件和错误。
在程序设计中,可以在OnComm事件处理函数中加入自己的处理代码,一旦事件发生即可自动执行该段程序。
这种方法的优点是程序响应及时,可靠性高。
2.查询方式在程序的每个关键功能执行之后,在用户程序中设计定时或不定时的查询,通过检查CommEvent 属性的值来查询事件和错误,从而作出相应的处理。
在进行简单应用程序设计时可采用这种方法,例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为惟一等待接收的字符是调制解调器的“OK”响应。
查询方式的进行可用计时器Timer或Do…Loop程序实现。
查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
下面的程序段是一个使用数据查询方式接收数据的例子:Private Sub test ( )Dim Instring As String ' 保存输入子串的缓冲区mPort = 1 ' 指定程序使用COM1MSComml.Settings = "9600,N,8,1" ' 设置通信参数MSComml.InputLen = 0 ' 读取整个缓冲区数据MSComml.PortOpen = True ' 打开端口MSComml.Output = "AT" + Chr$(13) ' 将AT命令送到调制解调器Do ' 等待数据返回到串行端口DoEventsLoop Until MSComml.InBufferCount >=2Instring = MSComml.Input ' 从串行端口读取"OK"响应MSComml.PortOpen = False ' 关闭串行端口End Sub5.2.2 MSComm控件的引用1.控件添加我们开始一个项目的设计时,VB的工具箱中会有许多默认的控件让设计者选用,这些原本就出现在工具箱中的控件是内置控件,它提供了一些基本的系统设计组件给设计者,不过,功能比较特别的控件就不会出现在其中,如用来设计通信功能的控件MSComm就不在其中。
23.2.1 使用TMSComm组件_Delphi开发典型模块大全(修订版)_[共2页]
Delphi 开发典型模块大全 578 23.2 主要实现技术23.2.1 使用TMSComm 组件MSComm 组件是微软公司为Visual Basic 提供的一个串口控件,它通过串行端口传送和接收数据,为应用程序提供基本的串行通信功能。
在程控电话计费系统中,在主窗体的OnCreate 事件处理过程中初始化TMSComm 组件,设置代码及说明如下:procedure TMainForm.FormCreate(Sender: TObject);begin//初始化程序所需参数及变量StartPublicParameter;Application.OnHint:=appHint;//-----------------------------------------------------mPort:=1; //使用Com1口msComm1.Settings:= '9600,n,8,1'; //设置通信参数msComm1.RThreshold:=1; //每收到一个字符就调用一次处理函数 msComm1.InputLen:=1; //每次从输入缓冲区中接收一个字符 msComm1.Handshaking:=2; //由信号线RTS/CTS 自动进行流量控制 trymsComm1.PortOpen:=true; //打开串口exceptshowMessage('COM1错误!');Application.Terminate; //终止程序end;end;通过TMSComm 组件的OnComm 事件处理接收的电话交换机返回信息并进行分析。
完整代码及说明如下:procedure TMainForm.MSComm1Comm(Sender: TObject);varc:string; //接收电话交换机返回来的信息s:string; //临时存放通话记录信息beginTime:string; //开始时间lastTime:string; //通话时长intLast:integer;callNo:string; //被叫号码extensionNo:string; //分机号phoneType:string; //电话类型tmp:string;maxLen:integer;fl: double; //费率/秒pay:double; //话费begincase mEvent ofcomEvReceive: begin //只处理返回信息的事件消息maxLen:=0;//返回通话记录信息并检测是否完整,完整后记录花费,不完整继续组合 c:=msComm1.Input;recv:=recv+c;if (pos(#10,c)<>0)or(pos(#13,c)<>0) thenbeginlist.Add(recv); //添加完整的通话信息到list 中 if isBusy=false then //当前没有进行存储beginisBusy:=true; //开始存储通话记录while list.Count>0 do //已经接收的通话记录数量。
Delphi的MSCOMM实现上位机与PLC间的串行通信
一上位机与PLC间的串行通信随着现代信息技术的发展以及计算机网络的广泛应用,计算机通信技术已经日趋成熟。
作为传统的计算机通信方式的串行通信,由于具有线路简单、应用灵活、可靠性高等一系列优点长期以来获得了广泛的应用。
计算机串行通信在数据财经、数据通信、故障检测、计算机远程监控等方面有广泛的实用价值,特别在Windows下的串口通信可以充分利用Windows下的软件资源优势,实现多任务条件下对外部的数据传输、信息收集和处理。
在本系统中,我们采用了性能/价格比较高的计算机构成厂级的监控工作站。
在PLC与上位计算机之间采用RS-485和RS-232C标准通信接口进行通信。
在两级计算机控制系统中,最不稳定的环节就是上位机。
为了保证系统的稳定性,避免因上位机的故障导致系统控制失灵,所有采集到的信号都反馈到PLC当中。
上位机需要通过串行通信取得所需的数据信息,并通过串行通信将必要的控制信息和参数设置信息写入PLC的数据存储区。
因此,串行通信作为上位机和下位机联系的唯一方式,在整个系统中具有非常重要的作用。
1.1上位机与PLC间的串行通信计算机与计算机或计算机与外部设备之间的数据传输和交换的方式主要有串行通信和并行通信两种方式,其中串行通信指的是数据逐位传输的方式。
由于串行通信方式具有使用线路少、成本低,特别是在远程传输时,避免了多条线路特性的不一致而被广泛采用。
1.1.1串行通信串行通信方式又可分为两种:同步串行通信方式和异步串行通信方式。
1.同步串行通信方式:同步串行通信是以数据块(字符块)为信息单位传送,每帧信息可以包含很多字符。
同步通信要求通信双方以相同的速率进行,而且要准证确协调,通常通过共享一个时钟或定时脉冲源保发送方和接收方准确同步。
这种通信方式的效率较高,但是对时钟同步要求非常严格,成本较高。
2.异步串行通信方式:异步串行通信以字符为信息单位传送。
双方需要遵守异步通信协议,以字符为数据单位,发送方传送字符的时间间隔不确定。
在DELPHI中使用MSCOMM控件对OMRON PLC进行监控
《控制与传动》2003年第10期在DELPHI中使用MSCOMM控件对OMRON PLC进行监控四川温江成都印钞公司物资设备部邓世俊本文介绍了在Delphi编程方式下采用Mscomm控件实现工业现场数据交换的方法,并给出一个编程的例子。
1前言Delphi是当今世界上最优秀的WINDOWS开发工具之一,它的可视化开发环境让用户在windows平台上快速开发出32位的windows应用程序,它以其良好的图形用户接口(GUI)、面向对象的程序设计和结构化的事件与驱动编程模式,使得编程效率提高,现场应用功能大大增强。
欧姆龙株式会是全球知名的自动化控制和电子设备制造厂商,掌握着世界领先的自动化控制核心技术。
OMRON公司的C200H系列PLC具有可靠性高、功能强大、编程方便等优点,在工业控制中占据着很重要的地位。
本文就Windows95操作系统下用Delphi3.0开发数上浆机的监控程序为例,具体探讨使用MSComm控件对OMRON PLC进行串行通信的实现方法,整个通讯电路结构框图如图1。
2 MSComm控件简介Microsoft Communication Control(简称MSComm)是Microsoft公司提供的简化Windows 下进行串行通讯编程的ActiveX控件,ActiveX是Windows下进行应用程序开发的崭新技术,它的核心内容是组件对象模型COM。
ActiveX控件包括一系列的属性、方法和事件,使用ActiveX控件的应用程序和ActiveX控件之间的工作方式是客户/服务器方式,即应用程序通过ActiveX控件提供的接口来访问ActiveX控件的功能。
MSComm控件实际上是一些Windows API函数的有机集成,它以属性和事件的形式提供了对Windows通讯驱动程序API函数接口,为应用程序提供了通过串行接口收发数据的简便方法。
因此,程序员只需在程序中设置和监视MSComm控件的属性和事件即可完成对串口的编程。
MSCOMM控件的应用
MSCOMM 控件的应用出处:网络MSComm 控件为你的应用程序提供了串口通信的功能,它允许你通过串口来发送和接收数据。
MSComm 控件提供了以下的两种处理通讯的手段:事件驱动通讯是一个处理和串口交互强有力的方法。
在很多情况下,你想要一个事件发生的时间,例如:从CD(Carried Detect)或RTS(Request To Send)线到达一个字符或发生了改变。
在这种情况下,采用MSComm 控件的OnComm 事件来捕捉和处理这种通讯事件。
OnComm 事件也可以检测和处理通讯时发生的错误。
对于那些可能事件和通讯的错误,请参考CommEvent 属性。
你也可以通过检测CommEvent 属性的值来发现应用程序中的事件和出错。
每个MSComm 控件可以控制你和一个串口进行通讯。
如果需要通过应用程序访问更多的串口,必须使用更多的MSComm 控件。
端口地址和中断号可以由WINDOW S 中的控制面板来改变。
以下是MSComm 控件的主要属性:MSComm 控件属性input 属性说明:返回和设置从接收缓收区中得到的数据流。
在允许阶段该属性为只读。
不可更改语法:MSCommname.inputInput 属性、inputlen 属性和inputmode 属性是有关系的。
Inputlen 属性决定读取的字符个数。
当inputlen 属性为0时,用input 属性来读取数据时将讯取整个缓冲区中的数据。
Inputmode 属性是设置读取数据的类型。
当inputmode 属性被子设置为comin putmodetext 时,数据被读取并按照文本的形式存储在变量中;而当inputmode 属性设置为cominputmodebinary 时,则接收来的数据按照二进制形式存储在一个二进制数组中。
commevent 属性。
说明:返回最近的通讯事件和错误。
语法:mevent虽然oncomm事件在通讯错误和通讯事件发时都响应,但commevent属性为这些通讯事件和通讯错误保留出错数字码。
Delphi中MsComm控件的安装使用
Delphi中MsComm控件的安装使⽤Delphi中MsComm控件的安装使⽤ Delphi 具有功能强⼤、简便易⽤和代码执⾏速度快等特点,是全球公认的快速应⽤开发⼯具技术的先驱者。
但是在对串⼝通信的控制上Delphi的帮助⽂档和其他书籍中很少提及,这恰恰⼜是在开发应⽤系统时会经常遇到的问题。
⽤过VB的程序员都知道 VB的MSComm通信控件具有丰富的与串⼝通信密切相关的属性及事件,提供了⼀系列标准通信命令的接⼝,可以⽤它创建全双⼯的、事件驱动的、⾼效实⽤的通信程序。
在这⾥就介绍⼀下如何把MSComm这个ActiveX控件加⼊到Delphi中,充分发挥出⼆者的优越性。
⾸先在VB安装⽬录下找到下列三个⽂件: Mscomm.reg, Mscomm32.ocx,Mscomm32.dep , 把这三个⽂件拷贝到Windows的system⽬录下(注意WinNT下是System32)。
然后⽤Windows下的注册⼯具regsvr32注册该OCX控件,例如: Regsvr32 … system⽬录\Mscomm32.ocx . 注册成功后⽤记事本打开Mscomm.reg,可以看到类似下⾯的内容: [HKEY_CLASSES_ROOT\Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905]@ = "kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun",为了能正确使⽤该控件,需要修改注册表的信息,在注册表的在HKEY_CLASSES_ROOT\Licenses下建⼀主键:4250E830-6AC2-11cf-8ADB-00AA00C00905,主键的内容为kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun. ⾄此已经完成了控件的系统注册⼯作,剩下的⼯作是在Delphi中导⼊这个ActiveX控件,进⼊Delphi环境在Component菜单下选 Import ActiveX Control,这时在列表中可以看到Microsoft Comm Control 6.0选项, 选中这个选项点击Install按钮,完成安装。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
delphi中使用mscomm控件
Mscomm是微软一个强大的串口通讯的控件,其强大,简单的特点今我们不舍,在delphi 中我们也可以使用它。
下面这些代码是针对发送和接收为16进制处理的。
var
senddata:array[1..10] of char;
reData:array of Variant;
sendstr:string;
restr:string;
i:longint;
begin
mPort := 1; //指定端口
mscomm1.Settings := ‘9600,N,8,1‘; //其它参数
mscomm1.InBufferSize := 1024; //接收缓冲区
mscomm1.OutBufferSize := 1024; //发送缓冲区
mscomm1.InputMode := comInputModeBinary; //接收模式
mscomm1.InputLen := 0; //一次读取所有数据
mscomm1.SThreshold := 0; //一次发送所有数据
mscomm1.InBufferCount := 0; //清空读取缓冲区
mscomm1.OutBufferCount := 0; //清空发送缓冲区
mscomm1.PortOpen:=true; //打开端口
MSComm1.RThreshold := 16; //设置接收多少字节开产生oncomm事件senddata[1]:=chr($06); //要发送的数据
senddata[2]:=chr($03);
senddata[3]:=chr($00);
senddata[4]:=chr($03);
senddata[5]:=chr($10);
sendstr:=‘‘;
for i:=1 to 5 do
sendstr:=sendstr + senddata[i];
mscomm1.output:=sendstr; //发送数据
i:=0;
bzw:=false;
repeat
sleep(10);
Application.ProcessMessages;
i := i + 1;
If i > 30000 Then
begin
showmessage(‘发送超时!‘);
break;
end;
Until bzw = true;
redata:=mscomm1.Input; 接收数据
restr:=‘‘;
for i:=0 to vararrayhighbound(redata,1) do
restr:=restr + inttohex(redata[i],2)+‘ ‘;
mscomm1.PortOpen:=false;
flatmemo1.Text:=restr;
end;
//oncomm事件
procedure TForm1.MSComm1Comm(Sender: TObject); begin
case mEvent of
comEvReceive: bzw := true;
end;
end;
最后,记事发布软件时要带上Mscomm32.ocx文件。