Delphi_SPCOMM控件实现串口通信

合集下载

Delphi 串口 通信 编程 共97页PPT资料

Delphi 串口 通信 编程 共97页PPT资料
7位:ASCII码,每个字节留一个备用位 8位:前128个遵循ASCII码规则,其余的
128个用来做扩展字符、数字符号、图形 字符等编码。
非文本编码
某些可执行指令文件和图形图像文件就是 以二进制形式而不是ASCII码形式存储的。 一个数据可用二进制形式存储,可以占多 个字节。 在通信领域,常常把这种类型的资料叫做 二进制数据。
数据终端DTE的控制软件持续监视振铃指示RI,等待该 信号有效
响铃后, RI信号在ON和OFF状态之间交替变化。 DTE的通信控制软件在检测到振铃指示后,开始通过计
算机振铃指示的ON和OFF状态的变化次数来进行计数。 当达到程序设计的次数时,控制软件发出终端就绪信号 (DTR)有效,使Modem进行摘机状态,开始应答电话 Modem在等待一小段时间后,自动地发送它的应答载波 信号。同时Modem发出数据设备就绪信号(DSR),通 知DTE已经完成所有准备工作,正在等待对方的载波信 号
RS-232串行通信
RS-232的通信端口是每台计算机上的必要配置, 通常含有COM!和COM2两个端口。 计算机上的RS-232均是公头 一般有两种:9引脚和25引脚
RS-485串行通信
RS-485的通信方式可有效地防止噪声信号的干扰。 RS-485的信号将被发送出去时会先分成正负的两条线路,
常用的9条RS-232信号线
引脚 信号名称 1 载波检测 2 接收数据 3 发送数据 4 数据终端就绪 5 信号地 6 数据设备就绪
信号方向 DCE-DTE DCE-DTE DTE-DCE DTE-DCE DCE-DTE
7 请求发送 DTE-DCE
8 清除发送 DCE-DTE
9 振铃指示 DCE-DTE
设备->计算机

Delphi 串口 通信 编程共98页文档

Delphi 串口 通信 编程共98页文档

常用的9条RS-232信号线
引脚 信号名称 1 载波检测 2 接收数据 3 发送数据 4 数据终端就绪 5 信号地 6 数据设备就绪
信号方向 DCE-DTE DCE-DTE DTE-DCE DTE-DCE DCE-DTE
7 请求发送 DTE-DCE
8 清除发送 DCE-DTE
9 振铃指示 DCE-DTE
RS-232串行通信
RS-232的通信端口是每台计算机上的必要配置, 通常含有COM!和COM2两个端口。 计算机上的RS-232均是公头 一般有两种:9引脚和25引脚
RS-485串行通信
RS-485的通信方式可有效地防止噪声信号的干扰。 RS-485的信号将被发送出去时会先分成正负的两条线路,
将数据转换成串行通信有两种方式 同步方式:接收设备能自动与发送计算机同步,接收
字符有规则的分割开来,以块为单位,没有起始位和 停止位,效率高。 异步方式:以字符为传送单位,传送的字符之间有无 规律的间隔,这样可能使接收设备不能正常接收数据, 因为每接收完一个字符都不能确切地知道下一个接收 的字符从何时开始。(通过加开始位和停止位实现) 传输效率低,成本也低。
当到达接收端后,再将信号相减还原来原来的信号; 如果将原始的信号记为(DT),而被分成后的信号分 别记为(D+)及(D-),则原始的信号与离散的信号 在由发送端发送出去时: (DT)= (D+)- (D-) 如果此线路受干扰,则两条传输线上的信号会分别成为 (D+)+Noise及(D-)+Noise (DT)= [(D+) +Noise]- [(D-) +Noise]
DCE准备就绪,可以 接收
RTS(Request to Send)

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中使用ActiveX控件,使用行间汇编,用Delphi调用可执行应用程序三种方法实现串口通信进行了阐述。

不过在Delphi中进行串口编程并不象作者所说的那样令人头疼,我就知道几个很好用的串口程序是用Delphi编写的(我不太会用Delp hi)。

Delphi 是新一代可视化开发工具,它具有功能强大、简便易用和代码执行速度快等特点,D elphi系列开发工具在国际各媒体上曾获得过三十多项大奖,是全球公认的快速应用开发工具技术的先驱者,他越来越在构架企业信息系统方面发挥着重要作用。

