Delphi

下用

Mscomm32

实现串行通信

 

1

,

应新洋

2

(

1

1

重庆大学

应用技术学院

,

重庆

400030

;

2.

重庆大学

计算机学院

,

重庆

400045

)

 

:

讨论了

Delphi

 

环境下串行通信的实现原理

,

通过一个实际的例子

,

阐明了如何在

Delphi

环境下利

Mscomm32.

 

ocx

控件来设计进行通信程序的方法。

关键词

:

串行通信

;

通信控制

;

Mscomm32

中图法分类号

 

:

 

TP273

   

文献标识码

 

:

 

A

   

文章编号

:

1001

2

3695

(

2003

)

08

2

0158

2

03

The

Serial

C

ommunication

by

Use

Mscomm32.

ocx

under

the

Delphi

Environment

LI

N

Y

ong

1

,

YI

NG

X

in

2

yang

2

(

1

1

College

o

f

Application

Technology

,

Chongqing

University

,

Chongqing

400030

,

China

;

2

.

College

o

f

Computer

,

Chongqing

University

,

Chongqing

400045

,

China

)

Abstract

:

T

his

text

discussed

the

principle

of

which

can

make

serial

communication

with

serial

port

under

the

Delphi

environment

,

through

a

real

exam

ple

of

telecommunication

industry

,the

paper

ex

patiates

the

meth

od

of

h

ow

to

use

Mscomm32.

ocx

to

attain

serial

com

2

munication

under

the

Delphi

environment.

K

ey

w

ords

:

Serial

C

ommunication

;

C

ommunication

control

;

Mscomm32

1

 

引言

通信作为一种重要的技术在电信行业中有着广泛

的应用

,

如通过计算机与程控机之间的通信

,

从而有效

地进行管理

,

维护电信营运的数据。一般有两种通信方

:

使用网络进行通信

,

S

ocket

(

即数据包

)

+

TCP/

IP

;

使用串口进行数据的传递和接收

,

实现通信功能

(

遵循

RS

2

232

标准

)

Delphi

的一大优势是通过一些优秀的控件来方便有

效地实现功能

,Delphi

环境下通信功能的实现也主要借

助于某些控件

,

如微软的

Mscomm

控件等。

2

 

Delphi

平台上实现串行通信

一般

Delphi

开发串行通信应用程序有两种方法

:

(

1

)

利用

W

indows

API

接口函数

W

indows

S

DK

提供了完备的

API

接口函数

,

利用

API

函数编写的串行通信程序功能更强大、

更丰富

,

但编写

复杂

,

其复杂化和专业化使很多开发者望而生畏。

(

2

)

采用通信控件实现

使用控件是

Delphi

的一大优势

,

其编写程序较为简

,

Delphi

使

(

Mscomm

控件

(

VB

的盘中可以找到

)

)

来进行串行通信

程序的开发。

笔者编写的用于控制程控交换机开关市话的串行

通信程序

(

PST

N

市话停开系统

)

,

主要利用了

Mscomm

件的一些属性与方法。

Mscomm

控件提供了标准的事件

处理函数、

过程

,

通过方法设置串行通信的参数

(

端口

号、

波特率等

)

,

比较容易实现串行通信。

2

1

1

 

Mscomm

控件的主要属性

Mscomm32.

ocx

提供了

27

个关于通信控件方面的属

性。

其主要属性如下

:

C

omm

oport

属性

,

设置串行端口号

,

取值范围

1

99

,

缺省默认值

1

设置方式

:

Object

 

Inspector

Mscomm1

 

C

omm

oport

设置端口号

(

2

,

即使用

2

 

COM

 

)

;

用代码实现

Mscomm1.

comm

oport

=

2

Settings

属性

,

设置串行端口的波特率、

奇偶数校验位、

数位、

 

止位

设置方式

 

:

Object

Inspector

 

Settings

设为

9600

 

,N

,8

,1

;

用代码实现

:Mscomml.

Settings

=

9600

,N

,8

,1

,

其中波特率为

9

600

,N

表示无奇偶校验位

,8

位数据位

,1

位停止位。

P

 

ortopen

属性

,

设置端口状态

(

打开或关闭

)

设置方式

:

Object

Inspector

P

ortopen

设为

T

rue

(

T

rue

即打开端

,False

即关闭端口

)

;

代码实现

:Mscomm1.

portopen

:

=

T

rue

Input

属性

,

接收缓冲区

代码实现

