串口通信的一种通用模式

2010-10-30 09:13罗如为陈威孝
湖南人文科技学院学报 2010年2期
关键词:文件夹控件串口

罗如为,陈威孝

(贵州大学计算机科学与信息学院,贵州贵阳 550025)

串口通信的一种通用模式

罗如为,陈威孝

(贵州大学计算机科学与信息学院,贵州贵阳 550025)

为了通过通信线路实现异地远程数据的实时传输,提出一种基于串口通信的通用模式:首先应用 zlibEx对数据进行最大化压缩,减少线路传输数据量及传输时间;在进行文件流压缩时,加入 md5算法生成的加密口令,提高数据的安全性;最后根据自定义通信协议将压缩后的文件通过串口进行远程传输。

串口通信;通用模式;zlibEx压缩;实时传输

zlib压缩算法广泛应用于各种数据的压缩。例如压缩数据库或数据库字段值[1],网络中压缩网页数据或实验数据[2],压缩图书馆数字文献[3],压缩监测数据[4]等,使用最广泛的是网络视频或远程屏幕拷贝图像的压缩传输[5]。还有不少软件的远程更新也使用了 zlib压缩。

zlib是用于数据压缩的函数库,zlib压缩算法是一种基于字典的无损压缩算法,当缓冲区中有与滑动窗口 (字符字典)的字符串相匹配的最长的字符串,将该字符串按照LZ77编码,当两个缓冲区中没有相匹配的字符时,便根据字符出现的概率采用自适应的 Huffman编码法进行编码,以编码代替字符串以达到压缩目的,并且在编码的过程中将已编好的压缩码实时地写入压缩文件中。zlib压缩算法有机地结合了 Huffman树编码法和 LZ77编码法的优点,去掉了压缩文件时包含的一些冗余信息,提高了对缓冲区数据的压缩速度,压缩效果更好。

zlib经过不断地修改和添加新的函数,已经改名并更新到现在的 ZlibEx 1.2.3和 ZlibExGZ 1.2.3。

md5是对一段信息产生信息摘要,以防止被篡改。通过 md5不可逆的字符串变换算法,把一个任意长度的字符串变换成一个定长的整数,所以采用 md5加密解压缩所需要的口令,就算得到了压缩文件也不能获得原始口令,不能解压缩文件[6]。

MSComm控件是微软的 Visual Basic中提供的一个串口通信OCX控件。MSComm提供了各种与串口通信密切相关的属性及事件,编程者只需改变MSComm控件的属性设置和编写相应的初始化程序。在 Delphi环境下进行串行通信编程,利用MSComm控件可以灵活地调用功能函数,使程序设计简单、直观,既保证了数据传输的实时性,又方便快捷[7]。

本文在 Delphi环境下首先采用最新的 zlibEx压缩库进行多文件或文件夹的最大化压缩;利用MSComm控件和自定义通信协议将压缩文件通过串口Modem实现远程传输。这种传输模式 (数据采集——压缩——串口发送——串口接收——解压缩)可以推广到其它需要通过串口传输的应用场合,从而作为一种通用模式得以广泛应用。

1 功能模块结构

图1 文件压缩和远程传输流程图

图1为文件压缩和远程传输流程图[8-9]。在 Delphi下,首先将选中的文件变换为文件流,对文件流进行 zlibEx流压缩,并在压缩流中加入加密信息和文件、文件夹信息形成完整的压缩文件;将压缩文件按照自定义通信协议分组打包,通过MSComm控件读写串口、并用 AT指令控制Modem,将压缩文件完整快速地发送到远程接收方。接收方对收到的数据帧组合成完整的文件,转换为文件流,并提取加密信息和文件、文件夹信息,并根据加密口令判断是否正确解压。如果有口令,并且口令正确则将文件流进行zlibEx流解压缩,得到压缩前的文件、文件夹。

2 多文件压缩和解压缩

要在Delphi下完成多文件的压缩,首先将选择的文件、文件夹生成一个列表。针对列表中的文件、文件夹分别由以下四种方式处理:如果是非 0字节文件,则记录文件名和文件大小,并将文件进行 zlibEx流压缩;如果是 0字节文件,则只记录文件名和文件大小,不做压缩处理;如果是空文件夹,则只记录文件夹名,不做进一步处理;如果是非空文件夹,则用递归方法搜索下一级目录,对于搜索结果仍按上述四种方式处理,直至完全遍历所有子目录。

