delphi7串口通信(spcomm控件)实例

合集下载

DELPHI7.0及其串口通信

DELPHI7.0及其串口通信

Delphi7.0及其串口通信2.1Delphi7.0简介2.1.1Delphi7.0基本界面Delphi是由Borland公司于1995年推出的快速应用软件开发工具RAD (Rapid Application Development)。

Delphi使用了当今世界上比较先进的很多程序开发思想,使用Delphi开发软件无疑会大大提高软件开发的效率。

本文以Delphi7.0作为平台,进行软件开发。

Delphi7.0打开的主界面如图2.1所示。

图2.1Delphi7.0主界面2.1.2Delphi7.0的特点和优点Delphi7.0是Windows系统下的具有功能强大、简便易用和代码执行速度快等优点的可视化集成开发工具,它提供了强大的可视化组件VCL(Visual Component Library)功能,使程序员可以快速高效的开发出Windows系统下的应用程序。

和其他软件开发工具相比,Delphi在网络编程、数据库编程、程序界面方面更胜一筹,而且增加了对Linux平台下应用程序开发的更强大支持。

而且它在构架企业信息系统方面也发挥着越来越重要的作用,因此许多程序员愿意选择Delphi作为开发工具编制各种应用程序[2]。

(1)可视化的集成开发环境Delphi提供了可视化的集成开发环境IDE(Integrated Development Environment)。

可视化环境是指用户在设计程序界面的时候,无须为程序界面编写代码,只需将相应的组件添加到窗体上,调节其大小和位置即可,Delphi会自动生成相应的代码。

Delphi的集成开发环境不仅可以非常方便的设计出用户的程序界面,而且程序的界面设计、属性设计、代码编写、程序调试、运行、生成可执行文件等操作都可以在这个集成开发环境中进行,使得软件设计变得非常的快捷、高效。

(2)真正的面向对象面向对象的程序设计OOP(Object Oriented Programming)是Delphi诞生的基础。

基于DELPHI实现PC机与PLC的串行通讯

基于DELPHI实现PC机与PLC的串行通讯

基于DELPHI实现PC机与PLC的串行通讯未知来源供稿2004-4-229:49:00【字体:大中小】1引言DELPHI因为它的编程相对较简单、功能又很强大,应用程序开发周期较短、运行速度快等特点,目前被广泛应用于监控系统中,而在监控系统中,上位机与各控制设备及智能仪表(如: PLC、电力测试仪、温度巡检仪、数字电度表等)的串行通讯又是一个非常重要的环节。

在Windows环境下用Delphi实现串行通信有3种方法:(1)使用VB的通信构件MSComm;(2)调用Windows95下的API函数来完成通信;(3)熟悉C/C++或其它语言的用户可以将自己的程序编译链接为DLL(动态链接库),这样D elphi就可以调用DLL里的函数来通信。

其中最容易方法是用VB的通信构件MSComm进行编程。

在使用VB构件之前,首先要将VB构件文件MSComm32.OCX安装到Delphi的动态构件库中。

打开主菜单Component选择Import ActiveX Control...项,在弹出的对话框里选中Microsoft Comm Control6.0(安装VB6.0后必有此项),再单击Install按钮。

此时Delphi 载入VB构件文件并重新编译DCL(Delphi Component Library)。

编译完成后,MSComm 的小按钮出现在ActiveX页中,这时程序就可以使用此构件了。

应该注意的是,安装前要确保VB通信构件的控制文件MSComm32.OCX在编译DCL之前已在\Windows\Syste m下。

下面就以KOYO的SU-6系列PLC为例,全面介绍用DELPHI实现与PLC串行通讯的整个过程。

2三线制串行通讯线的制作上位机(PC机)的通讯一般采用9针串口,SU-6系列PLC选用通讯模块U-01DM,该模块的通讯用串行插座为25针,内含一个RS-232C接口和一个RS422接口,这里由于上位机与PLC在同一盘柜内,所以直接采用RS-232C进行通讯(最大传输距离为15m),三线制连接方式如图1所示。

Delphi+SPComm实现串口通信

Delphi+SPComm实现串口通信