它的功能很强大,但在对串口通信的控制上Delphi的帮助文档和其他书籍中很少提及,可这是在开发应用系统时会经常遇到却又令人头痛的事情。

下面介绍三种解决方案,以实现接收和发送数据的功能。

一、使用ActiveX控件由于Delphi中没有串口控件可用,所以首先需要把ActiveX控件MSCOMM加到元件选项板上。

这是一个非常好的控件它不仅能对串口进行操作,而且还可以对Modem进行控制。

下面结合一个具体的实例来说明如何用MSCOMM控件开发出串口通信程序。

创建一个Communication.dpr工程,把窗体的Name属性变为CommForm,将标题改为T he Communication Test,选择File/Save As将新的窗体存储为CommFrm.pas,接下来参照图1和图2将控件添加到主窗体中。

图1 图2由图1和图2我们可以看出,通过设置页可选定进行数据传输的通信端口和端口的波特率、奇偶校验、数据位和停止位,通信时每传输一个字符都将触发响应事件,在通信页“传输显示”位置可看到当前正在进行传输的数据。

同时当出现回车换行符时将整行内容显示在me mDisplay新的一行中,而全部接收的内容还将存在一个文件中。

部分源代码如下:变量说明varCommForm: TCommForm;ss :string;savef,readf :file of char;i,j :longint;初始化procedure TCommForm.FormCreate(Sender: TObject);beginmport:=1;mscomm.settings:='9600,n,8,1';mscomm.inputlen:=1;mscomm.inbuffercount:=0;mscomm.portopen:=true;ss:='';i:=0;j:=0;assignfile(savef,'save1');rewrite(savef);assignfile(readf,'read1');reset(readf);end;设置确定procedure TCommForm.btnConfirmClick(Sender: TObject); beginif mscomm.portopen thenmscomm.portopen:=false;mport:=strtoint(edtCommport.text); mscomm.settings:=edtCommsetting.Text;end;传输事件procedure TCommForm.MSCommComm(Sender: TObject); varfilenrc :char;buffer :variant;s1:string;c :char;begincase mEvent ofcomEvSend:beginwhile not(eof(readf)) dobeginread(readf,filenrc);mscomm.output:=filenrc;j:=j+1;lblDisplay.caption:=inttostr(j);if mscomm.outbuffercount>=2 thenbreak;end;end;comEvReceive:beginbuffer:=mscomm.Input;s1:=buffer;c:=s1[1];ss:=ss+c;i:=i+1;lblDisplay.caption:=c+inttostr(i);write(savef,c);if (c=chr(10))or(c=chr(13)) thenbeginlblDisplay.caption:='cr'+inttostr(i);memDisplay.lines.add(ss);ss:='';end;end;end;end;当然还有许多串口控制的ActiveX控件,有控件用是方便,但是是否说没有控件就不能用D elphi本身解决问题呢。

基于Delphi的PC机与AVR单片机的串行通讯

基于Delphi的PC机与AVR单片机的串行通讯

基于Delphi的PC机与AVR单片机的串行通讯黄春香;杨奕【摘要】采用Delphi中的SPComm控件实现PC机与AVR单片机之间的串行通讯,在上位机和终端设备之间进行数据传输,对空气源热泵进行远程监控,实时掌握各机组的运行情况,以便在发生故障时能及时处理.详细介绍了监控系统的软硬件设计思路.实际使用证明该系统稳定可靠且兼容性高.%This paper introduced a kind of serial communication between PC and the AVR single-chip by using SPComm component in Delphi. Air source heat pump can be remotely controlled while data is transmitted between master computer and terminal equipment. Therefore operation condition of various units can be mastered real-timely so that fault can be treated in time. This paper presented the software and hardware design ideas of monitoring systems in detail. The practical use proves the stability and reliability as well as high compatibility of the system.【期刊名称】《仪表技术与传感器》【年(卷),期】2012(000)006【总页数】3页(P108-110)【关键词】Delphi;Modbus协议;SPComm;远程监控【作者】黄春香;杨奕【作者单位】南通大学电气工程学院,江苏南通226019;南通大学电气工程学院,江苏南通226019【正文语种】中文【中图分类】TP2731 监控系统组成1.1 硬件构成该监控系统以1台PC机作为主控单元,系统终端以AVR单片机ATmega32为核心,上位机与各终端机通过RS-485总线连接。

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的多线程机制来实现。