根据以上四种情况的处理,得到所有文件、文件夹信息和所有文件的压缩流。

为了保证正常解压缩,需要约定压缩文件的结构。图2定义的是加密压缩的文件流结构图[8]。加密信息部分包括压缩库标识、是否加密标识、md5加密后的口令;文件夹信息只记录空文件夹的名称;文件信息包括文件名和文件流大小;最后一部分是所有文件的压缩流。

图2 加密压缩的文件流结构图

在解压缩的时候,从文件流中读入压缩库标识,如果不是本程序产生的文件不可解压;如果压缩库标识正确,则判断读入的加密标识,如果已经加密,并且提供的密码不正确,则不允许解压缩。如果没有加密或者已经加密而且解压缩密码也正确,则根据文件夹、文件信息判断,如果是空目录或空文件,则直接创建文件夹、0字节文件,否则根据文件大小解压缩文件流,创建出压缩前的文件。

zlibEx压缩代码如下:

instream:=TFileStream.Create(mFileName,fmOpen-Read or fmShareExclusive);

ZCompressStream(instream,mStream,zcMax);

instream是由 mFileName指定的文件创建的文件流,函数 ZCompressStream是进行 zlibEx流压缩,压缩后的流保存在内存流 mStream中,为了充分减少传输时间,所以压缩级别选择最大 zcMax。

zlibEx解压缩代码如下:

outStream:=TFileStream.Create(mFileName,fmCreate);

ZDeCompressStream(mstream,outStream);

outStream是要创建mFileName指定名字的新文件的文件流,通过函数 ZDeCompressStream将 mstream中的压缩流释放到 outStream中。

通过以上的方法,实现多文件 (夹)的加密压缩和解压缩。当然也可以压缩单一的文件。

3 远程传输

3.1 MSComm和Modem的设置

利用MSComm控件读写串口、向Modem发送 AT指令来实现远程传输,则必须首先熟知MSComm控件的属性和事件。

在MSComm的 PortOpen设置为 True,也就是打开串行端口之前,先初始化MSComm,将一些参数设置完成,如:

1)CommPort:设置串行端口号,可以设置为 1到 16之间的任何值,缺省值为 1。但是如果用 PortOpen打开一个并不存在的端口时,MSComm控件会产生错误 68(设备无效)。

2)Setting:设置串口通信参数——波特率、奇偶校验、数据位、停止位参数。

3)Inpu tMode:设置 0,从接收缓冲区读取文本形式的数据。

4)RThreshold:设置 1,当接收缓冲区内字节个数达到或超过 1就会产生OnComm事件。

5)SThreshold:设置 0,MSComm控件在发送数据时不会产生OnComm事件。

6)InBufferSize:设置接收缓冲区的大小,缺省值为1024字节。

7)InBufferCount:返回接收缓冲区内等待读取的字节数,可设置为 0清空接收缓冲区。

8)Ou tBufferSize:设置发送缓冲区的大小,缺省值为512字节。

9)Ou tBufferCount:返回发送缓冲区内等待发送的字节数,可设置为 0来清空发送缓冲区。

10)InputLen:设置为 0,Input读取接收缓冲区中全部的内容。

本文采用MSComm控件的事件驱动通信方式:当串口发送或接收到数据时,利用MSComm控件 OnComm事件捕获并处理这些通信事件。如果在通信过程中发生错误或异常,也会触发 OnComm事件,通过 CommEvent属性反映错误类型,在通信程序的设计中可根据该属性值来执行不同的操作。

发送文件之前,必须建立通信连接。所以利用MSComm控件向串口Modem发出控制命令,例如:

1)拨号:’ATDT’+电话号码 +#13

2)挂机:’+++’+#13+’ATH0’+#13

3)自动应答:’ATS0=1’+#13

当拨号后成功建立连接,则开始发送文件。为了顺利地发送文件,需定义好通信协议并将待发送数据按协议组包。

3.2 通信

如图 3、图 4定义通信数据帧 (信息帧)的一般格式。

信息帧格式的说明:

命令字:区分不同的操作,如:准备发送文件、发送数据、发送数据完毕、准备接收文件、已接收数据、已保存文件。

验证码:检验信息帧是否属于同一个文件的发送。

校验码:判断信息帧是否完整。

图5 串口发送文件信息流程图