Delphi+SPComm实现串口通信
王时绘;朱荣钊
【期刊名称】《现代计算机(专业版)》
【年(卷),期】2007(000)008
【摘要】串口已成为计算机的标准接口,这种通信方式得到了广泛的应用.介绍单片机与PC间串口通信的基本原理,以及在Delphi开发环境下如何利用SPComm控件实现PC与单片机之间的串口通信.
【总页数】3页(P135-137)
【作者】王时绘;朱荣钊
【作者单位】湖北大学数学与计算机学院,武汉,430062;湖北大学数学与计算机学院,武汉,430062
【正文语种】中文
【中图分类】TP3
【相关文献】
1.网络化制造的串口通信技术研究——VC6.0下实现串口通信的方法 [J], 莫进军
2.Delphi+SPCOMM控件实现串口通信 [J], 陈增发;严锋
3.PLC与单片机串口通信的实现探讨 [J], 雷娟娟
4.基于EM9000工控板高性能双串口通信模型设计与实现 [J], 刘刚
5.基于LabVIEW下PC机与PC机虚拟串口通信的设计与实现 [J], 潘锋
因版权原因,仅展示原文概要,查看原文内容请购买。

win7系统delphi7和delphi2010下安装spcomm串口控件(1)(1)

win7系统delphi7和delphi2010下安装spcomm串口控件(1)(1)

一、delphi 7下,spcomm控件的安装。

二、在DELPHI 2010 中安装SPCOMM。

自己在网上找了很久,也没找,好不容易弄出来了,把过程发到网上,希望对大家有所帮助。

先点击file->new->package-delphi
在右侧找到CONTAINS选项
右击出现菜单,选择ADD
在出现的对话框中找到SPCOMM.PAS文件,选中并打开
点击打开后,出现如图所示画面,(由于每个人存放SPCOMM.PAS文件的路径不同,出现的画面也有所不同),在PACKAGE1.BPL上右击
出现快捷菜单
在INSTALL上单击。

出现下面画面,这时什么也不要做
很快编辑完成,出现如下图:
点击两次OK完成安装。

以后在用的时候就会在SYSTEM的面板中找到它,就和使用其它元件一样使用它了。

找到它的方法:
看见了吗,就在这里,呵呵。

delphi7串口通信(spcomm控件)实例

delphi7串口通信(spcomm控件)实例

Delphi7串口通信(spcomm控件)实例最近在用delphi7做串口通信,网上找了很多例程,复制粘贴运行就没有能通过的,再次鄙视一下列位先行者,你们帮人倒是帮到底啊,没一个是拿过来能用的,太坑了,在N天的努力下(鄙人比较笨)终于通过串口接收到数据,希望给后来人予以帮助,程序如下:功能简介功能比较简单,只是从串口接收单片机发送的数据,给memo1unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes,Graphics, Controls, Forms,Dialogs, SPComm, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;Comm1: TComm;Memo1: TMemo;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);procedure Comm1ModemStateChange(Sender: TObject; ModemEvent: Cardinal);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;viewstring:string;i:integer;rbuf,sbuf:array[1..16] of byte;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);beginComm1.OnReceiveData:=Comm1ReceiveData;comm1.StartComm;end;//打开串口procedure TForm1.Button2Click(Sender: TObject);begincomm1.StopComm;end;//关闭串口procedure m1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);vari:integer;beginviewstring:='' ;move(buffer^,pchar(@rbuf)^,bufferlength);for i:=1 to bufferlength doviewstring:=viewstring+ inttohex(rbuf[i],2)+'' ;viewstring:='接收'+ viewstring;memo1.lines.add(viewstring);memo1.lines.add('');end;//接收数据procedure m1ModemStateChange(Sender: TObject;ModemEvent: Cardinal);beginend;end.运行测试,顺利通过,接收到单片机发送的数据,感谢百度好友的帮助。

Delphi下用SPCOMM对Modbus编程

Delphi下用SPCOMM对Modbus编程

Delphi下用SPCOMM对Modbus编程一、流程主体流程与普通的串口编程一样。

二、ModbusModbus普通串口不致的地方就是发送与返回的数据除遵循串口本身要求外,还有格式要求。

这里以读多位bit为例,其它的读者可查询Modbu功能码文档。

01功能码,读取多个线圈(位,bit),命令为16进制发送命令:01 01 48 00 00 10 2A 66返回命令: 01 01 02 FF 03 B8 0D三、例程例:串口SPCOMM控件名为:SPCOMM1;发送时钟名为:TimerCom;(1)控件属性设置mName := 'COM1'; //串中号表示 COM1、COM2等串口的名字SPCOMM1.BaudRate := 9600; //波特率根据实际需要设定的波特率,在串口打开后也可更改此值,实际波特率随之更改SPCOMM1.ParityCheck := False;//表示是否需要奇偶校验;SPCOMM1.Parity := None; //没有奇偶校验位; 奇偶校验位;SPCOMM1.ReadIntervalTimeOut:= 40; //信息发送后,40毫秒内返回的数据都算作一次返回。