:S

tr

come

in

:

=

Mscomm1.

input

(

接收缓冲区的内容赋

给字符串变量

S

tr

come

in

)

Output

属性

,

发送缓冲区

代码实现

:

Mscomm1.

Output

:

=

S

tr

g

o

out

(

将变量

S

tr

g

o

out

中的字符写入发送缓冲区

)

C

ommEvent

属性

:

设置激发通信事件的常数

(

1

)

8

5

1

  

计算机应用研究

2003

 

 

1

 

常数具体的设置

 

 

    

 

C

omEvSend

1

传输缓冲区中的字符比

S

thresh

old

还少

C

omEvReceive

2

收到

S

thresh

 

old

个字符

,

该事件将持续产生直到

 

Input

属性从接收缓冲区中移除数据

C

omEvCT

S

 

3

C

lear

T

o

Send

 

线的状态发生变化

C

omEv

DSR

4

Data

Set

Ready

线的状态发生变化

C

omEvC

D

 

5

Carrier

Detect

线的状态发生变化

C

omEvRing

6

检测到振铃信号

C

omEvE

OF

7

收到文件结尾

(

ASCII

字符为

26

)

字符

2

1

3

 

Mscomm

控件的主要事件

Mscomm

控件提供了

Oncomm

事件

,

用于通信错误或

通信事件发生时

,

用户可在

Oncomm

事件中编写代码。

Oncomm

事件中的激发是通过

C

ommEvent

属性设定的数

 

值来决定的。

3

 

 

串行通信程序的设计

下面例子是通过串行通信与程控交换机进行对话

,

从而来操作市话的停开关电话

,

开发平台为

W

indows

2000

,Delphi

6.

0

,Oracle

8.

1.

6

3

1

1

 

程序的整体设计

(

框架

)

数据库中存在一张有关市话操作的指令表

,W

indows

2000

不停地读取这张指令表

,

通过串行通信不断地向程

控交换机发送命令。其目的就是用计算机自动控制来

代替手工的操作

,

类似于

MS

2

DOS

的批处理程序。程序

处理的整体流程图如图

1

所示

,

其中

“执行操作”

部分的

详细流程图如图

2

所示。

1

 

程序整体流程图

2

 

执行操作的具体流程

Delphi

中程序的各个部分用相应的过程

(

Procedure

)

函数

(

Function

)

来实现

:

系统初始化

      

:pstn

init

;

与交换机建立连接

:process

before

登录交换机

:process

login

执行操作

:time

ontimer

程序退出

:time

outtimer

3

1

2

 

程序的实现

下面是程序实现的主要部分和需要注意的地方

:

(

1

)

程序的初始化

程序的初始化在串口通信中比较重要

,

尤其是在电信

行业中

,

初始化的工作影响整体程序的运行。

这部分可以

Delphi

编写界面时在

Object

Inspector

中设置各种初始值

(

或状态

)

,

为保证可靠性

,

最好采用代码编写方式。

Procedure

pstn

init

;

Begin

Mscomm1.

comm

oport

:

=

1

;

/

/

设通信端口号为

com1

Mscomm1.

settings

:

=

9600

,N

,8

,1

;

/

/

波特率为

9600

,

无奇偶校验位

,8

位数据位

,1

位停止位

,

要注意

/

/

9600

的波特率必须与程控交换机提供的波特率对应

Mscomm1.

commEvent

:

=

2

/

/

直到

Input

取走缓冲区中移除数据

Mscomm1.

portopen

:

=

true

;

End

这部分工作主要是设置通信的参数并为打开端口

通信的运行作准备。在

 

Delphi

编写程序过程中

,

主要设

置的通信参数主要有端口号、

波特率数据位、

停止位、

偶校验位及硬件握手协议

(

或软件握手协议

)

等。

端口的状态设定分为四类

,

如图

3

所示。

3

 

通信端口的状态设定

(

2

)

通信会话的建立

这部分对通信双方来讲非常重要

,

尽管此时双方通

信线路已经连通

,

并可以传送信号

,

但是发送的信号是

否为双方接收或能否收到对方的信息

,

因此

,

通信开始

后必须保证双方的一致协调。采用向通信设备发送一

系列的控制信息

(

又叫指令

)

,

从而来保证这种可靠的交

流通信。

这些指令和硬件通信设备紧密相关

,

因此指令

也不尽相同

,

每种不同的设备有自己的控制信息

(

指令

)

来进

始。路

