最新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 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
- 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文件。