注意要比发送间隔小。

TimerCom.Interval := 50 //时钟刷新间隔 TimerCom.Interval >SPCOMM1.ReadIntervalTimeOut(2)打开串口SPCOMM1.StopComm; //先关闭串口SPCOMM1.StartComm; //打开串口(3)形成发送命令CRCParityCheck16为对发送命令进行CRC校验,这里就不写了。

varbufByte:array[0..50000] of Byte;bufComReadChar :array[0..50000] of chari,nComReadLength:Integer;nCRC:Word;strSend:string;FnCRCFunt,FnCRCStart:Cardinal;//校验多项式,校验初始值 ]begin//先将数据形成16进制字符组成的字符串,然后再来校验发送strSend := '';strSend := IntToHex(1,2); //第1字节机组号strSend := strSend + '01'; //modbus 功能码01 读多个位操作strSend := strSend + IntToHex(StrToInt('$4800',4); //起始地址3、4字节strSend := strSend + IntToHex(16,4); //位总数, 5、6字节for i := 0 to 5 dobeginbufByte[i] := StrToInt('$' + copy(strSend,i*2+1,2));end;nCRC:=CRCParityCheck16(FnCRCStart ,FnCRCFunt,bufByte,6);strSend := strSend + IntToHex(nCRC,4);for i:=0 to 7 dobufComReadChar:=char(strtoint('$'+copy(strSend,i*2+1,2)));nComReadLength := 8;SPCOMM1.WriteCommData(bufComReadChar,nComReadLe ngth); //发送命令,参数:命令,命令长度end;(4)接受返回命令并解析SPCOMM1ReceiveData(Sender: TObject;Buffer: Pointer; BufferLength: Word);vari:integer;rbuf:array [1..1000] of byte ;begin//接收到数据,进行解析move(Buffer^,(pchar(@rbuf))^,BufferLength);for i := 1 to BufferLength dobeginstrTemp := strTemp + IntToHex(rbuf[i],2) + ' ';end;end;。

Delphi编写串口通讯方法(转)

Delphi编写串口通讯方法(转)

Delphi编写串⼝通讯⽅法(转)前段时间做了个东西,计算机和单⽚机通讯,⽤到了串⼝编程,上位机⽤的是delphi,下位机⽤ats51,程序也做完了,顺便把Delphi串⼝编程给⼤家介绍以下.Delphi串⼝通讯可以同过以下⼏种⽅式:1.windows API函数。

2.Spocmm组件。

3.PComm库函数。

4.Mscomm控件。

1.windows API函数。

由于API函数实现起来⽐较⿇繁,这⾥就不做介绍了,主要介绍其它三种⽅式 .第三⽅组件或控件封装了API函数,简化了编程的难度,并提供详细帮助。

2.Spocmm组件。

SPcomm是专为delphi开发的组件,虽然它也是封装了windows api,但是我们可以看到它的源代码。

它提供了事件驱动的⽅式接收数据,在编程的时候,我们可以在OnReceiveData函数中接收到数据,并做相应的处理,SPcomm组件的主要属性:CommName:设置通讯端⼝BaudRate:设置端⼝波特率StartComm:打开串⼝StopComm:关闭串⼝WriteCommData:向串⼝写数据函数OnReceiveData:接收数据事件3.PComm库函数。

PComm库函数PComm 库函数是台湾MOXA公司提供的,他为⽤户提供了基于win32 api的开发接⼝。

PComm库函数分为7⼤类控制函数数据输⼊函数数据输出函数状态函数事件驱动函数传输⽂件函数特殊设定函数控制函数主要包括sio_open,sio_close,sio_ioct,sio_flushsio_open(PortNum) 打开串⼝sio_close(PortNum) 关闭串⼝sio_ioct(PortNum, baud, mode)设置串⼝的⼯作模式,包括 波特率,数据位,停⽌位,效验等sio_flush(portNum,func)清除发送,接收缓冲区 其中func 为0清空输⼊ ,为1清空输出,为2清空输⼊输出数据输⼊函数主要包括sio_getch,sio_readsio_getch(PortNum) 从输⼊缓冲区读⼀个字符sio_read(PortNum,buf,len)从输⼊缓冲区读指定个数的字符数据输⼊函数主要包括sio_putch sio_writesio_putch(PortNum) 写⼀个字符到输出缓冲区sio_write(PortNum,buf,len)写指定个数的字符到输出缓冲区状态函数主要包括 sio_lstatus,sio_getbaud,sio_getmodesio_lstatus(portNum)获取串⼝的CTS,DSR,DCD,RI线的状态sio_getbaud(portNum)获取串⼝的波特率sio_getmode(portNum)获取串⼝的⼯作模式。

