admin 管理员组文章数量: 887021
2023年12月17日发(作者:unix个人系统)
袄件设计学术探讨 De l ph i串口通信程序设计与实现 傅宏伟 (安徽先河消防科技工程有限公司,安徽合肥 230000) [摘要] 讲述Delphi实现串口通信程序的设计与实现,采用Delphi编程技术和面向对象的程序设计方法,利用软件制 作数据发生器模拟硬件产生数据,使用Delphi q-常用的VCL控件设计系统界面,再用Spcomm控件实现实时发送数据,通过 设置Spcomm控件属性和缓冲区,使得计算机能控制串口发送数据。 [关键词]Delphi;串口通信;控件 MSComm控件通过串行端口传输和接收数据,为应用 1.Delphi中实现串口通信的方法 利用Delphi实现串口通信的常用的方法有3种:一是 利用控件,如MSComm控件和Spcomm控件;二是使用API 函数;三是调用其它串口通信程序。使用API方法的优点是 程序提供串行通讯功能。MSComm控件在串口编程时非常 方便,程序员不必去花时间去了解较为复杂的API函数,而 且在VC、VB、Delphi等语言中均可使用。 (1)MSComm控件两种处理通讯的方式 MSComm控件提供下列两种处理通讯的方式:事件驱 动方式和查询方式。 (2)MSComm控件的常用属性 CommPort:设置并返回通讯端口号; 比较适合于编写较为复杂的低层次通信程序,但缺点是编 写串口通信程序较为复杂,需要掌握大量通信知识。相比较 而言,利用Spcomm控件则相对较简单,Spcomm是 Smal1.Pig Team开发的一个第三方Delphi串口控件, Spcomm控件并不是DELPHI 7.0白带的控件,需要自己到 相关网站下载并安装到相关目录下,该控件具有丰富的与 串口通信密切相关的属性及事件,提供了对串口的各种操 作,编程简单、通用性强、可移植性好,而且还支持多线程, 在Delphi软件开发中已经成为一个被广泛应用的串口通信 开发控件。 Settings:以字符串的形式设置并返回波特率、奇偶校验、 数据位、停止位; PortOpen:设置并返回通讯端口的状态。也可以打开和关 闭端口; Input:从接收缓冲区返回和删除字符; Output:向传输缓冲区写一个字符串; EOFEnable:确定在输入过程中MSComm控件是否寻 找文件结尾(EOF)字符。如果找到EOF字符,将停止输入并 激活OnComm事件,此时CommEvent属性设置为 comEvE0F。 1.1使用WindowsAPI函数 Windows环境下的串口编程与DOS环境下的串口编程 有很大的不同。Windows环境下的串口编程的最大特征之 一就是设备无关性,它通过设备驱动程序将Windows应用 程序与不同的外界设备隔离。Windows封装了Windows的 通信机制,这种方式称为通信API,Windows程序员可以利 用Windows通信API进行编程,不用直接对硬件操作。 w 32通信API基本上是一个串行端口API,不是很 适合局域网(LAN)通信。它把串口操作(以及并口等)与文件 操作统一起来,使用类似的操作来实现。 用Windows API函数实现串口通信的主要事件有: (1)打开和关闭串口:分别是用CreatFile函数和Close Handle函数实现。 (2)串口配置和属性设置:使用GetCommState()函数获 取串口当前配置,使用SetCommState()从新分配串口资源的 MSComm控件的事件只有一个,就是OnComm事件。 (3)使用MSComm控件实现串口通信的基本流程: 1)添加MSComm控件 21初始化并打开串口 3)捕捉串口事件 41串口读写 51关闭串口 1.3使用Spcomm控件 Spcomm控件并不是Delphi 7.0白带的控件,需要自己 到相关网站下载并安装到相关目录下。利用Spcomm控件就 可以实现串口通信,因为该控件具有丰富的与串口通信密切 各个参数。在配置串口属性时,应该先了解串口设备的属 性。通过GetCommProperties0函数获得串口的属性。 (3)读/写串口:使用ReadFile()*ll WriteFile函数来实现。 (4)编写相应的OnClick事件的相关代码。 1.2使用MSComm控件 相关的属性及事件,提供了对串口的各种操作,而且还支持 多线程,能实现一般的串口通信需要。 Spcomm的安装: (1)选择下拉菜单Component中的Install Component选 项,在Unit ifle name处填写Spcomm控件所在的路径,其它 作者简介:傅宏伟,男,安徽宿州人,学士,助理工程师,研究方向:计算机应用,消防监控。 47。_—_—
学术探讨软件设计 — 土 二二二 二 一二一一二 一 — ~二 二 各项可用默认值,点击OK按钮。 (2)安装后,在System控件面板中将出现一个红色控件 Com。 的串行通信控件用于处理特定的设备模块,例如TGPS控件 就是专门处理GPS接受机串行通信输出的NMEA.O183格 式的数据,分析得到定位信息等。这些通信控件一般都极大 地简化了对底层的设置,提供了许多强大的功能,可以加快 Spcomm的属性、方法和事件: (1)属性 CommName:表示Com1、Com2等串口的名字; BaudRate:根据实际需要设定的波特率,在串口打开后 也町更改此值,实际波特率随之更改; ParityCheck:表示是否需要奇偶校验; ByteSize:根据实际情况设定的字节长度: Parity:奇偶校验位; StopBits:停J卜位; SendDataEmpty:这是一个布尔型属性,为true时表示发 送缓存为空,或者发送队列里没有信息;为false时表示发送 缓存不为空,或者发送队列里有信息。 (2)方法 StartComm方法用于打开串口,当打开失败时通常会报 错。错误主要有7种:串口已经打开;打开串口错误;文件句 柄不是通信句柄;不能够安装通信缓存;不能产生事件;不 能产生读进程;不能产生写进程。 StopComm方法用于关闭串口,没有返回值。 WriteCommData(pDataToWrite:PChar;dwSizeotDataToWrite: Word)方法是个带有布尔型返回值的函数,用于将一个字符 串发送到写进程,发送成功返回true,发送失败返回false。执 行此函数将立即得到返回值,发送操作随后执行。该函数有 两个参数,其中pDataToWrite是要发送的字符串, dwSizeofDataToWrite是发送字符串的长度。 f31事件 OnReceiveData:procedure(Sender:TObject;Buffer:Pointer; BufferLength:Word)ofobject当有数据输入缓存时将触发该事 件,在这里可以对从串口收到的数据进行处理。Buffer中是 收到的数据,BufferLength是收到的数据长度。 OnReceiveError:procedure(Sender:TObject;EventMask: DWORD)当接收数据出现错误时将触发该事件。 在使用Spcomm控件的时候,首先要添加一个Com控 件,之后设定Com1属性,再设置Com控件的发送和接受的 触发事件,最后编写源代码并进行调试。 (4)Spcomm串口通信的实现 Spcomm串行通信控件具有多线程的特性,接收和发送 数据分别在两个线程内完成,接收线程负责收到数据时触 发OnReceiveData事件;用WriteCommData()函数将待发送 的数据写入输出缓冲器,发送线程在后台完成数据发送工 作。在接收和发送数据前需要初始化串口,用StartComm方 法打开串口,退出程序时用StopComm方法关闭串口。 1.4调用其它串口通信程序 除了使用Windows API函数、MSCOMM控件、Spcomm 控件实现串口通信,还可以使用CommPortDrv控件、 SerialPort控件等。除了通用的串口通信控件,还有一些专用 48--—— 程序的开发过程。 2.系统设计与实现 2.1发送窗口功能实现 图1发送窗口界面 代码实现: 保存数据功能代码如下: procedure TFormCommTest.BTNSaveLeftClick(Sender: TObject); begin if Trim(Memo1.Lines.Text、<>”then begin SaveDialog1.Title::’将即将发送的内容保存到文本文件 中!’; with SaveDialogl do if Execute then begin StatusBar1.Panels[1].Text: SaveDialog1.FileName: Memo1.Lines.SaveToFile(SaveDialog1.FileName). end; end; end 2.2实时数据发送功能实现 图2实现实时数据发送界面
设计的关键是使用Spcomm控件和Timer控件实现。 (1)初始化 需要选择本次通信使用的串口,设置波特率、校验方式、 数据位、停止位等属性,打开该串口。 示例代码如下: Corrmq1.BaudRate:=9600: Comm1.Parity:=None; Comm1.ByteSize: 8: Comm1.StopBits:=1: 这与具体实现的PC机有关,在设置软件Com口属性 前应该先查看好该机器的Com属性,使得二者能匹配,这样 能避免在用模拟软件实现实时数据发送时出现错误。 (21发送测试数据 实现模拟的实时数据采集,首先要调试串口,测试信号 可以随意选择某特定字符串,通过发送测试信号实现,当 PC发出这样一些测试数据后,通过接收事件能收到特定的 某字符串,则表示测试成功,串口发送数据可以正常进行。 否则需重新发送测试信号。 以下为向计算机发送一个测试数据: 代码如下: procedure TFormCommTest.TestCommActionExecute (Sender:TObject); begin if not Testing then begin Testing:=True; NextNum:=0: Comm1.WriteCommData(Pchar(EditAck1.Text),Length (Pchar(EditAck1.Text))1; StatusBar1.Panels[1].Text:=’串口1正在发送测试数据’; end; end://测试通信口 (3)发送数据 在编写实时数据采集系统时,利用Spcomm串口控件实 现发送数据示例代码如下:procedure TFormCommTest. StartSendActionExecute(Sender:TObject); Var strSend:String; begin try Comm1.StopComm; Comm1.StartComm: except Messagedlg(’无法打开COMM1 1’,mterror,[mbOK】,0); end; //Sleep(50); StatusBar1.Panels[1].Text:=’串口1已启动’; //for i:=0 to Memo1.Lines.Count.1 do 软件设计学术探讨l 一 : :: : :. 一.:::===一一: ::・l== 2t“2苹第8醐l begin strSend:=Memo 1.Lines[i】; //showmessage(strSend); //Sleep(1 000); try StatusBar1.Panels[1].Text:一’串口1正在发送数据’; Comm1.WriteCommData(PChar(strSend),Length(strSend) ); //Comm1.WriteCommData(PChar(copy(strSend,2,3)),3); Memo2.Lines.Add(strSend); //Memo2.Lines.Add(copy(strSend,2,3)1; StatusBar1.Panels[2].Text:=’显示已经发送的数据’; hang:=hang+1; except Showmessage(’发送错误’1; end; end; //Showmessage(’已经发送’+IntToStr(hang)+’个数据!’): end;//发送按钮的点击事件 (4)关闭串口 在系统开发中,应注意在不使用串口时应及时关闭串 口,释放系统资源。 begin Comm1.StopComm://关闭Comml StatusBar1.Panels[1].Text:=’串口1已关闭’; StatusBar1.Panels[2].Text:=’串口1己关闭’ end; (5)定时器设计 通过编写定时器的相关代码和属性设置,实现数据的自 动发送功能。 procedure TFormCommTest.Timer1Timer(Sender:TObject); begin if Memo1.Text<>”then BTNStartSend.Click; i:=i+1: if i=Memo1.Lines.Count then Showmessage(’全部发送完毕’+’,’十’共发送’+IntToStr (hang)+’个数据! ); //showmessage(’全部发送完毕’1; //ifi=Memo1.Lines.Count+l then i:=0: end; 2.3 Spcomm串口通信的关键技术问题 首先,Spcomm是通过ReadlntervatTimeout属性的设 置,来确定所接收到的数据是否属于同一帧数据,其默认值 是lOOms,也就是说,只要任何两个字节到达的时间间隔小 于lOOms,都被认为是属于同一帧数据,在与单片机协同工 作时,要特别注意这个问题。 另外,Spcomm的默认属性设置是支持软件流控制的, 49--—-—
学术探讨袄件设计 用于流控制的字符是13H(XoffChar)) ̄l 1 1H(XonChar),当以 二进制方式发送数据时,必须要禁用Spcomm对于软件流控 制的支持,否则,在数据帧中出现的13H,11H会被Spcomm 作为控制字符而加以忽略。 3.结束语 邮电出版社.2004 [31张宏林Delphi 7程序设计与开发技术大全【M]北京:人民邮电 出版社.2004 [4】刘宗键Delphi 7程序设计入门[M】.天津:天津电子出版社,20()3 【5J刘斌,李文革Delphi 7高级教程[M]北京:清华大学出版社, 2004 实践证明,利用Spcomm串行通信控件在Delphi7.0中 开发串口通信程序,具有灵活、方便、高效的特点。 【6】彭明明,程文刚Delphi实用编程100例【M】北京:中国铁道出 版社.2()04 [7]杨长春Delphi程序设计教程[M]北京:清华大学出版社,20(}5 参考文献: 【l1李军Delphi 7项目开发实 ̄K[Ml北京:中国铁道出版社,2003. 【2 J赵兰涛苏彦华Delphi串口通信技术与工程实践【M].北京:人民 [8]康祥顺Delphi案例开发集锦【MJ北京:电子X-,.1k出版社,2()()5 【91刘山,赵辉Delphi系统开发实例精粹【M]北京:人民邮电出版 社.2005 Design and Implementation of Delphi Serial Communication Program Fu Hongwei (Xianhe Fire Science and Technology Engineering Company Limited,Hefei 230000,Anhui) 【Al 】The paper explains the design and implementation of Delphi serial communication program,uses Delphi programming and object—oriented programming method to simulate a data generator,implements the system interface using the Delphi VCL,and uses Spcomm to send the real-time data.By setting attirbutes and buffer of the Spcomm control,the computer can control the serial port to send data. 【l【I 哪出】Delphi;serial port communication;control (上接第46页) title(’X 2/a 2一y^2/b 2=z’1: 参考文献: 【1】度巍 空间解析几何中二次曲面截痕法的动画演示U] 电脑 知识与技术,2011,(9)6297—9301 4.结束语 从上面的分析可以看到借助于MATLAB可以容易地实 现空间解析几何二次曲面伸缩法的设计和演示,从而直观 的、立体的和运动的揭示二次曲面的图像特征和方程之问 [2】李锐现代教育技术与空间解析几何教学整合的研究[Jl 中 国电力教育,2010(34)91 [3]林海涛,林海如常用软件在空间解析几何教学中的实践U J 的对应关系。这使得空间解析几何的教学增加了趣味性和 生动性,也使空间解析几何课程的学习变得易于理解和巩 固。 广东轻工职业技术学院学报2010,(9)33—36 【4】苏金明 MATLAB实用指南【M] 电子工业2002 [5】同济大学数学系 高等数学IM].高等教育出版社2007. Design and Implementation of Matlab for Quadric Surface Expansion and Contraction Method in Space Analytic Geometry CuiQiuzhen 【LuoyangListitute ofScience andTechnology,Luoyang471023,Henan) 【 n晓】 In this paper,we implement the design and demonstration of quadric surface expansion and contraction method in space analytic geometry using matlab,trying to reveal the corresponding relation about image characteristics and equation from the intuitive and stereo and motion view. 【 】space analtyic geomety;quadrric surface Matlab
版权声明:本文标题:Delphi串口通信程序设计与实现 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1702743239h428993.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论