(

R

outer

)

(

S

witch

)

调制解调器

(

M

odem

)

都有不同的指令。

M

odem

一般都支持

H

ayes

公司的

A

T

 

指令

,

 

Delphi

的编程中

,

通过

M

scom

m

通信控件向

M

odem

A

T

DT

指令来

控制

M

odem

的行为

,

保证两方通信的可靠进行。

MSCOM

M1.

Output

=

AT

DT

+

char

(

#

13

)

;

R

outer

一般通过按回车键向

R

outer

发送控制信

,

路由器返回字符串

R

outer

,

表示双方作好传递数据的

准备

,

可以发送数据

Mscomm1.

Output

=

char

(

#

13

)

程控交换机由于生产厂家不同

,

控制指令也不

同。

笔者所用的交换机联系的控制指令为

C

trl

+

Break

,

作用是通过前台计算机向交换机发送一个中断请

,

交换机回送

?

字符

,

前台计算机收到

?

字符后

,

示该次通信的会话可以进行了。

这部分完成以后

,

就可以进行信息的发送与接收

,

在笔者的程序中

,

将这部分定义

(

划分

)

成以下函数

:

function

process

before

:

boolean

;

Begin

Result

:

=

false

;

向程控交换机发一个中断请求

;

/

/

相当于发一个

Ctrl

+

Break

Mscomm1.

input

=

?

then

Result

:

=

true

/

/

表示连续成功

,

可以进行会话

E

lse

result

:

=

false

/

/

无法与交换机通信

End

(

3

)

信息传送和控制

会话建立以后

,

就可以进行信息的传送了

,

从而达

到操作程控交换机

(

或其它设备

)

的目的。

4

 

通信控制程序中应考虑的问题

4

1

1

 

循环实时控制

PST

N

市话停开关机实质上是一个循环实时系统

,

须能够有效地对市话情况

(

这里是针对市话数据表

)

行实时监测。

因为这些数据表时时在变化

,

所以系统必

9

5

1

8

 

勇等

:Delphi

下用

Mscomm32

实现串行通信

  

须能循环地控制

,

当然采用

F

or

,While

,Repeat

,

,Until

可以

,

但会进入死循环

,

使系统不能有效地完成功能。

本系统采用两个定时器触发控制循环。

(

1

)

T

 

ime

on

循环控制命令执行情况

,

并及时退出

循环监控对

CPU

的控制权

,

使系统能及时强行退出

(

 

时钟在成功登录交换机后激活

)

(

2

)

T

 

ime

out

判断端口的状态

,

只有等到端口状态

为空闲

(

Free

)

,

才向交换机发送退出指令

,

并且等到退

出确认后

,

才能够退出系统

(

该时钟在触发了退出系统

的事件后激活

)

Procedure

T

 

ime

onT

imer

(

sender

:tobject

)

;/

/

T

 

ime

on

 

的激发事件

Begin

I

f

Query1.

active

=

false

then

Begin

Query

1.

open

;/

/

其中

query1.

S

Q

L

语句为

F

or

i

:

=

1

to

query1.

 

recordcount

do

  

Begin

  

 

Process

pstn

;

  

/

/

根据交换机操作流程和数据集中记录

,

信息进行相应操作

End

;

  

End

;

E

lse

if

query1.

E

of

then

query1.

close

/

/

Query1.

active

=

false

/

/

记录已经操作完毕

,

关闭数据集

,

以使下次重新得到新的满足

/

/

条件的数据集

End

;

Procedure

T

 

ime

outT

imer

(

send

:tobject

)

;

 

/

/

T

 

ime

out

的激发事件

Begin

I

f

端口状态为空闲

(

Free

)

then

/

/

退出系统

Begin

Mscomm1.

output

:

=

log

out

;

等待交换机的反馈信息

(

管理员推出交换机的信息

)

;

close

;

/

/

关闭程序

End

;

End

;

4

1

2

 

系统的可靠性

因为与程控交换机打交道

,

系统的安全可靠性是考

虑的重点

,

尽管

Mscomm

控件有通信错误或事件发生时

,

都会产生

Oncomm

事件

,

为确保

PST

N

系统的信息

,

这里

不采用

Oncomm

事件

,

而是采用枚举的方法直接对接收

缓冲区里的信息作判断

,

以接收信息为根据来进行信息

(

命令

)

的发送

(

当然

,

对前台计算机来讲

,

发送信息是可

靠的

)

具体代码如下