SPCOMM控件在Delphi串口通信中的应用

SPCOMM控件在Delphi串口通信中的应用

SPCOMM控件在Delphi串口通信中的应用-南山古桃-关键词:Delphi,串口通信,Spcomm控件2008年03月10日星期一下午 01:03关键词:Delphi,串口通信,Spcomm控件摘要:利用Delphi开发工业控制系统软件成为越来越多的开发人员的选择,而串口通信是这个过程中必须解决的问题之一。

本文在对几种常用串口通信方法分析比较的基础上,着重讨论了Delphi开发环境下利用Spcomm控件实现PC机与单片机之间串口通信的方法,研究了Spcomm串口通信的关键技术问题,并通过一个实例给出了Spcomm控件在Delphi7.0串口通信中的应用。

关键词:串口通信;Delphi7.0;Spcomm控件**** 本文出处:南山古桃(nsgtao)的百度空间:/nsgtao/ ****1 引言目前, 随着现代信息技术的发展,计算机串口通信技术已日趋成熟。

由于微机性能价格比高、分析处理能力强、处理速度快以及单片机抗干扰能力强、使用灵活等特点,利用PC机作为上位机,单片机作为下位机的主从工作方式在工业控制领域中被广泛采用。

PC机与下位机的通信可以采用高级语言编程实现,如Delphi、VC等。

Delphi 是新一代面向对象的可视化开发工具,它具有功能强大、简便易用和代码执行速度快等特点,越来越在构架企业信息系统方面发挥着重要作用。

由于Delphi 这些显著特点,利用Delphi开发工业控制系统软件成为越来越多的开发人员的选择,而实现系统监测控制和信息处理的关键是解决PC机与单片机之间的串口通信问题。

2.Spcomm串口通信组件简介**** 本文出处:南山古桃(nsgtao)的百度空间:/nsgtao/ ****用Delphi 实现串口通信,常用的方法有:使用控件,如Mscomm和Spcomm控件等;使用API函数;在Delphi 中调用其它串口通信程序[1]。

使用API方法的优点是比较适合于编写较为复杂的低层次通信程序,但缺点是编写串口通信程序较为复杂,需要掌握大量通信知识。

Delphi7.0及其串口通信

Delphi7.0及其串口通信

Delphi7.0及其串口通信2.1 Delphi7.0简介2.1.1Delphi7.0基本界面Delphi是由Borland公司于1995年推出的快速应用软件开发工具RAD (Rapid Application Development)。

Delphi使用了当今世界上比较先进的很多程序开发思想,使用Delphi开发软件无疑会大大提高软件开发的效率。

本文以Delphi7.0作为平台,进行软件开发。

Delphi7.0打开的主界面如图2.1所示。

图2.1 Delphi7.0主界面2.1.2Delphi7.0的特点和优点Delphi7.0是Windows系统下的具有功能强大、简便易用和代码执行速度快等优点的可视化集成开发工具,它提供了强大的可视化组件VCL(Visual Component Library)功能,使程序员可以快速高效的开发出Windows系统下的应用程序。

和其他软件开发工具相比,Delphi在网络编程、数据库编程、程序界面方面更胜一筹,而且增加了对Linux平台下应用程序开发的更强大支持。

而且它在构架企业信息系统方面也发挥着越来越重要的作用,因此许多程序员愿意选择Delphi作为开发工具编制各种应用程序[2]。

(1)可视化的集成开发环境Delphi提供了可视化的集成开发环境IDE(Integrated Development Environment)。

可视化环境是指用户在设计程序界面的时候,无须为程序界面编写代码,只需将相应的组件添加到窗体上,调节其大小和位置即可,Delphi会自动生成相应的代码。

Delphi的集成开发环境不仅可以非常方便的设计出用户的程序界面,而且程序的界面设计、属性设计、代码编写、程序调试、运行、生成可执行文件等操作都可以在这个集成开发环境中进行,使得软件设计变得非常的快捷、高效。

(2)真正的面向对象面向对象的程序设计OOP(Object Oriented Programming)是Delphi诞生的基础。

