基于VB6.0的串行通信中的错误预防方法

上传人:飞*** 文档编号:45965826 上传时间:2018-06-20 格式:DOC 页数:4 大小:32KB
返回 下载 相关 举报
基于VB6.0的串行通信中的错误预防方法_第1页
第1页 / 共4页
基于VB6.0的串行通信中的错误预防方法_第2页
第2页 / 共4页
基于VB6.0的串行通信中的错误预防方法_第3页
第3页 / 共4页
基于VB6.0的串行通信中的错误预防方法_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《基于VB6.0的串行通信中的错误预防方法》由会员分享,可在线阅读,更多相关《基于VB6.0的串行通信中的错误预防方法(4页珍藏版)》请在金锄头文库上搜索。

1、1 1 引言引言随着计算机技术特别是单片机技术的发展,通信在诸多领域得到了广泛的应用,技术人员可以通过计算机的串口来获取设备的各种数据,然后利用计算机强大的运算和分析处理功能进行处理,再根据处理的结果发送数据来控制设备。通常通信的型式可以分为两种,即并行通信(Parallel Communication)和串行通信(Serial Communication)。就通信速度来看,并行通信一次的传输量为 8 个位(1 个字节),而串行通信一次只传输 1 个位(也就是一个标准电位状态),很明显,并行通信的传输速度要快得多。但就传输的安全性来说,由于并行通信在传输过程中更容易产生电压衰减和信号间相互串音

2、干扰等问题而使得传输的数据发生错误,相对而言,串行通信一次只传输处理的数据电压只有一个标准电位,因此不容易把数据丢失。不论是采用哪种通信方式,在数据的传输过程中,数据都有可能受到干扰而使得原来的数据信号发生扭曲,此时的接收到的数据当然是错误的,为了检测数据在发送过程中发生的错误,发送与接受必须对数据进行进一步的确认工作。最简单的方式就是使用校验码(CheckSum),其次是使用 CRC(Cyclic Redundancy check Code,循环冗余校验码)。2 2 串行通信串行通信2.1 通信步骤通常情况下,串行通信过程就是交换字符串的数据过程,而数据的交换必须有一定的格式。通信的双方才能

3、根据一定的数据格式针对所传输的数据进行解析,以工业上最常用的 PLC 为例,计算机与 PLC 进行通信时,任何厂牌的机器均会定义通信协议,所谓的通信协议就是服务器端与客户端的通信语言及定义。每一次计算机与设备的数据交换都会有 3 个步骤,(1) 设备要求发送数据时,计算机会发送一组字符串过去通常该字符串的第一个字符就是前导码,设备根据前导码辨认是否应该读取该字符串、该字符属于哪一个命令集,以及用什么格式去解读该字符串等。前导码不会是一般的字符,通常是一些不可见字符(位于 ASCII 码的前 30 个)或很少被使用的符号字符,这是因为避免数据字符与前导码一样而发生错误判断。在前导码之后是后站号,

4、通常是以两个字符代表,单纯以 RS-232 连接的单一设备也许不需要站号的设置,不过如果以 RS-485 进行网络连接,就需要用站号来辨别命令是属于哪一个设备。站号之后就是要设备解读的命令或数据。(2) 当设备收到要求字符串,并经过判断确定后,便会送出计算机所要求的数据同样,数据被送出时会在数据之前加上前导码与站号,计算机也以此前导码与站号判别数据来自何处。(3) 握手计算机端接收到设备发送回来的字符串即进行解读检查的操作,当检查完成后,便再送一个确定的字符串给设备,用以说明计算机端已成功收到字符串;而发送失败,计算机也在该回送的字符串中要求设备重新发送数据。以上 3 个步骤就是计算机与设备数

5、据的发送交换的一般情况,对于不同的设备可能会有不同的数据发送流程,应视具体情况而定。另外,在数据发送时,一般都会加上错误检查机制,最常用的方法是将字符进行计算,而在字符串的最后加上 CheckSum 字符。发送的双方利用 CheckSum 字符的检查而判断出字符串的正确性。2.2 串行通信方法就工业上最常用的串行通信来说,我们在用 VB 开发串行通信程序中通常用到两种方法:(1) 一是利用 Windows 的通信 API 函数;(2) 另一种是采用 VB 标准控件 MSComm 来实现。本文采用第二种方法,其实,MSComm 控件的通信功能实现,实际上也是调用了 API 函数,而 API 函数

