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
)
,
男
,
硕士研
究生
,
主要研究方向为视频芯片设计、
图像压缩与处理