收稿日期:2003-02-25
作者简介:张爱民(1978—
),男,湖北仙桃人,硕士研究生,研究方向为计算机网络通信与信息处理。
在VB 中实现基于HDLC 的数据链路层协议
张爱民,吴友宇
(武汉理工大学信息工程学院,湖北武汉430070)
摘 要:介绍了一种基于HDLC 的数据链路层协议,实现了单片机和PC 机之间的无差错数据通信,并使用VB 语言实现。同时也比较了该协议和HDLC 之间的区别,详细说明了协议各部分的功能和内容。关键词:协议;高阶数据连接控制;帧结构;组装
中图分类号:TP393103      文献标识码:A       文章编号:1005-3751(2003)08-0075-02
R ealization of Data Link Protocol B ased on H DLC by Using VB
ZHAN G Ai 2min ,WU Y ou 2yu
(School of Info.Eng.,Wuhan University of Technology ,Wuhan 430070,China )
Abstract :Introduces the protocol of data link based on HDLC and the realization by using VB language.The protocol is used to realize the credible communication between singlechip and PC.Also analyses the difference between the applying data link protocol and HDLC and ex 2plain detailedly the function and content of each part of the frame.K ey w ords :protocol ;HDLC ;frame structure ;assemble
  在自动化的检测和控制系统中,计算机和控制单元
之间需要进行数据交换,以便以更好的人机交互方式实现对设备的控制。由于串行通信是实现两端设备交换数据的主要手段,并遵循统一的标准,因而得到广泛的应用[1]。本系统由PC 和以单片机为核心的检测设备组成,包括主从单片机和A/D 转换器等,实现PC 和单片机之间的通信。PC 可以处理单片机通过串口送来的数据进行处理,同时也可以通过条件的判断对单片机发出指令[2]。由于使用环境的恶劣,在通信中数据易丢失、出错,在物理层无法完成数据的校验,因而在数据链路层采取了一定的措施,最主要的就是使用了基于HDLC 数据链路层协议制定的协议。具体的协议的内容,将在下面的内容中详细说明。
1 通信协议的制定
为满足实际应用的需要,本通信协议是基于HDLC 数据链路层协议制定。本例中,在单片机一方,有三个缓冲区够接收数据使用;在PC 机一方,数据是定时接收,而
VB 程序中提供的接收缓冲区对于本例中的数据量而言,
足够大。因此帧的发送和接收不需要采用特殊方式来限制数据帧的发送和接收。
本协议有如下不同的层。
111 物理层
硬件在RS -232C ,19200b/s 或者9600b/s ,8位,无奇偶校验,1个停止位下运行[2]。
112 介质访问层
数据被组装成帧。介质访问层保证帧的接收者能判断帧的开始。一帧包括同步区、从机名区、长度区、帧序列号、控制字节区、数据区、校验和区。数据区的正确的值必须传给数据链路层。图1是帧的格式。在单片机和控制计算机之间是一样的。
sync
cC omputer
Length
FrameId
C ontrol
Data
Chksm
图1 帧结构示意图
(1)同步区。
帧的开始是用一个特殊的同步字节0X7E 来标识。那么在其他的区域可能有同样的数据出现,我们会做出相应的应对策略。
(2)从机名区。
该区的设置主要的原因是为了将来的系统扩展,目前的应用我们只用到两个单片机,如果需要的话,可以在扩展到最多255个,但是实际情况下,无法达到255个的情况。如果出现了和同步区的数据相同的情况,则在数据组装时,程序自动添加一个0X7E 在该数据的前面。
(3)长度区。
长度区是一个无符号的字节,其作用是来表示帧的数据字节数目。长度区的取值是除同步区和校验和区的所有字节数目,也不包括我们为区别非同步区和同步区数据
第13卷 第8期2003年8月             微 机 发 展Microcomputer Development               Vol.13 No.8Aug.2003
相同而重发的0X7E 特殊字节。长度区的值也不能和同步区相同,如果相同(或大),那么长度区值加1。
(4)帧序列号区。
该区的设置主要是为了数据帧在传送过程中出错时,进行重发时候在指令上容易处理。同样的,如果出现和同步区数据相同的情况,则该数据发送两次。
(5)数据区。
数据区包括组成数据链的信息的字节,其中的内容是数据处理的重点。如果该区中的内容有和同步区相同的内容,那么该字节重发一次,我们在接收方和发送方都需要统一这样的规则。
(6)控制区。
控制区的内容是在实际使用中的几组命令。①对某一系列的地址的写入;②对某一系列的地址的读取;③对某一系列的地址的连续读取;④开启继电器。
(7)校验和区。
校验和区是单一字节,将帧中除去同步区的所有字节加起来(在这些字节数据中,因为和同步区数据相同做出的处理后0X7E ,只算一次),并将结果取反即是校验值。
校验和用于检测传输错误及减少接收到错误数据的可能性。在帧的数据字节被使用前检验和取的数据应该被验证,如果错误的话,要求重发,此时不必要对数据区的数据做出处理。
2 协议具体实现的几个要点
211 同步字节的判断
可以想到,在数据的接收缓冲区,数据不一定是从同步区开始的,有可能是下面这样的数据流:01,27,8
E ,
2D ,7E ,7E ,DC ,7E ,00,02,06,00,51,32,41,9A ,99。
象这样的数据,就涉及到一个同步字节的判断,同步字节之前的数据可以忽略不计。可以通过流程图(见图2)看同步字节的判断方法,参数设置为:
图2 开始标志识别流程图
置一次7E 的判断是否开始标志:One7E J udgeStart 为
0,1:开始,0:结束置已到同步字节标志:Match 2ByteFinded 为0、设置长度字节ByteC ount 、设置数据顺序
号ByteId 、设置校验和checksum 、设置控制命令类型C on 2
trol Type 。212 数据帧的组装
数据帧的组装按照数据帧的格式进行,在PC 机和单片机中都必须按照这样的格式进行,否则会出现数据错误,其原因就是我们在数据帧的拆分和校验和的判断中会按照数据格式划分的数据区进行处理,如果通信的双方没有一个统一的格式标准,必然会产生错误[3]。
按照上面协议的说明,在帧的组装过程中,无论是帧的序列号还是其他的数据区(除长度区外)的数据只要出现和同步区值相同的情况,在该字节后面自动加0X7E 。长度区的处理也如上面的协议进行处理。
Type SendArray
  DataArr ()As Byte End Type