:

str

:

=

Mscomm

.

input

IF

pos

(

关键字

,str

)

>

0

then

Begin

发送信息来进行市话停开关操作

;

End

E

lse

if

pos

(

Error1

关键字

,str

)

>

0

then

Error

(

1

)

E

lse

if

pos

(

Error2

关键字

,str

)

>

0

then

Error

(

2

)

5

 

结束语

Delphi

串行通信程序主要用于与硬件设备打交道的

系统中

,

在工业控制中有着广泛的应用。使用控件是

Delphi

的一大优势和特点

,

其编程较为简单

,Delphi

加上

好的通信控制

(

Mscomm

)

来进行串行通信程序的开发

不失为一种好的方式。

参考文献

:

[1

]

王小伟

1

Windows

环境下计算机与高速数字信号处理系

统实时通信

[J

]

1

计算机应用研究

 

,2002

,19

(

2

)

:130

2

132.

[2

]

余得彦

1

基于

Delphi

的小型实时数据采集与分析系统

[J

]

1

计算机自动测量与控制

,2001

,

(

3

)

:63

2

65

1

作者简介

:

林勇

(

1968

2

)

,

,

重庆人

,

讲师

,

博士研究生

,

研究方向为计算

机网络技术

数据仓库与数据挖掘

计算机技术在建筑行业的

应用

;

应新洋

(

1977

2

)

,

,

浙江人

,

硕士研究生

,

主要研究方向

为数据仓库与数据挖掘

GIS

计算机技术在建筑行业的应用

(

上接第

155

)

(

5

)

n

不等于

0

,

则对矩阵的第

j

+

1

行输入

0xFF

左移

n

,

0

补齐左移的位数

;

(

6

)

n

等于

0

,

则矩阵生成结束。

这种方法的优点在于实现方便

,

缺点在于矩阵数据

1

的位置集中在矩阵的上面

,

得到的打印图像纹理不够

细致。

查表获取灰度表示矩阵

,

即预先定义一个灰度的描

述矩阵

,

根据不同的灰度值

,

从矩阵中得到相应的描述。

这种方法的优点在于可以根据不同的打印要求

,

定义不

同的灰度表示矩阵

,

得到不同的打印效果

;

缺点是如果

要表示比较均匀的纹理

,

得到的打印文件的数据量将会

很大。

本文中给出两种灰度表表示

:

8

×

8

矩阵中

,

以矩形为基本型

,

向外扩展

;

8

×

8

矩阵中心

,

菱形为基本型

,

向外扩展转换。

6

 

实验结果

实验中所用到的固定参数如表

2

所示。

3

(

a

)

为实验图像在画图下的显示。

3

(

b

)

,

(

c

)

,

 

(

d

)

为得到的

PC

L

打印文件通过

PC

L

文件浏览器看到的

结果。

(

b

)

中采用自生成方式得到灰度描述矩阵

;

(

c

)

,

(

d

)

中采用查表方式得到灰度描述矩阵。

由图

3

可以看出

,

自生成方式得到的打印结果有明

显的伪边缘

,

而查表方式得到的打印结果

,

图像纹理则

要相对均匀

,

但同时文件的大小也增加了

40

%

左右

,

际上是用空间来换取效果。

(

c

)

中所用的灰度矩阵表以

矩形为基础进行排列

;

(

d

)

中所用的灰度矩阵表以菱形

为基础进行排列。

可以看出

,

(

d

)

的视觉效果相对于

(

c

)

而言更柔和

,

(

c

)

有更高的对比度。

参考文献

:

[1

]

HP

PC

L/

P

JL

Reference[M].

Hewlett

2

Packard

C

o

,1999.

[2

]

吕凤军

1

数字图像处理编程入门

[M].

北京

:

清华大学出

版社

,1999

1

[3

]

谭浩强

1

C

程序设计

[M].

北京

:

 

清华大学出版社

,1991

 

1

作者简介

:

汤晓军

(

1979

2

)

,

,

硕士研究生

,

主要研究方向为图像压缩与处

理技术芯片设计

;

金莉

(

1966

2

)

,

,

副教授

,

硕士研究生导师

,

究方向为智能网络

;

周宁

(

1977

2

)

,

,

硕士研究生

,

主要研究方

向为图像压缩与处理、

视频芯片设计

;

梁峰

(

1977

2

)

,

,

硕士研

究生

,

主要研究方向为视频芯片设计、

图像压缩与处理