龙空技术网

【15.串口通信编程】2.SPComm控件

青少年编程ABC 54

前言:

现时姐妹们对“delphi远程播放控件”大致比较着重,你们都需要了解一些“delphi远程播放控件”的相关知识。那么小编同时在网上收集了一些关于“delphi远程播放控件””的相关文章,希望大家能喜欢,大家快快来学习一下吧!

2.SPComm控件

在 Delphi 中实现串口通信的常用的方法有 3 种:

利用控件,如 MSCOMM控件和 SPCOMM控件使用 API函数调用其他串口通信程序

其中利用 API 编写串口通信程序较为复杂,需要掌握大量的通信知识。相比较而言,利用 SPCOMM 控件则相对较简单,并且该控件具有丰富的与串口通信密切相关的属性及事件,提供了对串口的各种操作,而且还支持多线程。

2.1 SPComm安装

在 Delphi 中安装:

1.选择下拉菜单 Component 的第二项 Install Component,在 Unit file name 处填写控件 SPCOMM 控件所在路径,其它可用默认值,点击OK按纽。

2.安装成功后,system 控件面板中将出现一个控件 COMM。现在使用 COMM 控件可以象 Delphi 自带控件一样使用.。

在 Lazarus 中安装:

1.打开Lazarus 后点 Package - Open Package File(.lpk) ,然后选择解压出来的 dpkSPComm.lpk .

2.点 Compile 进行编译, 再点 USE 右侧的小三角形出现 install, 点 install 安装。

3.等待 Lazarus 完成安装,重启后在 System 页即可找到安装好的 Tcomm 控件。

在 CodeTyphon 中安装:

将 Lazarus 安装包中的 dpkSPComm.lpk 包文件名修改为 dpkSPComm.ctpkg,然后修改xml,xml 主要区别是使用的依赖包名不同,Lazarus 使用 "LCL" 、"FCL", CT 加了个 ‘ad’ 使用 “adLCL”、"adFCL",将 xml 文件中的相应内容替换即可。

然后按照 Lazarus 中的安装方法在 CodeTyphon 中安装。

SPcomm For Lazarus 下载地址:

2.2 SPCOMM的属性、方法和事件

1.属性

CommName表示 COM1、 COM2等串口的名字;BaudRate根据实际需要设定的波特率,在串口打开后也可更改此值,实际波特率随之更改;ParityCheck表示是否需要奇偶校验;ByteSize根据实际情况设定的字节长度;Parity奇偶校验位;StopBits停止位;SendDataEmpty布尔型属性,为 true 时表示发送缓存为空,或者发送队列里没有信息;为 false 时表示发送缓存不为空,或者发送队列里有信息。

如:

comm1.CommName:='COM1';   //串口号 comm1.BaudRate:=1200;    //波特率1200、4800、9600、115200等comm1.ByteSize:=_8;       //数据位5、6、7、8comm1.Parity:=Even;       //检验位 Even、Odd、None、Space、Markcomm1.StopBits:=_1;       //停止位 1、1.5、2

spcomm 的属性主要是 5 个方面的设置,其中串口名和波特率都很好处理,直接设置就可以了,而其他三个属性就不是这么容易。其动态设置如下,但是如果在运行中若更改则是需要先关闭 stopcomm,然后再设置,否则会出错。

如:

 comm1.CommName:=combobox1.Text; comm1.BaudRate:=strtoint(combobox2.Text); comm1.ByteSize:=Tbytesize(combobox3.ItemIndex); comm1.StopBits:=Tstopbits(combobox4.ItemIndex); comm1.Parity:=Tparity(combobox5.ItemIndex);

2.方法

Startcomm

该方法用于打开串口,当打开失败时通常会报错。错误主要有 7 种:

⑴串口已经打开;

⑵打开串口错误;

⑶文件句柄不是通信句柄;

⑷不能够安装通信缓存;

⑸不能产生事件;

⑹不能产生读进程;

⑺不能产生写进程;

StopComm

该方法用于关闭串口,没有返回值;

WriteCommData(pDataToWrite: PChar; dwSizeofDataToWrite:Word)

该方法是带有布尔型返回值的函数,用于将一个字符串发送到写进程,发送成功返回 true,发送失败返回 false。

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

该函数有两个参数:

