一种微机与单片机远程通信的实现方法

时间:2022-10-15 12:03:18

一种微机与单片机远程通信的实现方法

摘要:本文通过一个具体的实例阐述在Delphi下基于ActiveX控件MScomm实现串口读写,结合AT命令控制Modem与远程单片机8031通信的方法。为了有效地进行数据传输,作者还设计了一套简单的数据通信协议。

关键词:Delphi; 远程通信; 串口; Modem; ActiveX

中图分类号:TP393文献标识码:A文章编号:1009-3044(2007)18-31589-02

Implement of the Remote Communication between the Computer and the Singlechip

ZHAO Li-ping

(Dept. of Computer Science & Technology, Jilin Railway Vocational Technology College, Jilin 132001, China)

Abstract:This paper focuses on how to develop remote communication program between the computer and remote singlechip on the platform of windows. Through a concrete project, it first introduces the way to read/write serial port under Delphi with the ActiveX control MScomm and how to control the Modem, for better quality of communication, a single protocol is also proposed.

Key words:Delphi; Remote Communication; Modem; Serial Port; ActiveX

1 引言

计算机之间及计算机与外部设备的远程数据通信应用得越来越广泛。在应用系统开发中,需要系统开发者自己解决通信问题。Delphi是Borland公司推出可视化集成开发环境,具有其强大的功能和易用性。但是由于Pascal语言对硬件编程能力问题较弱,在一定程度影响到使用Delphi进行串口通信编程。因此本文以一个远程数据采集项目为例,着重阐述在Delphi下基于ActiveX实现远程数据通信的一般方法。

2 远程通信系统需求

如图1所示的一种主从式远程通行模型,其主要任务是通过各个测量站终端机采集每半小时的水位和雨量数据,并发回中心站存入到数据库,然后再进行统计分析。该系统的数据通信在数据采集工作站和终端机之间进行,中心站是每半小时主动与终端机连接,而终端机则一直被动等待,主要工作流程是:终端机通过8031单片机,每隔一分钟读取一次传感器的数据,将半小时数据汇总,存储在RAM中;终端机内可保存3个月的数据,从而提供一定的数据备份;8031单片机监视Modem芯片状态,响应通信呼叫,握手连接成功后,就根据中心站的命令报文进行相应操作。数据采集工作站每半小时依次拨号连接各个终端机,连接成功后,就向终端机命令取数据或进行时间同步。

图1 系统结构图示意图

3 远程通信连接建立

由于Modem一般是通过串口与计算机相连,因而建立连接的主要问题就是如何通过串口读写数据和控制Modem来建立与目标终端机的连接。

3.1 Delphi下串口通信方式

在Delphi下进行串口通信的编程一般有三种方法:(1)利用Windows操作系统的通信API函数,可实现的功能非常丰富、应用面也比较广泛,使用API编写通信程序较为复杂; (2)利用汇编语言直接读写串口,可直接对硬件底层进行操作。嵌入式汇编的混合编程对开发者的能力要求较高,实现较为困难; (3)利用Microsoft公司所提供的ActiveX通信控件MScomm。该控件事实上是windows下标准通信API函数的有机集成,以属性和事件的形式提供了通过串行接口收发数据的简单方法。只要在程序中设置和监视MScomm控件的属性和事件即可完成对串口通信程序的设计,因而本系统采用该控件来实现远程数据通信。

在Delphi中使用MScomm控件必须先进行注册。在安装了Visual Studio 的开发工具VB或VC后,该控件就已经自动注册在操作系统。注册时先打开Delphi,选择ComponentImport ActiveX Control,在已经安装的ActiveX控件列表中选择Microsoft Comm Control,点击install按钮,然后按提示操作进行即可。

3.2 MScomm控件的主要属性和方法

使用MScomm控件实现串口通信,首先需要清楚标准RS232串口的五个引脚的高/低电平状态分别对应MScomm控件相应属性的True/False 值。其中DTR线表示PC机是否已准备好;RTS线表示PC机是否允许Modem发回数据;DSR线表示MODEM是否已做好操作准备;CTS线表示MODEM是否允许发送数据;CD线表示MOEDM已经与呼叫的远方MODEM处于连结状态。与以上五个状态相对应的MScomm控件的属性分别为:DTREnabled、RTSEnabled、DSRHolding、CTSHolding和CDHolding,在实际的编程当中,一般只需要检测这几个属性值就可以判断连接状态。为了收发数据另外还需用到其它属性。

3.3 MScomm控件支持串行通信的方式

(1)查询方式:查询方式是最直接的一种方式,软件循环检测MScomm控件的当前属性,检测到预定的状态变化时,就进行相应的操作,但是查询会占用大量的CPU时间。

(2)事件驱动方式:当有数据到达串行端口或端口状态发生变化时自动触发oncomm事件,在事件处理函数中通过查询commevent属性来判断事件性质进行相应处理。这种方式编程简单,但有时并不可靠。

因此,本文提出的方法是综合以上两种方式的优势:基于查询进行连接或收发数据,根据事件来处理通信过程的各种异常。

