收稿日期 : 2002209221
Delphi 下用 Mscomm32 实现串行通信
林 勇1 , 应新洋2
(11 重庆大学 应用技术学院 , 重庆 400030 ; 2. 重庆大学 计算机学院 , 重庆 400045)
摘 要 : 讨论了Delphi 环境下串行通信的实现原理 ,通过一个实际的例子 ,阐明了如何在Delphi 环境下利
用 Mscomm32. ocx 控件来设计进行通信程序的方法。
关键词 : 串行通信 ; 通信控制 ; Mscomm32
中图法分类号 : TP273 文献标识码 : A 文章编号 : 100123695(2003) 0820158203
The Serial Communication by Use Mscomm32. ocx
under the Delphi Environment
LIN Yong1 , YING Xin2yang2
(11 College of Application Technology , Chongqing University , Chongqing 400030 , China ; 2. College of Computer , Chongqing University , Chongqing
400045 , China)
Abstract : This text discussed the principle of which can make serial communication with serial port under the Delphi environment ,
through a real example of telecommunication industry ,the paper expatiates the method of how to use Mscomm32. ocx to attain serial com2
munication under the Delphi environment.
Key words : Serial Communication ; Communication control ; Mscomm32
1 引言
通信作为一种重要的技术在电信行业中有着广泛
的应用 ,如通过计算机与程控机之间的通信 ,从而有效
地进行管理 ,维护电信营运的数据。一般有两种通信方
式 : ①使用网络进行通信 ,如 Socket (即数据包) + TCP/
IP ; ②使用串口进行数据的传递和接收 ,实现通信功能
(遵循 RS2232 标准) 。
Delphi 的一大优势是通过一些优秀的控件来方便有
效地实现功能 ,Delphi 环境下通信功能的实现也主要借
助于某些控件 ,如微软的 Mscomm控件等。
2 在 Delphi 平台上实现串行通信
一般 Delphi 开发串行通信应用程序有两种方法 :
(1) 利用 Windows 的 API 接口函数
Windows SDK提供了完备的 API 接口函数 ,利用 API
函数编写的串行通信程序功能更强大、更丰富 ,但编写
复杂 ,其复杂化和专业化使很多开发者望而生畏。
(2) 采用通信控件实现
使用控件是 Delphi 的一大优势 ,其编写程序较为简
单 ,大多数 Delphi 程序员使用控件 (如微软公司的
Mscomm控件 (在 VB 的盘中可以找到) ) 来进行串行通信
程序的开发。
笔者编写的用于控制程控交换机开关市话的串行
通信程序(PSTN 市话停开系统) ,主要利用了 Mscomm 控
件的一些属性与方法。Mscomm 控件提供了标准的事件
处理函数、过程 ,通过方法设置串行通信的参数 (端口
号、波特率等) ,比较容易实现串行通信。
211 Mscomm 控件的主要属性
Mscomm32. ocx 提供了 27 个关于通信控件方面的属
性。其主要属性如下 :
①Commoport 属性 ,设置串行端口号 ,取值范围 1~99 ,缺省默认值
为 1
设置方式 :在 Object Inspector 中 Mscomm1 的 Commoport 设置端口号
(如 2 ,即使用 2 号 COM口) ;用代码实现 Mscomm1. commoport = 2。
②Settings 属性 ,设置串行端口的波特率、奇偶数校验位、数位、停
止位
设置方式 :在 Object Inspector 中 Settings 设为 9600 ,N ,8 ,1 ;
用代码实现 :Mscomml. Settings =′9600 ,N ,8 ,1′,其中波特率为
9 600 ,N
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示无奇偶校验位 ,8 位数据位 ,1 位停止位。
③Portopen 属性 ,设置端口状态 (打开或关闭)
设置方式 :在 Object Inspector 中 Portopen 设为 True ( True 即打开端
口 ,False 即关闭端口) ;
代码实现 :Mscomm1. portopen : = True。
④Input 属性 ,接收缓冲区
代码实现 :Str come in : = Mscomm1. input (接收缓冲区的内容赋
给字符串变量 Str come in) 。
⑤Output 属性 ,发送缓冲区
代码实现 : Mscomm1. Output : = Str go out (将变量 Str go out
中的字符写入发送缓冲区) 。
⑥CommEvent 属性 :设置激发通信事件的常数 (表 1) 。
·851· 计算机应用研究 2003 年
表 1 常数具体的设置
常 数 值 说 明
ComEvSend 1 传输缓冲区中的字符比 Sthreshold 还少
ComEvReceive 2 收到 Sthreshold 个字符 ,该事件将持续产生直到 Input属性从接收缓冲区中移除数据
ComEvCTS 3 Clear To Send 线的状态发生变化
ComEvDSR 4 Data Set Ready 线的状态发生变化
ComEvCD 5 Carrier Detect 线的状态发生变化
ComEvRing 6 检测到振铃信号
ComEvEOF 7 收到文件结尾 (ASCII字符为 26)字符
213 Mscomm 控件的主要事件
Mscomm控件提供了 Oncomm事件 ,用于通信错误或
通信事件发生时 ,用户可在 Oncomm 事件中编写代码。
Oncomm事件中的激发是通过 CommEvent 属性设定的数
值来决定的。
3 串行通信程序的设计
下面例子是通过串行通信与程控交换机进行对话 ,
从而来操作市话的停开关电话 ,开发平台为 Windows
2000 ,Delphi 6. 0 ,Oracle 8. 1. 6。
311 程序的整体设计 (框架)
数据库中存在一张有关市话操作的指令表 ,Windows
2000 不停地读取这张指令表 ,通过串行通信不断地向程
控交换机发送命令。其目的就是用计算机自动控制来
代替手工的操作 ,类似于 MS2DOS 的批处理程序。程序
处理的整体流程图如图 1 所示 ,其中“执行操作”部分的
详细流程图如图 2 所示。
图 1 程序整体流程图
图 2 执行操作的具体流程
在 Delphi 中程序的各个部分用相应的过程( Procedure) 或
函数 (Function) 来实现 :
系统初始化 :pstn init ;
与交换机建立连接 :process before
登录交换机 :process login
执行操作 :time ontimer
程序退出 :time outtimer
312 程序的实现
下面是程序实现的主要部分和需要注意的地方 :
(1) 程序的初始化
程序的初始化在串口通信中比较重要 ,尤其是在电信
行业中 ,初始化的工作影响整体程序的运行。这部分可以
在Delphi 编写界面时在Object Inspector 中设置各种初始值
(或状态) ,为保证可靠性 ,最好采用代码编写方式。
Procedure pstn init ;
Begin
Mscomm1. commoport : = 1 ; / / 设通信端口号为 com1
Mscomm1. settings : =′9600 ,N ,8 ,1′;
/ / 波特率为 9600 ,无奇偶校验位 ,8 位数据位 ,1 位停止位 ,要注意
/ / 9600 的波特率必须与程控交换机提供的波特率对应
Mscomm1. commEvent : = 2 / / 直到 Input 取走缓冲区中移除数据
Mscomm1. portopen : = true ;
End
这部分工作主要是设置通信的参数并为打开端口
通信的运行作准备。在 Delphi 编写程序过程中 ,主要设
置的通信参数主要有端口号、波特率数据位、停止位、奇
偶校验位及硬件握手
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
(或软件握手协议) 等。
端口的状态设定分为四类 ,如图 3 所示。
图 3 通信端口的状态设定
(2) 通信会话的建立
这部分对通信双方来讲非常重要 ,尽管此时双方通
信线路已经连通 ,并可以传送信号 ,但是发送的信号是
否为双方接收或能否收到对方的信息 ,因此 ,通信开始
后必须保证双方的一致协调。采用向通信设备发送一
系列的控制信息(又叫指令) ,从而来保证这种可靠的交
流通信。这些指令和硬件通信设备紧密相关 ,因此指令
也不尽相同 ,每种不同的设备有自己的控制信息(指令)
来进行会话的开始。路由器 ( Router) 、程控交换机
(Switch) 、调制解调器(Modem) 都有不同的指令。
● Modem一般都支持 Hayes 公司的AT 指令 ,在Delphi
的编程中 ,通过Mscomm通信控件向Modem发ATDT 指令来
控制Modem的行为 ,保证两方通信的可靠进行。
MSCOMM1. Output =′ATDT′+ char (′# 13′) ;
● Router 一般通过按回车键向 Router 发送控制信
息 ,路由器返回字符串 Router ,表示双方作好传递数据的
准备 ,可以发送数据Mscomm1. Output = char (′# 13′) 。
● 程控交换机由于生产厂家不同 ,控制指令也不
同。笔者所用的交换机联系的控制指令为 Ctrl + Break
键 ,作用是通过前台计算机向交换机发送一个中断请
求 ,交换机回送“?”字符 ,前台计算机收到“?”字符后 ,表
示该次通信的会话可以进行了。
这部分完成以后 ,就可以进行信息的发送与接收
了 ,在笔者的程序中 ,将这部分定义(划分) 成以下函数 :
function process before : boolean ;
Begin
Result : = false ;
向程控交换机发一个中断请求 ; / / 相当于发一个 Ctrl + Break 键
Mscomm1. input =′?′then
Result : = true / / 表示连续成功 ,可以进行会话
Else result : = false / / 无法与交换机通信
End
(3) 信息传送和控制
会话建立以后 ,就可以进行信息的传送了 ,从而达
到操作程控交换机(或其它设备) 的目的。
4 通信控制程序中应考虑的问题
411 循环实时控制
PSTN 市话停开关机实质上是一个循环实时系统 ,必
须能够有效地对市话情况 (这里是针对市话数据表) 进
行实时监测。因为这些数据表时时在变化 ,所以系统必
·951·第 8 期 林 勇等 :Delphi 下用 Mscomm32 实现串行通信
须能循环地控制 ,当然采用 For ,While ,Repeat , ⋯,Until 也
可以 ,但会进入死循环 ,使系统不能有效地完成功能。
本系统采用两个定时器触发控制循环。
(1) Time on。循环控制命令执行情况 ,并及时退出
循环监控对 CPU 的控制权 ,使系统能及时强行退出 (该
时钟在成功登录交换机后激活) 。
(2) Time out。判断端口的状态 ,只有等到端口状态
为空闲(Free) 时 ,才向交换机发送退出指令 ,并且等到退
出确认后 ,才能够退出系统 (该时钟在触发了退出系统
的事件后激活) 。
Procedure Time onTimer (sender :tobject) ;/ / Time on 的激发事件
Begin
If Query1. active = false then
Begin
Query 1. open ;/ / 其中 query1. SQL 语句为
For i : = 1 to query1. recordcount do
Begin
Process pstn ;
/ / 根据交换机操作流程和数据集中
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
,信息进行相应操作
End ;
End ;
Else if query1. Eof then
query1. close / / 即 Query1. active = false
/ / 记录已经操作完毕 ,关闭数据集 ,以使下次重新得到新的满足
/ / 条件的数据集
End ;
Procedure Time outTimer (send :tobject) ; / / Time out 的激发事件
Begin
If 端口状态为空闲 (Free) then / / 退出系统
Begin
Mscomm1. output : =′logout′;
等待交换机的反馈信息 (管理员推出交换机的信息) ;
close ; / / 关闭程序
End ;
End ;
412 系统的可靠性
因为与程控交换机打交道 ,系统的安全可靠性是考
虑的重点 ,尽管 Mscomm控件有通信错误或事件发生时 ,
都会产生 Oncomm 事件 ,为确保 PSTN 系统的信息 ,这里
不采用 Oncomm事件 ,而是采用枚举的方法直接对接收
缓冲区里的信息作判断 ,以接收信息为根据来进行信息
(命令) 的发送(当然 ,对前台计算机来讲 ,发送信息是可
靠的) 。具体代码如下 :
str : = Mscomm . input
IF pos(关键字 ,str) > 0 then
Begin
发送信息来进行市话停开关操作 ;
End
Else if pos ( Error1 关键字 ,str) > 0 then Error (1)
Else if pos ( Error2 关键字 ,str) > 0 then Error (2)
⋯
5 结束语
Delphi 串行通信程序主要用于与硬件设备打交道的
系统中 ,在工业控制中有着广泛的应用。使用控件是
Delphi 的一大优势和特点 ,其编程较为简单 ,Delphi 加上
好的通信控制(如 Mscomm) 来进行串行通信程序的开发
不失为一种好的方式。
参考文献 :
[1 ] 王小伟 1Windows 环境下计算机与高速数字信号处理系
统实时通信[J ]1 计算机应用研究 ,2002 ,19(2) :1302132.
[2 ] 余得彦 1 基于 Delphi 的小型实时数据采集与分析系统[J ]1
计算机自动测量与控制 ,2001 , (3) :632651
作者简介 :
林勇 (19682) ,男 ,重庆人 ,讲师 ,博士研究生 ,研究方向为计算
机网络技术、数据仓库与数据挖掘、计算机技术在建筑行业的
应用 ;应新洋 (19772) ,男 ,浙江人 ,硕士研究生 ,主要研究方向
为数据仓库与数据挖掘、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) 为得到的 PCL 打印文件通过 PCL 文件浏览器看到的
结果。(b) 中采用自生成方式得到灰度描述矩阵 ; (c) ,
(d) 中采用查表方式得到灰度描述矩阵。
由图 3 可以看出 ,自生成方式得到的打印结果有明
显的伪边缘 ,而查表方式得到的打印结果 ,图像纹理则
要相对均匀 ,但同时文件的大小也增加了 40 %左右 ,实
际上是用空间来换取效果。(c) 中所用的灰度矩阵表以
矩形为基础进行排列 ; ( d) 中所用的灰度矩阵表以菱形
为基础进行排列。可以看出 , ( d) 的视觉效果相对于 (c)
而言更柔和 ,而 (c) 有更高的对比度。
参考文献 :
[1 ] HP PCL/ PJL Reference[M]. Hewlett2Packard Co ,1999.
[2 ] 吕凤军 1 数字图像处理编程入门 [M] . 北京 :清华大学出
版社 ,19991
[3 ] 谭浩强 1C程序设计[M] .北京 :清华大学出版社 ,19911
作者简介 :
汤晓军 (19792) ,男 ,硕士研究生 ,主要研究方向为图像压缩与处
理技术芯片设计 ;金莉 (19662) ,女 ,副教授 ,硕士研究生导师 ,研
究方向为智能网络 ;周宁 (19772) ,女 ,硕士研究生 ,主要研究方
向为图像压缩与处理、视频芯片设计 ;梁峰 (19772) ,男 ,硕士研
究生 ,主要研究方向为视频芯片设计、图像压缩与处理。
·061· 计算机应用研究 2003 年第 8 期