用Delphi实现上位机和单片机的串行通信

----------------------- Page 1-----------------------

计 算 机 与 现 代 化
 2002 年第2 期 J ISUANJ I YU XIANDAIHUA 总第78 期

( )
文章编号:10062475 2002 02002803

用Delphi 实现上位机和单片机的串行通信

王清亮 ,万国金 ,李迟生 ,况家花

(南昌大学电子信息工程学院, 江西 南昌 330029)

摘要: 介绍了利用Delphi 软件实现上位机与89c51 单片机的串行通信。此方法简单可靠、便于移植、实用性较强。

关键词: 串行通信;上位机;Delphi ;单片机
中图分类号: TP273+ 5 文献标识码 : B

The Realization of Serial Communication between Uppercomputer

and Microcontroller by Applying Delphi Software

WANG Qingliang ,WAN Guojin ,LI Chisheng ,KUANGJiahua

(School of Electronic Information Engineering ,Nanchang University ,Nanchang 330029 ,China)

Abstract :Introcuces a method of serial communication between uppercomputer and 89c51 microcontroller by applying Delphi sofware.

This method is simple ,reliable and easy to transplant ,and it has higher application value.

Keywords :serial communication ;uppercomputer ;Delphi ;microcontroller

说 ,只需要设置和监视MSComm 控件的属性和事件。
0 引 言
其属性和事件在这不详诉 ,本文只说明几点注意事
随着微电子技术的不断发展,单片机已逐渐成为 项。
一种智能型、综合型控制器 ,用它来进行数据采集、存
储及实时控制。工程实际中,一般还要实现单片机与
上位机的串行通信 ,使上位机能对现场数据进行汇

集、整理和分析。Borland 公司推出的Delphi 是目前
流行的软件开发工具,本文就是介绍用Delphi 来实现
上位机与89c51 单片机的串行通信方法。

1 实现方法

1 上位机与 89c51 单片机的串行通信硬件连接
如图1 所示 ,采用的是RS232 串行总线标准。 图1 上位机与89c51 单片机的串行通信硬件连接示意图
2. 通信流程。由上位机与 89c51 单片机通过一
系列应答联络后 ,从后者获取串行数据。其流程如图 InputMode :接收数据的类型。置 1 ,为二进制方
2 所示。 式;置0 ,为文本方式。实际项目是传输数据 ,我们必
须把它置 1 ,

否则接收时会出现乱码。
本文使用串行通信控件MSComm ,实现上位机与
Rthreshold :设定在接收几个字符时触发OnComm
89c51 单片机的串行通信。此控件封装了RS232 的
许多底层操作函数 ,我们只需要关心控件提供的对 事件。实际项目中,数据收发直接用 Input 、Output 属
Windows 通讯驱动程序的 API 函数的接口。换句话 性实现 ,没使用OnComm 事件 ,因此把它置0 。
PortOpen :设置或读取串口的状态。数据通信前 ,

收稿日期:20011023
( )
作者简介:王清亮 1975 ,男,江西南昌人 ,南昌大学通信与信息专业硕士研究生 ,研究方向:通信与信息系统。

(C) 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved. https://www.360docs.net/doc/9716909915.html,

----------------------- Page 2-----------------------

2002 年第2 期 王清亮等:用Delphi 实现上位机和单片机的串行通信 29

必须打开串口;数据通信结束后 ,必须关闭串口。而 if MSComm. PortOpen then
且在初始化串口前 , 串口如是打开的,必须先关闭串 MSComm. PortOpen : = false ;
口,否则会出现串口已经打开的错误提示。 MSComm. CommPort : = 1 ; / / 初始化串行口

 MSComm. InBufferSize : = 4096 ;

 MSComm. Settings : = ’9600 ,n ,8 ,1’;

 MSComm. InputMode : = 1 ;

 MSComm. RThreshold : = 0 ;

 mscomm. PortOpen : = true ;

 MSComm. InBufferCount : = 0 ;

( )
 setlength ByArInData ,18 ;

( )
 setlength ByArOutData ,1 ;

 ByArOutData [0 ] : = 170 ; / / 检测硬件是

否连接

 MSComm.output : = olevariant (ByArOutData) ; / / 上位机发

送联络信号 ’AAH’

 count : = GetTickCount () ;

 while GetTickCount () < count + 2000 do / / 延时2 秒

 begin

InBufCnt : = MSComm. InBufferCount ;

if InBufCnt > 0 then break ;

 end ;

 if InBufCnt < = 0 then

 begin

图2 上位机与89C51 单片机的串行通信流程图 MessageBox (frcommun. handle ,’硬件没有连接或工

)
作 ,检查后重新开始 !’,’错误’,MB OK ;
Input 、Output :这两个属性操作的数据类型都是 exit ;
olevariant 型,我们用可变数组与之对应。 end

 else
2 示例程序
 begin