3.4 控制Modem通信的AT命令

Modem应能识别并执行标准的AT命令或命令串,用于通信连接的AT命令(一般命令格式是在以AT标识符开始,命令或命令串后加回车字符#13结束)如下:

Dn:拨号,n代表电话号码或拨号参数;

E0/E1:在命令状态关闭/打开字符回应;

+++:从数据传输状态切换为命令状态(前面不需要加AT,后面也不需要回车符);

H0/H1:挂机/摘机;

V0/V1:以数字/字符形式显示结果码。

3.5 串行通信连接的建立流程

本系统的设计采用了如图2的流程来建立通信连接:

图2 通信连接的建立流程图

4 数据传输协议设计

对于主从式的远程数据通信,本文采用停止等待协议,一方发送一个报文之后,在等待对方应答之后才能继续发送。

4.1 报文格式

通信协议报文的通用格式如下,其中的同步头固定为E9E9;数据长度为整个报文的长度(不包括同步头);报文类别主要用于区分各种报文类型;校验和为整个报文(不包括同步头)的CRC校验和。

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

以下是几种主要的报文应用:

(1)采集工作站终端机

取数报文:要求终端机传送设备状态和新采集的、未传送给采集工作站的雨量和水位数据,(终端机为每一组采集的数据设有一个标志,用于表示是否已经成功发送给采集站);

确认报文:在收到终端机的数据之后,采集工作站发送此报文表示数据已经收到,终端机在收到此报文之后,才将成功发送数据标志设为1。

时间同步报文:每隔一天采集工作站就发送一次该报文,同步一次时间。

(2)终端机采集工作站

数据及设备状态报文:此报文包含测站各设备是否正常的标志及最近所采集的雨量和水位数据;

确认报文:用于在收到时间同步报文并成功更改时间后,发回采集工作站加以确认。

4.2 通信过程

详细的读取数据通信流程如图3所示,具体实现参见程序框架部分。

5 远程通信程序框架

基于Delphi实现以上通信程序时,首先在用于通信的窗体中加上一个mscomm控件和两个timer控件(一个用于判断连接状态,一个用于接收数据报文),下面给出主要的函数调用:

拨号函数dial:

图3 数据收发的过程

procedure dial(phone:string,); begin

init_port;//调用初始函数,用于初始化串口的参数及Modem的参数

mscomm1.output='atdt'+phone+#13; //拨号

timer1.enabled:=true; //启动定时器

end;

用于连接的定时器timer1的ontimer事件:

procedure TForm1.Timer1Timer(Sender: TObject);

packet:vairant; begin //定义存放报文数据的变体,MScomm控件要求发送/接收的数据类型为变体

if (mscomm1.CDholding) and (mscomm1.ctsholding)thenbegin

get_packet(packet); //调用函数组装命令报文

send_packet(packet); //调用函数发送报文

timer2.enabled:=true; //启动接收定时器,等待接收

timer1.enabled:=false; //关闭连接定时器

end else begin

connect_time:= connect_time +1; //连接时间标志加1

if (connect_time >max_times) then //如果连接时间标志大于设置的最大值,说明超时

error_process; //调用错误处理函数,主要是关闭串口,结束本次连接

end;

用于接收数据的定时器timer2的ontimer事件:

procedure TForm1.Timer1Timer(Sender: TObject);

var str:vairant; success:boolean; //定义变体

begin

if (mscomm1.CDholding) and (mscomm1.ctsholding) then

begin

if mscomm1.inputlen>0 thenbegin //如果缓冲区内有数据

str=mscomm1.input; //取数

success:=packet_process(str); //调用报文处理函数,这个函数的主要作用是将收到的数据存到一个数组内,然后每次调用时都试着从中析取有效报文,析取后再判断校验和是否正确,是则返回true

if success then begin

timer2.enabled:=false;

send_packet(success_packet);

end

end;

receive_time:=receive_time+1; //接收时间标志加1

if (time_over>max_times) then //如果接收时间标志大于设置的最大值,说明超时

error_process; //调用错误处理函数,主要是关闭串口,结束本次连接

end;

6 结束语

基于组件技术实现通信控制是一种比较快捷的开发方式。本文通过一个具体的应用,对主从式通信需求进行了分析设计,给出了Delphi下采用ActiveX控件MScomm支持通信连接的建立和数据收发的方法,以及具体程序实现的流程和框架。该方法也同样适用于MScomm的VB和VC编程环境下的串口通信应用开发。

参考文献:

[1] 陈坚, 孙志, Modem. 通信编程技术. 西安:西安电子科技大学出版社,1999,7.

[2] 胡庆云, 罗飞路. VB6.0中通信控件的应用. 微计算机信息,2001(2):40-41.

[3] 谈士力, 张海洪. 基于VB的PLC与微机通讯及其应用. 系统工程与电子技术, 2001(9):91-94.

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

上一篇:浅析基于MPLS的虚拟专网技术 下一篇:移动播客的发展及产业模式研究