pDataToWrite 是要发送的字符串;dwSizeofDataToWrite 是发送字符串的长度。

3.事件

OnReceiveData :procedure (Sender: TObject;Buffer: Pointer;BufferLength: Word)

当有数据输入缓存时将触发该事件,在这里可以对从串口收到的数据进行处理。 Buffer 是收到的数据, BufferLength 是收到的数据长度。

OnReceiveError : procedure(Sender: TObject; EventMask : DWORD)

当接收数据出现错误时将触发该事件。

2.3 SPComm串口通信的实现

SPComm 串行通信控件具有多线程的特性,接收和发送数据分别在两个线程内完成,接收线程负责收到数据时触发 OnReceiveData 事件;用 WriteCommData() 函数将待发送的数据写入输出缓冲器,发送线程在后台完成数据发送工作。在接收和发送数据前需要初始化串口,用 StartComm 方法打开串口,退出程序时用 StopComm 方法关闭串口。 实现PC机与单片机之间的数据发送及接收需要以下步骤:

1. 初始化并打开串口

需要选择本次通信使用的串口,确定通信协议,即设置波特率、校验方式、数据位、停止位等属性,打开该串口。示例代码如下:

//初始化并打开串口comm1.CommName:='COM1'; // 串口号Comm1.BaudRate:=9600;//波特率9600bpsComm1.Parity:=None; //奇偶检验无Comm1.ByteSize:=_8; //数据位8Comm1.StopBits:=_1; //停止位1Comm1.StartComm; //打开串口

2.建立握手信号

实现 PC 机与单片机之间的通信,首先要调通它们之间的握手信号,握手信号可以随意选择某特定字符串, 当 PC 发出这样一帧数据后,通过接收事件能收到单片机返回的这一帧数据或特定的某字符串,则表示握手成功,系统通信正常。两者之间就可以按照协议相互传输数据。否则需重新建立握手信号。

3.发送数据

在编写基于串口的计算机工业测控时,通常需要由 PC 机向下位机发送命令以控制下位机的行为,同时向下位机发送有关数据。利用 SPComm 串口控件向下位机发送数据示例代码如下:

//发送数据和控制字程序procedure senddata;var    i:integer;     commflg: Boolean;begin    commflg:=true;    for i:=1 to 8 do    begin        if not fcomm comml writecommdata(sendbutter,i) then        begin            Commflg:=false;            break;        end;    end;end;

4.接收数据

在编写基于串口的计算机工业测控时,通常需要由下位机向 PC 机发送数据以使PC机了解系统的测试数据或下位机的运行状态,并进而控制下位机的行为。利用 SPComm串口控件接收下位机发送的数据信息的示例代码如下:

//事件驱动方式接收数据程序procedure TForm1.CommlReceiveData(Sender:Tobject; Bufferointer; bufferLength:Word);var    receivedata: array of byte;begin    sleep(100);//等待100ms,保证接收到所有数据    move(buffef ,receivedata,bufferlength); //将接收缓存区中的数据转移到数组中    ……end;

5.关闭串口

在系统开发中,应注意在不使用串口时应及时关闭串口,释放系统资源,否则可能会影响系统的其它应用。关闭串口的代码如下:

procedure TForm1.FormClose ( Sender;TObj ect:var Action:TCIoseAction );begin    comml.StopComm;end;
2.4 SPComm串口通信的关键技术问题SPComm 应用的核心在于主线程、读线程和写线程之间的消息传递机制,而通信数据相关信息的传递也是以消息传递的方式进行的。在使用 SPComm进行串口通信编程,除按照说明使用外,还需要特别注意以下两个问题。 SPComm是通过 ReadIntervalTimeout 属性的设置,来确定所接收到的数据是否属子同一帧数据,其默认值是100ms,也就是说,只要任何两个字节到达的时间间隔小于100ms,都被认为是属于同一帧数据,在与单片机协同工作时,要特别注意这个问题。SPComm的默认属性设置是支持软件流控制的,用于流控制的字符是13H(XoffChar)和11H(XonChar),当单片机以二进制方式发送数据时,必须要禁用 SPComm 对于软件流控制的支持,否则,在数据帧中出现的13H,11H会被 SPComm 作为控制字符而加以忽略。

标签: #delphi远程播放控件