DELPHI SPCOMM 串口超时参数设置

DELPHI SPCOMM 串口超时参数设置

Delphi 7 Spcomm插拔串口后,不传数据,必需开关软件后才可正常传输问题的解决办法办法如下:如果ReadIntervalTimeout设置为相应数值,ReadTotalTimeoutMultiplier设置为零,就可以避免插拔后数据不能正常传输原因如下:Spcomm属性含意如果想读写可靠,要根据不同的速率和应用实际情况设置合适的值。

和同步模式和异步模式、不同的通信协议无关。

COMMTIMEOUTS:COMMTIMEOUTS主要用于串口超时参数设置。

COMMTIMEOUTS结构如下:typedef struct _COMMTIMEOUTS {DWORD ReadIntervalTimeout;DWORD ReadTotalTimeoutMultiplier;DWORD ReadTotalTimeoutConstant;DWORD WriteTotalTimeoutMultiplier;DWORD WriteTotalTimeoutConstant;} COMMTIMEOUTS,*LPCOMMTIMEOUTS;1 ReadIntervalTimeout:两字符之间最大的延时注:当读取串口数据时,一旦两个字符传输的时间差超过该时间,读取函数将返回现有的数据。

设置为0表示该参数不起作用。

指定时间最大值(毫秒),充许接收的2个字节间有时间差。

也就是说,刚接收了一个字节后,等了ReadIntervalTimeout 时间后还没有新的字节到达,就认为本次读串口操作结束(后面的字节等下一次读取操作来处理)。

即使你想读8个字节,但读第2个字节后,过了ReadIntervalTimeout时间后,第3个字节还没到。

实际上就只读了2个字节。

2 ReadTotalTimeoutMultiplier:指定比例因子(毫秒),实际上是设置读取一个字节和等待下一个字节所需的时间,这样总的超时时间为读取的字节数乘以该值,同样一次读取操作到达这个时间后,也认为本次读操作己经结束。

Delphi串口数据传输

Delphi串口数据传输

Delphi实例分析:串口数据传输2008-02-22 11:11 作者:chen 来源:eNet硅谷动力串口是计算机的标准接口,现在的计算机一般至少有两个串口即COM1和COM2。

计算机针对串口的应用相当广泛,如:数据通信、计算机网络、及分布式工业控制系统等都经常采用串口通信来交换数据和信息。

如果想将一台计算机上的一些数据传送到另一台计算机上,且两台计算机都没有安装网卡,那么该如何实现两台计算机之间的相互通信呢?目前,利用 Delphi实现串口通信的常用的方法一共有3种:第一是利用串口通信控件,例如 MSComm控件和 SPComm控件;第二是使用 API函数;第三则是调用其他串口通信程序。

其中利用 API编写串口通信程序非常复杂,并且需要掌握大量的通信知识。

相比较而言,利用 MSComm控件则相对较简单,并且该控件具有丰富的与串口通信密切相关的属性及事件,提供了对串口的各种操作。

MSComm控件属于ActiveX控件,在非VB编程环境中使用MSComm控件,将MSComm控件向窗口创建时有时会出现提示找不到的情况,即没有该控件注册码的问题.最简单的方法是安装VB,并在安装VB时选择安装ActiveX,完成后即可解决该问题。

但有时因条件不允许使用上述的方法,只能通过如下方法进行注册:1.从VB安装目录下找到Mscomm32.ocx、MSCOMM32.DEP、MSCOMM.SRG三个文件,并将其拷贝到系统目录下。

2.执行Rsgsvr32.exe mscomm32.ocx注册一下。

3.运行RegEdit.Exe,打开系统注册表在HKEY_CLASSES_ROOT\Licenses,并在其下添加主键4250E830-6AC2-11cf-8ADB-00AA00C00905,并将其默认值设置为为kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun完成注册即可解决注册码的问题。

然后进入Delphi环境中,选择菜单命令:Component->Import ActiveX Control,在列表中可以看到Microsoft Comm Control,version 6.0, 选中后点击Install按钮,就完成安装。

SPCOMM控件在Delphi串口通信中的应用

SPCOMM控件在Delphi串口通信中的应用

SPCOMM控件在Delphi串口通信中的应用2008年03月10日星期一下午01:03关键词:Delphi,串口通信,Spcomm控件目前, 随着现代信息技术的进展,运算机串口通信技术已日趋成熟。

由于微机性能价格比高、分析处理能力强、处理速度快以及单片机抗干扰能力强、使用灵活等特点,利用PC机作为上位机,单片机作为下位机的主从工作方式在工业操纵领域中被广泛采纳。