下面将介绍详细的步骤。

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+MSComm控件串口收发程序

//Delphi+MSComm控件串口收发程序//HotPower@procedure TForm1.FormCreate(Sender: TObject);beginif MSComm1.PortOpen then MSComm1.PortOpen := false;//关闭端口mPort := 2;//设置端口2MSComm1.InBufferSize := 256;//设置接收缓冲区为256个字节MSComm1.OutBufferSize := 256;//设置发送缓冲区为256个字节MSComm1.Settings := '9600,n,8,1';//9600波特率,无校验,8位数据位,1位停止位 MSComm1.InputLen := 0;//读取缓冲区全部内容(32个字节)MSComm1.InBufferCount := 0;// 清除接收缓冲区MSComm1.OutBufferCount:=0;// 清除发送缓冲区MSComm1.RThreshold := 32;//设置接收32个字节产生OnComm 事件// MSComm1.InputMode := comInputModeText;//文本方式MSComm1.InputMode := comInputModeBinary;//二进制方式MSComm1.PortOpen := true;//打开端口end;procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);beginif MSComm1.PortOpen then MSComm1.PortOpen := false;;//关闭端口end;procedure TForm1.MSComm1Comm(Sender: TObject);varbuffer: Olevariant;//MSComm1.InputMode = comInputModeBinarystr: string;//MSComm1.InputMode = comInputModeTexti: integer;begincase mEvent ofcomEvReceive: //串行接收事件处理beginif MSComm1.InputMode = comInputModeText then //字符方式读取str := MSComm1.Input//读出后会自动清除接收缓冲区,str[1]~str[32]else //二进制方式读取buffer := MSComm1.Input;//读出后会自动清除接收缓冲区,buffer[0]~buffer[31] Edit3.Text := '';for i := 0 to MSComm1.RThreshold - 1 do //32字节Hex转换beginif MSComm1.InputMode = comInputModeText then //单行字符转换Edit3.Text := Edit3.Text + inttohex(byte(str[i + 1]), 2) + ' 'else //单行二进制数据转换Edit3.Text := Edit3.Text + inttohex(buffer[i], 2) + ' ';end;Memo2.Lines.Add(Edit3.Text);//加入一行显示end;end;end;procedure TForm1.BitBtn1Click(Sender: TObject);vari: integer;beginEdit4.Text := '';for i := 0 to 31 dobeginMSComm1.Output := char(i);//发送一个字符Edit4.Text := Edit4.Text + inttohex(i, 2);//以十六进制字符显示 end;Memo1.Lines.Add(Edit4.Text);//加入一行显示end;。

Delphi环境下单片机与PC机串口通信的一种实现方法

Delphi环境下单片机与PC机串口通信的一种实现方法
毛建东;高宗海;李大成
【期刊名称】《现代电子技术》
【年(卷),期】2004(027)002
【摘要】概述了单片机与PC机间串行口通信的基本原理,介绍了89C51单片机及其外围信号采集电路构成的下位机的原理及程序框图,并详述了在Delphi环境下上位机利用Spcom控件与下位机进行RS232串行口通信的实现.实际中,应用于智能磁滞回线实验仪,效果良好.
【总页数】3页(P37-38,42)
【作者】毛建东;高宗海;李大成
【作者单位】西安理工大学,机械与精密仪器工程学院,陕西,西安,710048;西安理工大学,机械与精密仪器工程学院,陕西,西安,710048;西安理工大学,机械与精密仪器工程学院,陕西,西安,710048
【正文语种】中文
【中图分类】TP368.1
【相关文献】
1.利用Spcomm控件实现单片机与PC机串口通信的方法 [J], 郑利华;刘旭明
2.基于Delphi及Spcomm控件实现的单片机与PC机串口通信 [J], 黄瑛;孙志锋;孙晓东;邱炜
3.例题33 用VC++实现单片机与PC机串口通信的3种方法 [J], 曾自强
4.Delphi环境下批数据串口通信的直接实现方法 [J], 张瑞;廉保旺
5.用VC++实现单片机与PC机串口通信的三种方法 [J], 曾自强;王玉菡
因版权原因,仅展示原文概要,查看原文内容请购买。

利用Spcomm控件实现单片机与PC机串口通信的方法