Public SendDataArr (0To 255)As SendArray k =(InfoLength +1)\28’计算出有几帧For j =0To 27’数据区长度为28个
 If CByte (Info Temp (((InfoLength +1)\28-k )328+j ))=126Then
   sum126=sum126+1
 SendDataArr (FrameId ).DataArr (w +4)=126   w =w +1
 SendDataArr (FrameId ).DataArr (w +4)=126   w =w +1
NumberSum =NumberSum
+CByte (Info Temp (((InfoLength +1)\28-k )328+j ))
  Else
SendDataArr (FrameId ).DataArr (w +4)=Info Temp (((InfoLength +1)\28-k )328+j )NumberSum =NumberSum
+CByte (Info Temp (((InfoLength +1)\28-k )328+j ))
    w =w +1   End If  Next j
SendDataArr (FrameId ).DataArr (0)=126SendDataArr (FrameId ).DataArr (1)=MicroComputerName
SendDataArr (FrameId ).DataArr (2)=w -sum126+1,数据长度区的大小
SendDataArr (FrameId ).DataArr (3)=FrameId
’帧序列号
SendDataArr (FrameId ).DataArr (4)=0’控制
类型
  ………………………………
这样在程序中就实现了对数据的组装,数据存储在array在vb什么意思啊
sendDataArr (FrameId ).DataArr 字节数组中。
(下转第79页)
67・                       微机发展                    第13卷
要求有严格的逻辑顺序性的控制系统,则希望尽可能从断点处恢复执行,而不是从整个控制程序入口处从头执行控制程序。一般说来主程序由若干功能模块组成,每个模块入口可设置一个标志,系统故障复位后可以依据这些标志选择进入相应的功能模块,如图2
所示。
图2 故障恢复处理图
5 信号自动检测
最简单的一种检错技术就是使用“许用码”,意为只有有限种可能的二进制数字组合才作为有意义的码子。许用码的一个特例是“等比码”,所有的码子是在n 个码元中有m 个“1”而得到的,“1”的个数是一个定值,亦称n 中
取m 码。微机通讯中普遍采用的
“7中取3”的等比码就有很强的检错能力,一旦出错就要求发送端重发,即“自动反馈重发纠错”。
传输或存储信息时通常在码子后加校验码来校验错误。广泛使用的是“奇偶校验码”,即在二进制源码后加上的校验码是表示源码中“1”或“0”的个数是奇、是偶,它一般只使用于非关键信息。“水平校验码”是把二进码信息的数据分组,把水平方向的码元算出奇偶校验码附加在信息码后,然后按排列次序依次发送垂直方向的码子,既有水平方向校验码又有垂直方向的校验码,因而具有较强的检错能力。还有许多校验码如“博格码”、“权模校验码”、“剩余码”等也用于不同范围。
纠错码中用得最多的是循环码。最早的一种是Ham 2
ming 码,它可以纠正单发错误。后来又有改进的“最佳奇
权码”,能够纠正一位错误同时检测两位错误。另一种纠错码是卷积码,它的译码成分主要分代数译码与概率译码,只要取足够的前若干位,概率码的错误概率可以小于任意一个指定值。
6 结束语
提高应用系统的可靠性除了以上的主要措施外,还应进行程序的校验与检查,在使用过程中随着软件环境的变化不断加以修改和完善,加强软件的寿命周期技术管理。
软件的可靠性应该放在最重要的位置,只有如此系统才能经得起工程和时间的考验。
参考文献:
[1] 何国伟.软件可靠性[M].北京:国防工业出版社,19981[2] 王幸之,王 雷,翟 成.单片机应用系统抗干扰技术[M].
北京:北京航空航天大学出版社,20001
(上接第76页)
3 数据帧的拆分
在PC 端或者单片机端,接收到数据帧后,就需要对数据进行拆分,以便判断数据的正误。
整个数据帧的第3个字节是长度字节,取出其值,作为程序循环的条件来取出其他的数据。最后将我们取出数据后计算得到的值与最后一个字节即校验和值比较,如果相同,说明数据传输是正确的。反之发送重发命令。为了方便对数据帧的处理,在VB 中,采用自定义的类型来储存帧数据信息。如上面的程序段,帧的序列号用变量
FrameId 来描述,数据存储在sendDataArr (FrameId ).DataArr 字节数组中。需要重发的数据帧,可以根据返回
的错误信息,提取FrameId 的值,重发一次序列号等于
FrameId 的数据帧。
4 结束语
数据链路层中对校验和的处理如果要求更准确,可以采用CRC 校验[4]。本例中对数据校验和的处理采取简单一点的处理方法,即所有的帧数据字节相加取反。VB 有着灵活、简单的特点,容易实现控制系
统的扩展。协议的实现在VB 中容易完成,通过数据链路层协议的数据判断,增强了数据的可靠性,对于试验数据的分析也更客观、准确。
参考文献:
[1] 范逸之.Visual Basic 与RS -232串行通信控制(最新版)
[M].北京:清华大学出版社,2001.
[2] Hogan T.PC 机软硬件技术资料大全[M].计 帆译.北京:
清华大学出版社,2000.
[3] 林启隆.Visual Basic for Windows 程序设计[M].北京:清华
大学出版社,1999.
[4] 谢希仁.计算机网络[M ].大连:大连理工大学出版社,
1999.
97・第8期              郑 蕾等:单片机应用系统软件可靠性设计

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。