PC机与下位机的通信能够采纳高级语言编程实现,如Delphi、VC等。

Delphi 是新一代面向对象的可视化开发工具,它具有功能强大、简便易用和代码执行速度快等特点,越来越在构架企业信息系统方面发挥着重要作用。

由于Delphi 这些明显特点,利用Delphi 开发工业操纵系统软件成为越来越多的开发人员的选择,而实现系统监测操纵和信息处理的关键是解决PC机与单片机之间的串口通信咨询题。

Spcomm共实现了三个类:串口类Tcomm、读线程类TreadThread以及写线程类TwziteThread[1]。

Tcomm的某个实例在方法StartComm中打开串口,并实例化了一个读线程ReadThread和一个写线程WriteThread,它们和主线程之间进行消息的传递,实现串口通信。

在Delphi7.0中安装Spcomm串口通信控件的方法为:选择Delphi7.0的“Component”菜单,点击“Install Component...”菜单项,然后在弹出的Into existing package 属性页中Unit file name输人框中选择SPCOMM.pas文件,单击两次“OK”按钮后,就能够将Spcomm控件安装到Delphi7.0的System组件页上。

3 Spcomm控件串口通信的实现CommName属性:运算机串口端口号的名字,COM1、COM2……等,在打开串口前,必须填写好此值。

Parity属性:校验位 None、Odd、Even、Mark、Space等。

在delphi7中利用mscomm控件编程

在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文件。

tcomm实现串行通信

tcomm实现串行通信

Delphi环境下利用TComm组件实现串行通信Posted on 2008-10-22 15:48 淡竹叶阅读(1663) 评论(0) 编辑收藏摘要:利用Delphi开发工业控制系统软件成为越来越多的开发人员的选择,而串口通信是这个过程中必须解决的问题之一。

本文在对几种常用串口通信方法分析比较的基础上,着重讨论了Delphi开发环境下利用Spcomm控件实现PC机与单片机之间串口通信的方法,研究了Spcomm串口通信的关键技术问题,并通过一个实例给出了Spcomm控件在Delphi7.0串口通信中的应用。

1 引言目前, 随着现代信息技术的发展,计算机串口通信技术已日趋成熟。

由于微机性能价格比高、分析处理能力强、处理速度快以及单片机抗干扰能力强、使用灵活等特点,利用PC机作为上位机,单片机作为下位机的主从工作方式在工业控制领域中被广泛采用。

无忧S3C2410 ARM9开发板S3C44B0 ARM7 开发板350元单片机开发系统498元无忧单片机实验开发板238元PC机与下位机的通信可以采用高级语言编程实现,如Delphi、VC等。

Delphi 是新一代面向对象的可视化开发工具,它具有功能强大、简便易用和代码执行速度快等特点,越来越在构架企业信息系统方面发挥着重要作用。

由于Delphi 这些显著特点,利用Delphi开发工业控制系统软件成为越来越多的开发人员的选择,而实现系统监测控制和信息处理的关键是解决PC机与单片机之间的串口通信问题。

2〃Spcomm串口通信组件简介用Delphi 实现串口通信,常用的方法有:使用控件,如Mscomm和Spcomm控件等;使用API函数;在Delphi 中调用其它串口通信程序[1]。

使用API方法的优点是比较适合于编写较为复杂的低层次通信程序,但缺点是编写串口通信程序较为复杂,需要掌握大量通信知识。

Spcomm是Small-Pig Team开发的一个第三方Delphi串口控件[2],该控件具有丰富的与串口通信密切相关的属性及事件,提供了对串口的各种操作,且编程简单、通用性强、可移植性好。

Delphi中使用串口控件MSComm的0字符接收例程祥解

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

利用DELPHI多线程机制实现PC机与PLC之间的串行通信

利用DELPHI多线程机制实现PC机与PLC之间的串行通信

利用DELPHI多线程机制实现PC机与PLC之间的串行通信在Delphi中实现PC机与PLC之间的串行通信可以利用Delphi的多线程机制来实现。

下面将介绍详细的步骤。

2. 将TIdSerialPort组件添加到窗体上。

TIdSerialPort是Delphi 中处理串行通信的组件,可以通过Indy控件库进行获取和使用。

3. 在窗体上添加一个Label控件,用于显示接收到的数据。

4. 在窗体上添加一个Edit控件,用于输入要发送的数据。

5. 添加一个Button控件,用于发送数据。