实际项目目的,是上位机与 89c51 单片机通过一 ByArInData : = MSComm. Input ; / / 接收单片机返回的
系列应答联络后 ,单片机开始向上位机发送存在 IC 联络信号
卡中的数据 ,每帧 18 个字节 ,其中起始符、结束符各 if ByArInData [0 ] < > 170 then
占一个字节 ,有效数据占16 个字节。上位机则接收 begin

(
MessageBox frcommun. Handle ,’数据有错误 ,请检查后
数据 ,一帧一帧地接收,并按字段存入数据库的相应

)
重新开始 !’,’错误’,MB OK ;
表中,直到数据通信结束。由于技术原因,本示例程
exit ;
序只列出串行通信程序中最基本的部分。
 end ;
先新建一工程 commun ,在其窗体内插入通信控 ByArOutData [0 ] : = 171 ;

件MSComm ,添加数据通信菜单 , 以下程序就是这一 MSComm.output : = olevariant (ByArOutData) ; / / 上位机发
菜单所对应的程序。 送联络确认信号 ’ABH’

procedure TFrCommun.N2Click (Sender : TObject) ; inflag : = 1 ;

var MSComm. InputLen : = 18 ;

 ByArInData , ByArOutData :array of byte ; end ;

 count : cardinal ; while inflag = 1 do

 InBufCnt :smallint ; begin

 inflag :integer ; count : = GetTickCount () ;

begin while MSComm. InBufferCount < 18 do

 InBufCnt : = 0 ; begin

 inflag : = 0 ; if GetTickCount () > count + 1000 then

(C) 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved. https://www.360docs.net/doc/9716909915.html,

----------------------- Page 3-----------------------

30 计 算 机 与 现 代 化 2002 年第2 期

begin else

(
MessageBox frcommun. Handle ,’数据录入意外中断, ByArOutData [0 ] : = 173 ; / / 上位机发送要求重发信

)
请检查设备 !’,’系统信息’,MB OK ; 号 ’ADH’

( )
mscomm. PortOpen : = false ; / / 异常结束 MSComm.output : = olevariant ByArOutData ;

exit ; end ;

end ; end ;


 end ; end ;

 ByArInData : = MSComm. Input ; / / 上位机接收单片机发 end.

送的数据
 if ByArInData [0 ] = 186 then 3 结束语

 begin 串行通信的方法还有很多, 如采用 Microsoft

(
MessageBox frcommun. Handle ,’数据录入完成 !’,’系
( )
win32 应用程序编程接口 API 所提供的串行通信函
)
统信息’,MB OK ;
数 ,直接用它们实现底层的通信控制 ,这样更加灵活 ,
mscomm. PortOpen : = false ; / / 接收到结束标志 录入
只不过编程要复杂一些。软件开发工具也很多,如
完成
VC+ + ,VB 等 ,由于在实际项目中,由于数据通信完毕
exit ;
 end 后还要进行数据处理 ,涉及到许多数据库操作 ,因此
 else 选择了Delphi 、SQLServer 数据库 ,取得了理想的效
 begin 果。本方法是通用和普适的,结合实际情况稍加修改
if (ByArInData [0 ] = 174) and (ByArInData [ 17 ] = 174) 就可用于其它串行通信项目。

then

begin 参考文献:

save date [1] 张敬华 Delphi 5 开发与应用[M] . 北京:北京航空航天

/ / SaveData (ByArInData) ; / / 把接收到的数据存 大学出版社 ,2000 ,4

( )
到数据库中 本文略 [2 ] 洪锡军 ,等 Windows 9x 下的串行通信技术讨论[J ] 计

ByArOutData [0 ] : = 172 ; / / 上位机发送帧正确接 算机工程 ,2001 ,1

收信号 ’ACH’ [3] 王本军 深入分析串行通信[J ] 电脑编程技巧与维护 ,

end
2000 ,12

(上接第27 页)

参考文献:
3 结束语 [ 1] 梁书斌 ,等 Visual C+ + 6. 0 高级编程[M] 北京:清华大

本文利用Visual C+ + 6. 0 下的ActiveX 控件

以及 学出版社 ,1999 ,1

[2 ] [ 美]Marshall Brain & Lance LovetteMFC 开发人员指南
多台数控设备的 RS - 232 串行通信功能, 实现了
[M] 北京:机械工业出版社 ,1999
Windows98 环境下单台PC 机向多台数控设备传送数
[3] CHARLES A.M. ,ANDRE T. ,贺军 ,等 Windows98 通信编
控代码的目标 ,通过这种方法开发出的整个控制系统
程[M] 北京:清华大学出版社 ,1997 ,12
可以方便快捷地解决计算机与数控设备间的串行通 [4 ] 林章均 ,等 PC/ Pentium 硬、软件系统解析[M] 北京:清
信问题 ,系统界面友好 ,易于操作 ,具有实用性。 华大学出版社 ,1996

(C) 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved. https://www.360docs.net/doc/9716909915.html,

相关文档
最新文档