维普资讯
2 0 第 3期 06年
桂 林航天 工业 高等专科 学校 学报
( 总第 4 3期) J U N LO U LN C L E EO E O P C E H O O Y 信 息与 电子 工程 O R A FG II O L G FA R S A ET C N L G
利用基本三线 制 的 R 22串行 口通 信将 数据传 送 给 P S3 C 机 , P 机进 行 数 据 的进 一 步 处 理 。 由 C
MO C V S ON, 0 写 串 口控 制 字 : 式 2 T —R = #5 H; 方 ,I I
0, REN 一 1
M OV C(N, 0 t M OD一 1 P ) #8 H S
1 上 位机与 下位 机 的设计
1 1 下 位 机 的 实 现 .
下位 机 使 用 8 C 1程 序 采 用 汇 编语 言编 写 , 要 完 成 9 5, 主 定 时 数据 采 集 及 数 据 发 送 工 作 , 中 定 时 采 样 的 中断 频 率 其 由 定 时器 0的 常 数 自动 装 载 8bt计 数 器 方 式 产 生 ;波 特 i
S T R ; 动 T E BT 1启 1
1 2 上 位 机 软 件 的 实现 .
在 Wid ws环 境 下 , n 2AP no Wi3 I提 供 了 C et i , ra2Fl e
Se u Com m ,Buld m m DCB , t m m St t tp i Co Se Co a e有 功 能 强 大 、 便 易 用 和 代 码 执 行 速 e i p 简
度 快 等 优 点 的可 视 化快 速 应 用 开 发 工 具 , 是 D lh 没 有 但 ep i
MO H1 #O 3 设 波 特 率 :2 V T , F H; 1 MHZ 40 bu ,8 0 a d
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

222科技资讯 SCIENCE & TECHNOLOGY INFORMATION
2006 NO.31
SCIENCE & TECHNOLOGY INFORMATION
学 术 论 坛
1 串行通信的概念
所谓“串行通信”是指外设和计算机间使用一根数据信号线(另外需要地线,可能还需
要控制线),数据在一根数据信号线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。

如图1所示。

图1
由于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并且可以借助现成的电话网进行信息传送,因此,特别适合于远距离传输。

对于那些与计算机相距不远的人-机交换设备和串行存储的外部设备如终端、打印机、逻辑分析仪、磁盘等,采用串行方式交换数据也很普遍。

在实时控制和管理方面,采用多台微机处理机组成分级分布控制系统中,各CPU之间的通信一般都是串行方式。

所以串行接口是微机应用系统常用的接口。

2 SPCOMM串口通信组件简介
目前,利用 Delphi实现串口通信的常用的方法有3种:一是利用控件,如 MSCOMM控件和 SPCOMM控件;二是使用 API函数;三是调用其他串口通信程序。

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

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

SPCOMM是Small-Pig Team开发的一个第三方Delphi串口控件,该控件具有丰富的与串口通信密切相关的属性及事件。

提供了对串口的各种操作,且编程简单、通用性强、可移植性好。

在Delphi软件开发中已经成为一个被广泛应用的串口通信开发控件。

SPCOMM共实现了三个类:串口类Tcomm、读线程类TreadThread以及写线程类TwziteThread Tcomm的某个实例在方法StartComm中打开串口.并实例化了一个读线程Read Fhread和一个写线程WriteThread,它们和主线程之间进行消息的传递,实现串口通信。

3 SPCOMM控件串口通信的实现
3.1 SPCOMM控件的基本属性
CommName属性:计算机串口端口号的名字。

COM1、COM2...等,在打开串口前,必须填写好此值。

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

BaudRate:设定支持串口通信用的波特率9600、4800等,根据实际需要来定,在串口打开后可更改波特率,实际波特率随之更改。

ByteSize属性:表示一个字节中。

使用多少个数据位收发数据,根据具体情况设定5、6、7、8等。

StopBits属性:表示一个字节中,使用停止位的位数,根据具体情况设定1、1.5、2等。

SendDataEmpty属性:布尔属性,为True时表示发送缓存为空,或者发送队列里没有信息;为False时表示表示发送缓存不为空,或者发送队列里有信息。

3.2 SPCOMM控件的方法
Startcomm方法用于打开串口,当打开失败时通常会报错。