6. 双击Button控件,在OnClick事件中添加以下代码:```delphiprocedure TForm1.Button1Click(Sender: TObject);vardata: string;begindata := Edit1.Text;TThread.CreateAnonymousThreadprocedurebeginIdSerialPort1.WriteLn(data);.Startend;```上述代码创建了一个匿名线程,在线程中使用IdSerialPort1.WriteLn方法向串口发送数据。

7. 双击TIdSerialPort1的OnRxChar事件,在事件处理程序中添加以下代码:```delphiprocedure TForm1.IdSerialPort1RxChar(Sender: TObject; Count: Integer);vardata: string;begindata := IdSerialPort1.ReadLn;TThread.Queue(nil,procedurebeginLabel1.Caption := data;end```上述代码在串口接收到数据时,使用IdSerialPort1.ReadLn方法将接收到的数据读取到data变量中,并使用TThread.Queue方法将显示更新的代码放到主线程中执行,以避免主线程阻塞。

Delphi环境下基于SPCOMM串口开发通讯报文字节丢失的问题解决

Delphi环境下基于SPCOMM串口开发通讯报文字节丢失的问题解决

在Delphi环境下基于SPCOMM控件开发串口通讯报文字节丢失的问题解决最近做的工具需要实现串口转UDP中间件,中间件与下位机通过RS232通讯,与接收服务器通过UDP通讯。

在传输过程中出现问题如下:1. 通过PC机安装的虚拟串口进行调试,接收程序完全正常。

2.与下位机进行通讯测试,常规短报文接收都完全正常,但是在传输图片分包文件(包总长度:545)时出现报文内部分字节丢失的问题。

经过不断测试,发现:1. 下位机发送的报文长度为545,无异常;2. 串口转UDP转发过程完全正常;3.中间件的串口接收出现问题,原本545的报文接收到后会变成540、542、543等,总会丢失几个字节;折腾了一天终于找到原因,是由于在Delphi下使用的SPCOMM组件默认开启了Inx_XonXofFflow、TxContinueOnXOff、Outx_XonXoffFlow三个属性。

将这三个属性值设置为FALSE后测试,报文接收正常,转发也正常,问题解决。

经过查找相关资料,对该三个属性的解释如下(以下内容转载自/jinshaopu/article/details/4646791):SPComm的一点小诀窍 spcomm的问题导致数据丢失最近几天完成了BiasDAC的程序编写。

调试的过程还算比较顺利,除了几个有点bt的小问题。

其中一个困扰了我两三天的时间,今天上午终于将其解决。

由于BiasDAC是用RS232 Serial Port通信的,延用之前的程序,使用了Delphi的SPComm 控件。

在之前的使用中,SPComm控件一直工作正常,使用的是一般的string进行消息的传递。

而BiasDAC由于通信协议的限制,消息的发送使用的是hex方式,会用到从0x00到0xFF所有的这些字符。

在调试中发现,发送0x11和0x13之后,SPComm的工作就会不正常。

首先是0x11发送之后,返回的0x11消息会被忽略;其次0x13发送之后,只能返回很有限的消息,而且似乎Serial Port就此关闭,如果再发送消息,就会造成Serial Port失去响应,只能通过重新启动计算机才能恢复。

Delphi使用spcomm实现串口通信基础知识及(两个实例)

Delphi使用spcomm实现串口通信基础知识及(两个实例)

Delphi使⽤spcomm实现串⼝通信基础知识及(两个实例)⼼得如果你已经会使⽤SPCOMM且出现10个以上的串⼝问题请改⼀下串⼝名mName='\\.\com18';就这样加'\\.\'就⾏了我也不知道什么回事.......以下为抄录不知道是谁的Delphi 是新⼀代可视化开发⼯具,它具有功能强⼤、简便易⽤和代码执⾏速度快等特点,是全球公认的快速应⽤开发⼯具技术的先驱者,它越来越在构架企业信息系统⽅⾯发挥着重要作⽤。

由于Delphi 这些显著特点,许多程序员选择Delphi作为开发⼯具编制各种应⽤程序。

但是,令⼈惋惜的是Delphi没有⾃带串⼝通讯的控件,在它的帮助⽂档⾥也没有提及串⼝通讯,这就给编制通讯程序的开发⼈员带来众多⿇烦,影响了开发进度,下⾯就这⼀技术进⾏讨论。

⽤Delphi 实现串⼝通讯,常⽤的⼏种⽅法为:使⽤控件如MSCOMM和SPCOMM,使⽤API函数或者在Delphi 中调⽤其它串⼝通讯程序。