6、是由 Comm.drv 解释并传给设备驱动程序的,对于 VB 程序开发者只需知道 MSComm 控件的属性和事件的用法就可以实现操作。在该控件的 Setting 属性设置中,如:MSComm.Setting=9600,N,8,1 就表示所使用的通信端口是以每秒 9600 为的速率进行传输,不进行奇偶校验位的检查,每个数据单元是 8 个位,而停止位是 1 个位。3 3 CheckSumCheckSum 的使用的使用前面提到过的奇偶校验位的使用在于避免传输过程错误的发生,导致数据的不正确;不过,由于在串行通信中每一组的传输过程最多只有一个字节,而奇偶校验位的检查也是针对一个字节。当传输的数据量增大

7、时,如何确保数据的正确性?一般的做法也是类似奇偶校验位的方式,将检查码放到所发送的字符串中同时发送到接收端,接收端再对数据进行一次检查码的确认,而检查码的使用最常见的就是CheckSum。CheckSum 的实际做法因设备的不同而异,主要的做法是将双方发送的字符串中的字符一一地进行相加(以对应的 ASCII 码),再对 255 或者 128 取余数,所得的余数即为 CheckSum。部分的做法是将该余数当成一个字节含在原来发送的字符串尾端送出;还有一种是将该余数转成两个字符,并含在原来的字符串尾端送出,现在我们对 255 取余数示范第二种情况。针对 CheckSum 的计算,首先必须将所要发送

8、的字符串中的字符一个个地转换为 ACSII 码中所对应的号码。在 Visual Basic 中,将一个字符转换为 ASCII 码的函数就是 Asc 函数例如:No1=Asc“$”所返回的结果就是字符”$”在 ASCII 码中的号码(结果是 36)。根据该号码将全部发送字符的 ASCII码相加,所得的数值取十六进制,并取该十六进制中的最末端两位,即为 CheckSum 的结果。程序的部分代码如下:checksum = 0 初始化For i = 1 To BuFLenBuf = Mid(InBuf, i, 1) 取出字符和另一个则是在接收到对方传来的字符串后,再一次计算其 CheckSum 的结果

9、,并和字符串尾端的 CheckSum 结果进行比较,确认结果的正确性。因此笔者分别就这两个部分开发了两个函数。4.1 发送端函数 OutCheckSum用于处理所要送出的字符串,只要将所要送出的字符串传入,返回的结果字符串即已经过 CheckSum处理,其流程图如图 1 所示:图 1 输出命令时的 CheckSum 流程图而程序编写则如下:Function OutCheckSum(InBuf As String) As StringDim BufLen As Integer, Buf As StringDim i As IntegerDim CheckSum As LongBufLen = L

10、en(InBuf) 取得传入字符串的长度CheckSum = 0 初始化For i = 1 To BufLenBuf = Mid(InBuf, i, 1) 取出字符和当该判断式不成立时,则返回第 3 个参数。我们用来判断所形成的 CheckSum 是一位数还是两位数,一般均要求 CheckSum 字符串必须是两位数,故不足的位数前面必须加上一个 0。4.2 接收端函数 INCheckSum 用于处理接收到的返回字符串,只要将所接收到的字符串传入,返回的结果字符串即已经过CheckSum 检查,并删除 CheckSum 及结尾字符,其流程如图 2 所示:图 2 检查返回结果的 CheckSum 流程而程序编写如下:Function InCheckSum(InBuf As String) As StringDim BufLen As Integer, Buf As StringDim i As IntegerDim CheckSum As LongBufLen = Len(InBuf) 取得传入字符串的长度CheckSum = 0 初始化For i = 1 To BufLen - 3 需扣掉两个 CheckSum 字符和结尾字符Buf = Mid(InBuf, i, 1) 取得字符和而接收到数据后,送入INCheckSum 进行再一次的确认,即可建立错误预防机制了。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 资格认证/考试 > 其它考试类文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号