错误主要有7种:⑴串口已经打开;⑵打开串口错误;⑶文件句柄不是通信句柄;⑷不能够安装通信缓存;⑸不能产生事件;⑹不能产生读进程;⑺不能产生写进程;
StopComm方法用于关闭串口,没有返回值;
WriteCommData(pDataToWrite:PChar;dwSizeofDataToWrite:Word )方法是个带有布尔型返回值的函数,用于将一个字符串发送到写进程,发送成功返回 true,发送失败返回false。

执行此函数将立即得到返回值,发送操作随后执行。

该函数有两个参数,其中pDataToWrite是要发送的字符串,dwSizeofDataToWrite是发送字符串的长度。

3.3 SPCOMM控件的事件
OnReceiveData:procedure(Sender:Tobject;Buffer:Pointer;BufferLength:Word) of object当有数据输入缓存时将触发该事件,在这里可以对从串口收到的数据进行处理。

Buffer中是收到的数据,BufferLength是收到的数据长度。

OnReceiveError:procedure(Sender:TObject; EventMask : DWORD) 当接收数据出现错误时将触发该事件。

3.4 SPCOMM串口通信的实现
SPCOMM串行通信控件具有多线程的特性,接收和发送数据分别在两个线程内完成,接收线程负责收到数据时触发OnReceiveData事件:用WriteCommData()函数将待发送的数据写入输出缓冲器,发送线程在后台完成数据发送工作。

在接收和发送数据前需要初始化串口,用StartComm方法打开串口。

退出程序时用StopComm方法关闭串口。

以实现 PC机与单片机 8051之间的通信为例,首先要调通它们之间的握手信号。

假定它们之间的通信协议是:PC到8051一帧数据 6个字节,8051到PC一帧
数据也为6个字节。

当PC发出(F0,01,FF,FF,01,F0)后8051能收到一帧(F0,01,FF,FF,01,F0),表示数据通信握手成功,两者之间就可以按照协议相互传输数据。

创建一个新的工程SPCOMM.DPR,把窗体的NAME属性定为FSPCOMM,
把窗体的标题定义为测试通信,按照图2 添加控件(图2中黑色矩形围住的控件即为Comm1)。

图2
设定COMM1属性:1.波特率:4800;2.奇偶校验位:无;3.字节长度:8;4.停止位:1;5.串口:COM1。

Memo1中将显示发送和接收的数据。

将新的窗体存储为Comm.pas。

4 SPCOMM串口通信的关键技术问题
SPCOMM应用的核心在于主线程、读线程和写线程之间的消息传递机制,而通信数据相关信息的传递也是以消息传递的方式进行的。

在使用SPCOMM进行串口通信编程,除按照说明使用外,还需要特别注意以下两个问题。

首先,SPCOMM是通过ReadlntervalTimeout属性的设置。

来确定所接收到的数据是否属子同一帧数据,其默认值是100ms,也就是说,只要任何两个字节到达的时间间隔小于100ms,都被认为是属于同一帧数据,在与单片机协同工作时,要特别注意这个问题。

另外,SPCOMM的默认属性设置是支持软件流控制的。

用于流控制的字符是13H(XofChar)和11H(Xonch)。

当单片机以二进制方式发送数据时,必须要禁用SPCOMM对于软件流控制的支持。

否则,在数据帧中出现的13H和11H会被SPCOMM作为控制字符而加以忽略。

参考文献
[1] 李志合,易维明,程卫东,张国海.Delphi程
序中实现串口通信的三种方法.山东工程学院学报.2001-9,p52-p55.
[2] 李忠明,方锦明.基于Delphi 6的串口通
信程序实现方法研究.兰州大学学报[自然科学版].2004(8),p41—p44.
[3] 谭思云,周仲.P89LPC935单片机在串口
通信和ICP编程上的应用.[J]微计算机信息.2005,7:p66—p67.
Delphi+SPCOMM控件实现串口通信
陈增发 严锋
(苏州大学 江苏苏州 215600)
摘 要:本文在对几种常用串口通信方法分析比较的基础上,着重讨论了Delphi开发环境下利用SPCOMM控件实现PC机与单片机之间串口通信的方法。

研究了SPCOMM串口通信的关键技术问题,并通过一个实例给出了SPCOMM控件在Delphi7.0串口通信中的应用。

关键词:串口通信 Delphi7.0 SPCOMM控件中图分类号:TN911文献标识码:A文章编号:1672-3791(2006)11(a)-0222-01。

相关文档
最新文档