接收方接收到发送方的信息帧后,首先核对帧的大小是否符合协议约定的帧大小,如果不一致,则抛弃该信息帧。如果帧大小正确,则校验该信息帧是否正确,如果信息帧校验失败,则接收方抛弃该信息帧。发送方等待接收方的反馈信息,如果在指定的时间未接收到反馈信息,发送方重发信息帧。如果信息帧校验正确,则接收方将正确接收信息帧的消息发给发送方作为反馈信息,并对信息帧进行相应的处理。发送方接收到反馈信息,进行校验,如果校验成功则表示信息帧发送成功,继续发送下一个信息帧,否则需要重发信息帧。

图5为串口发送文件流程图。通过初始化MSComm,分别对串口和Modem进行初始化,如果发现串口或者Modem出错,向用户提示出错信息。如果初始化成功,则进行拨号尝试建立通信链路,如果连接不成功,则自动重拨,如果超出重拨次数则向用户提示出错。当建立连接后,将待发送的压缩文件读入文件流,计算出流的总长度,并按照通信协议划分文件流组成系列信息帧,向接收方发送,如果发送成功,则继续发送下一个帧;如果超时,则重发。直到整个压缩文件发送完毕。

最后结论是:将增加了加密口令的压缩文件用在串口传输上,在一定程度上增加了传输的安全性。而文件的最大化压缩减少了传输的数据字节数,减少了传输的时间消耗,实现传输实时性。另一方面实现灵活选择用于压缩传输的文件,可以是单文件,也可以是多文件、多文件夹的混合。这种压缩后进行传输的模式,可广泛应用于远程监测设备的数据采集、连锁门店的数据汇总等方面。所以可以作为串口通信的一种通用模式进行推广。

[1]魏峥,万珊.用 Delphi实现对库文件的压缩解压[J].济南大学学报 :自然科学版,2002,16(3):313-314.

[2]左继红,霍剑青,吴葛铭,等.虚拟物理实验的远程教学交互和管理系统 [J].中国科学技术大学学报,2000,30(3):307-311.

[3]汪勇,杨涛,高伟,等.汽轮机组振动波形数据高效实时无损压缩算法[J].华中科技大学:自然科学版,2008,36(9):86-89.

[4]彭伟.局域网图像广播及相关远程控制的设计与实现[D].武汉:华中师范大学计算机科学系,2006.

[5]孙萍.基于 ZLib的数字文献压缩技术的设计与实现[J].农业图书情报学刊,2007,19(11):5-8.

[6]兰顺碧,彭晶晶.医学多媒体在线考试系统的设计与实现[J].网络安全技术与应用,2006(4):60-62.

[7]黄军,熊勇,刘燕,等.Delphi串口通信编程 [M].北京:人民邮电出版社,2002.

[8]wnhoo.用DELPHI实现文件加密压缩[EB/OL].http://dev.csdn. net/author/Jason009/0e90c8556a414b2790df1e2de9a723e5.html,2007-07-13.

[9]王保印,康健,姜传国.用 VC++6.0中 MSComm控件实现多类型文件传送[J].吉林大学学报:信息科学版,2004,22(2):164-168.

(责任编校:光明)

A CurrentMode of Serial Communication

LUO Ru-wei,CHEN W ei-xiao

(College of Computer Science and Information,Guizhou University,Guiyang,550025,China)

To implement real-time transmit long-distance data by communication line,a currentmode of serial communication is presented.Firstly,the data are maximally compressed with the latest zlibEx,and in the process of compression,the encrypted pass word usingmd5 is added,so the security of data can be enhanced.Finally,a series of communication protocols are designed to realize the remote trans missing via serial port.

serial communication;currentmode;compressingwith zlibEx;real-time trans missing

TP311

A

1673-0712(2010)02-0014-03

2010-02-08.

罗如为 (1974-),男,湖南邵东人,贵州大学计算机科学与信息学院在读博士,研究方向:数字图像处理、虚拟现实;陈孝威(1945-),男,贵州贵阳人,贵州大学计算机科学与信息学院教授,博士生导师,CCF会员 (E20-0005528S),研究方向:虚拟现实、数字图像处理及网络通信技术。

猜你喜欢
文件夹控件串口
浅谈AB PLC串口跟RFID传感器的通讯应用
关于.net控件数组的探讨
摸清超标源头 大文件夹这样处理
调动右键 解决文件夹管理三大难题
数字电源内部数据传输的串口通信方法实现
挂在墙上的文件夹
USB接口的多串口数据并行接收方法探索
基于蓝牙串口适配器的GPS接收机与AutoCAD的实时无线通信
不容忽视的空文件夹
ASP.NET服务器端验证控件的使用