利⽤API编写串⼝通信程序较为复杂,需要掌握⼤量通信知识,其优点是可实现的功能更强⼤,应⽤⾯更⼴泛,更适合于编写较为复杂的低层次通信程序。

相⽐较⽽⾔,利⽤SPComm控件则相对较简单,该控件具有丰富的与串⼝通信密切相关的属性及事件,提供了对串⼝的各种操作。

使⽤控件这⼀⽅法容易掌握,⽽SPCOMM⽀持多线程,所以SPCOMM 控件的应⽤更加⼴泛。

结合实例详细介绍SPCOMM的使⽤。

⼀.SPCOMM控件的安装1.选择下拉菜单Component的第⼆项Install Component 。

在Unit file name 处填写控件SPCOMM控件所在路径,其它可⽤默认值,点击OK按纽。

2.安装成功后,system控件⾯板中将出现⼀个红⾊控件COMM。

现在使⽤COMM控件可以象Delphi⾃带控件⼀样使⽤.。

⼆.SPCOMM的主要属性,⽅法和事件1.属性CommName:填写COM1,COM2…等串⼝的名字,在打开串⼝前,必须填写好此值。

Delphi环境下利用SPComm控件实现计算机与PLC的串行通信

Delphi环境下利用SPComm控件实现计算机与PLC的串行通信

Delphi环境下利用SPComm控件实现计算机与PLC的串行
通信
罗贤东;张民;赵卫华;张雅娟
【期刊名称】《工业控制计算机》
【年(卷),期】2007(20)6
【摘要】首先概述了Delphi环境下实现串行通信的几种方法,接着介绍了SPComm控件的特性并详述了如何使用SPComm控件实现计算机与PLC之间的串行通信,最后给出了通信实例.
【总页数】2页(P29-30)
【作者】罗贤东;张民;赵卫华;张雅娟
【作者单位】青岛理工大学计算机工程学院,山东,青岛,266033;青岛理工大学自动化工程学院,山东,青岛,266033;青岛理工大学计算机工程学院,山东,青岛,266033;南京消防器材股份有限公司青岛分公司,山东,青岛,266071
【正文语种】中文
【中图分类】TP3
【相关文献】
1.基于SPComm控件的上位机与FX2N型PLC串行通信的实现 [J], 许智榜
2.在Delphi编程环境下实现上位机与PLC的串行通信 [J], 张发忠;李晓明
3.Delphi环境下利用SPComm控件进行单片机串口通信 [J], 桑开勇;陈铁军
4.利用VB的MSComm控件实现计算机与PLC的串行通信 [J], 宋国杰
5.基于VB通信控件MSComm实现计算机与欧姆龙PLC串行通信编程的研究与应用 [J], 张红军;韦晓明;苏锐生
因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Delphi7串口通信(spcomm控件)实例
最近在用delphi7做串口通信,网上找了很多例程,复制粘贴运行就没有能通过的,再次鄙视一下列位先行者,你们帮人倒是帮到底啊,没一个是拿过来能用的,太坑了,在N天的努力下(鄙人比较笨)终于通过串口接收到数据,希望给后来人予以帮助,程序如下:
功能简介
功能比较简单,只是从串口接收单片机发送的数据,给memo1
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,
Dialogs, SPComm, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Comm1: TComm;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
procedure Comm1ModemStateChange(Sender: TObject; ModemEvent: Cardinal);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
viewstring:string;
i:integer;
rbuf,sbuf:array[1..16] of byte;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Comm1.OnReceiveData:=Comm1ReceiveData;
comm1.StartComm;
end;
//打开串口
procedure TForm1.Button2Click(Sender: TObject);
begin
comm1.StopComm;
end;
//关闭串口
procedure m1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
var
i:integer;
begin
viewstring:='' ;
move(buffer^,pchar(@rbuf)^,bufferlength);
for i:=1 to bufferlength do
viewstring:=viewstring+ inttohex(rbuf[i],2)+'' ;
viewstring:='接收'+ viewstring;
memo1.lines.add(viewstring);
memo1.lines.add('');
end;
//接收数据
procedure m1ModemStateChange(Sender: TObject;
ModemEvent: Cardinal);
begin
end;
end.
运行测试,顺利通过,接收到单片机发送的数据,感谢百度好友的帮助。

(注:可编辑下载,若有不当之处,请指正,谢谢!)。

相关文档
最新文档