基于spcp技术串口实现双机通信

更新时间:2024-06-22 22:02:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

目 录

摘要 ...................................................................... III Abstract .................................................................... V 第一章 串行通信的介绍 ...................................................... 1

1.1 串行通信方式 ........................................................ 1 1.2 串行通信的传送方向 .................................................. 2 1.3 串行输入/输出 ....................................................... 2 1.4 串行接口标准 ........................................................ 2 第2章 串口编程技术 ......................................................... 5

2.1 串口实现双机互联系统功能概述 ........................................ 5 2.2 VB串口查询法的实现方法 .............................................. 5 第3章 SPCP通信协议设计 .................................................... 9

3.1 串行通信协议 ........................................................ 9 3.2 SPCP协议的发送格式 ................................................. 13 第4章 双机互联程序的实现 .................................................. 15

4.1 创建标准的项目文件 ................................................. 15 4.2 加入串口通信控件 ................................................... 15 4.3 设计程序主窗体 ..................................................... 16 第5章 程序的测试与运行 .................................................... 21

5.1 软件及硬件测试 ..................................................... 21 5.2 总结 ............................................................... 24 附录 ....................................................................... 25

II

串口实现双机通信

摘要

计算机串口编程在通信软件中有着十分广泛的应用,如电话、传真、视频和控制等。很多行业会涉及到串口通信技术。串行通信中分为异步通信和同步通信两种基本串行通信方式,串行通信在两个设备之间传输,有单工、半双功、全双工三种形式。

在本论文中,串口实现双机互联是通过串口线直接连接两台计算机,按照自定义的串口通信协议(简称为SPCP)进行信息交换。通过VB中MSComm控件处理底层串口通信细节,根据自定义串口通信协议建立连接,实现聊天和文件传输功能。

关键字:VB,串口通信,SPCP,数据交换。

III

IV

serial communication

Abstract

Serial computer programming in the communications software has a very wide range of applications, such as telephone, fax, video and control. Many industries would involve serial communication technologies. Serial communication is divided into asynchronous communications and synchronous communication are two basic serial communication, serial communication between the two transmission equipment, a single-workers, half-duplex, full-duplex three forms.

In this paper, to achieve double-serial-line Internet directly through the serial port to connect two computers, in accordance with the custom of serial communication protocol (referred to as SPCP) for information exchange. VB MSComm control through treatment in the bottom of serial communication details, according to custom serial communication protocol to connect, and chat and file transfer feature.

Keyword: VB, serial communication, SPCP, data exchange.

V

VI

第一章 串行通信的介绍

1.1 串行通信方式

在计算机与外设之间的信息传送中,按照一次传送数据的位数分类,可分为:并行传

送方式和串行传送方式。并行传送方式为数据的各位同时传送;串行传送方式为数据的各位按一定的顺序逐位分时传送。串行传送适用于长距离通信系统及各类计算机网络。由于信息在一个方向上传输只占用一根传输线,而这根线上既传送数据,又传送联络信号,为此为区分这根线传送的信息流中,哪一部分是联络信号,哪一部分是数据,就必须引出串行通信的一系列约定。于是,在串行通信中就有异步通信和同步通信两种基本串行通信方式。

1.1.1 异步通信

异步通信有字符格式和波特率两项约定。

字符格式:传送一个字符总是从传送一位起始位(0)开始,接着传输字符本身(5~8位),传送字符从最低位开始,逐位传送,直至到传送最高位,接着传送奇/偶校验位,最后传送1位或1个半位或2位停止位(1)。从起始位开始到停止位结束,构成一帧信息。一帧信息传送完毕后,可传送不定长度的空闲位(1),作为帧与相邻帧之间的间隔,也可以没有空闲位间隔。

波特率:是单位时间内传送二进制数据的位数,以位/秒为单位,即波特。异步通信传送速度一般在50~9600波特范围内,用于传送信息量不大,传送速度要求较低场合。 1.1.2 同步通信

同步通信中使用的数据格式根据所采用的控制规程(通信双方就如何交换信息所建立的一些规定和过程称为通信控制规程)又可分为面向字符型和面向位(比特)型两种。

面向字符型的数据格式又有单同步、双同步、外同步之分。

单同步:发送方先传送1个同步字符,再传送数据块,接收方检测到同步字符后接收数据;

双同步:发送方先传送2个同步字符,再传送数据块,接收方检测到同步字符后接

- 1 -

收数据;

外同步:用一条专用线来传送同步字符,以实现收发双方同步操作。三种同步方式,均以2个字节的冗余检验码CRC作为一帧信息的结束。

面向位型:根据IBM的同步数据链路控制规程SDLC,SDLC数据格式,同步传送,接收和发送时钟对于收/发双方之间的数据传送达到同步是至关重要的。在发送方,一般都是在发送时钟的下降沿将数据串行移位输出;在接收方,一般都是在接收时钟的上升沿将数据串行移位输入。

1.2 串行通信的传送方向

串行通信在两个站(或设备)A和B之间传送,有单工、半双工、全双工三种形式。

单工:仅能进行一个方向的传送,即A只能作为发送器,B只能作为接收器; 半双工: 能交替地进行双向数据传送,但两设备之间只有一根传输线,因此两个方向的数据传送不能同时进行;

全双工: A、B之间有两条传输线,能在两个方向上同时进行数据传送。

1.3 串行输入/输出

串行输入的特点:串行数据传输中,每次只传送一位数据,速度比并行传输慢。但是,实现串行传输的硬件具有经济性和实用性的特点。

1.4 串行接口标准

RS-232、RS-422与RS-485都是串行数据接口标准,最初都是由电子工业协会(EIA)制订并发布的.RS-232、RS-422与RS-485标准只对接口的电气特性做出规定,而不涉及接插件、电缆或协议,在此基础上用户可以建立自己的高层通信协议。

RS-232串行接口标准目前RS-232是PC机与通信工业中应用最广泛的一种串行接口。RS-232被定义为一种在低速率串行通讯中增加通讯距离的单端标准。RS-232采取不平衡传输方式,即所谓单端通讯。收、发端的数据信号是相对于信号地.典型的RS-232信号在正负电平之间摆动,在发送数据时,发送端驱动器输出正电平在+5~+15V,负电平在-5~-15V电平。当无数据传输时,线上为TTL,从开始传送数据到结束,线上电平从TTL电平到RS-232电平再返回TTL电平。接收器典型的工作电平在+3~+12V与-3~

- 2 -

-12V。由于发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kΩ。所以RS-232适合本地设备之间的通信。

- 3 -

- 4 -

第2章 串口编程技术

在Microsoft Windows 下开发串行通信目前通常有如下几种方法:一是利用Windows API通信函数;二是利用 windows 的读写端口函数_inp、_inpw、_inpd、_outp、_outpw、_outpd、(Windows95系列下)或开发驱动程序(WindowsNT系列操作系统下)直接对串口进行操作;三是利用第三方提供或自己编写的通信;四是使用串口通信组件,如ActiveX控件MSComm 。

MSComm控件:(Microsoft Communication Control)是微软公司提供的简化windows下串口通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法,在VisualBasic、VC、Delphi等语言均可使用。

以上几种方法中第一种使用面较广,但由于比较复杂,使用较困难;第二种需要了解硬件电路结构原理,深入驱动层次,专业化程度较高;第三种方法使用面向对象技术封装Win32API函数,提供一个用于串行通信的类,只要理解这种类的几个成员函数,就能方便的使用,但能普遍应用的这种类相当困难;第四种方法较简单,对于 Visual Basic,常用的方法就是使用第四种方法。本文将用第四种方法实现双机通信。

2.1 串口实现双机互联系统功能概述

双机互联程序通过串口将两台计算机连接起来,按照自定义的串口通信协议(简称为SPCP)进行信息交换,实现通过串口进行聊天、文件和收发的功能。

SPCP协议设计思想基于帧传输方式,即在向串口发送数据时是一帧一帧地发送。对于上层应用(如文件传输)来说,应用程序所发送的和所接收的都是流式数据,即如果应用程序需要进行上层的协议解释的话,它将面对的这些流数据重新拼装。为保证可靠的传输,在传输开始前,通过协议建立连接。来确定是否要接收数据,是否保存等。

2.2 VB串口查询法的实现方法

2.2.1 串口查询法的机理

VB的串口查询法是一种主要工作在查询方式下的实现方法。当通信程序工作在“查询”方式时,可以不考虑Win95的进程和线程的问题。仅在串口有数据时,去读串口缓

- 5 -

冲区就可以了。这种方法下确定串口读取的时机、握手协议及软件纠错的实现是程序员应考虑的主要问题。

以下是读取接收缓冲区数据时的流程图:

读数据

结束 无 缓冲区中有无数有 获取当前通信设备的数据 由于这种方法主要工作在查询方式。程序员必须完成相当一部分通信状态的检测工作,许多细节(甚至包括通信过程中的字符属性的转换)也必须通过程序代码完成。因而相比较通信控件方法而言,这种查询方法对通信双方协议的依赖性尤其大。双方通信协议的约定对程序实现的难易程度影响很大。

串口查询法中,一般串口初始化的流程如下:

设置设备控制块

设置通信参数 打开串口 设置缓冲区大小 值得注意的一点是,此方法下协议的约定必须满足以下条件:即甲方发送时,乙方必须在甲方发送动作之前进入循环接收状态,直到接收到字符后通过对串口读取函数

- 6 -

ReadFile返回值的判断跳出循环状态。 同时,一般为了不使系统因循环等待接收而进入“死循环”状态,可以人为设置读取串口的循环次数,一般1000~10000次即可。VB是一种极为灵活的高级语言,因而在这种方法下可以方便地引入汇编语言的思维,利用其GoTo转向语句方便地控制程序的流程。非常灵活方便。 2.2.2 与通信线程法的比较

通信线程法通过在应用程序的主线程外再创建一个通信线程来监视通信设备,其最大优点是程序对接收数据具有自主觉察能力。一旦通信线程查询到数据已发送到串口上,线程自动向应用程序发送一个数据接收到的消息,应用程序可用该消息来读取通信设备传来的数据。并且使用通信线程还不占用CPU时间。这样系统实际上具有了同时控制多个通信设备(如MODEM)的能力。通信线程法在C++的开发系统中用得较多,这与C++的特点和优势密切相关。由于VB自身的特点,创建通信线程的方法对VB而言,实现上有相当的难度。而且这样做,也无异于牺牲VB的简单方便性而去迁就程序的复杂性,很不经济。串口查询法容易地引入了汇编语言的一些思维,实现了最精简的程序代码。它不一定是最完善,但对一般VB程序员来说,这种方法确实达到了简化思路和降低难度的目的,因而实现简单。

- 7 -

- 8 -

第3章 SPCP通信协议设计

以下设计的串口通信协议用于完成本文双机互联程序的文件传输功能,简称为SPCP(Serial Port Communication Protocol)。SPCP设计思想基于帧传输方式,即在向串口发送数据时是一帧一帧地发送。对于上层应用(如文件传输)来说,应用程序所发送的和所接收的都是流式数据,即如果应用程序需要进行上层的协议解释的话,它将面对这些流数据的重新拼装。为保证可靠的传输,在传输开始前,通过握手建立连接与TCP/IP协议类似。

3.1 串行通信协议

3.1.1 异步通信协议的实例——起止式异步协议

----------- 图3.1. 起止式异步协议

特点与格式:

起止式异步协议的特点是一个字符一个字符传输,并且传送一个字符总是以起始位开始,以停止位结束,字符之间没有固定的时间间隔要求。其格式如图3.1所示。每一个字符的前面都有一位起始位(低电平,逻辑值0),字符本身有5~7位数据位组成,接着字符后面是一位校验位(也可以没有校验位),最后是一位,或者一位半,或二位停止位,停止位后面是不定长度的空闲位。停止位和空闲位都规定为高电平(逻辑值1),这样就保证起始位开始处一定有一个下跳沿。

从图中可以看出,这种格式是靠起始位和停止位来实现字符的界定或同步的,故称为起始式协议。传送时,数据的低位在前,高位在后,图3.2表示了传送一个字符E的ASCAII码的波形1010001。当把它的最低有效位写到右边时,就是E的ASCII码1000101=45H。

- 9 -

图3.2 ASCAII码的波形

起/止位的作用:起始位实际上是作为联络信号附加进来的,当它变为低电平时,告诉收方传送开始。它的到来,表示下面接着是数据位来了,要准备接收。而停止位标志一个字符的结束,它的出现,表示一个字符传送完毕。这样就为通信双方提供了何时开始收发,何时结束的标志。传送开始前,发收双方把所采用的起止式格式(包括字符的数据位长度,停止位位数,有无校验位以及是奇校验还是偶校验等)和数据传输速率作统一规定。传送开始后,接收设备不断地检测传输线,看是否有起始位到来。当收到一系列的“1”(停止位或空闲位)之后,检测到一个下跳沿,说明起始位出现,起始位经确认后,就开始接收所规定的数据位和奇偶校验位以及停止位。经过处理将停止位去掉,把数据位拼装成一个并行字节,并且经校验后,无奇偶错才算正确的接收一个字符。一个字符接收完毕,接收设备有继续测试传输线,监视“0”电平的到来和下一个字符的开始,直到全部数据传送完毕。由上述工作过程可看到,异步通信是按字符传输的,每传输一个字符,就用起始位来通知收方,以此来重新核对收发双方同步。若接收设备和发送设备两者的时钟频率略有偏差,这也不会因偏差的累积而导致错位,加之字符之间的空闲位也为这种偏差提供一种缓冲,所以异步串行通信的可靠性高。但由于要在每个字符的前后加上起始位和停止位这样一些附加位,使得传输效率变低了,只有约80%。因此,起止协议一般用在数据速率较慢的场合(小于19.2kbit/s)。在高速传送时,一般要采用同步协议。 3.1.2 面向字符的同步协议

特点与格式:这种协议的典型代表是IBM公司的二进制同步通信协议(BSC)。它的特点是一次传送由若干个字符组成的数据块,而不是只传送一个字符,并规定了10个字符作为这个数据块的开头与结束标志以及整个传输过程的控制信息,它们也叫做通信控制字。由于被传送的数据块是由字符组成,故被称作面向字符的协议。 特定字符(控制字符)的定义:由上面的格式可以看出,数据块的前后都加了几个特定字符。SYN是同步字符(synchronous Character),每一帧开始处都有SYN,加一个SYN的称单同步,加两个SYN的称双同步设置同步字符是起联络作用,传送数据时,接收端不断检测,一旦

- 10 -

出现同步字符,就知道是一帧开始了。接着的SOH是序始字符(Start Of Header),它表示标题的开始。标题中包括源地址、目的地址和路由指示等信息。STX是文始字符(Start Of Text),它标志着传送的正文(数据块)开始。数据块就是被传送的正文内容,由多个字符组成。数据块后面是组终字符ETB(End Of Transmission Block)或文终字符ETX(End Of Text),其中ETB用在正文很长、需要分成若干个分数据块,分别在不同帧中发送的场合,这时在每个分数据块后面用文终字符ETX。一帧的最后是校验码,它对从SOH开始到ETX(或ETB)字段进行校验,校验方式可以是纵横奇偶校验或CRC。另外,在面向字符协议中还采用了一些其他通信控制字,它们的名称如下表所示:

表3.1 通信控制字

名称 序始(SOH) 文始(STX) 组终(ETB) 文终(ETX) 同步(SYN) 送毕(EOT) 询问(ENQ) 确认(ACK) 否认(NAK) 转义(DLE) ASCII 0000001 0000010 0010111 0000011 0010110 0000100 0000101 0000110 0010101 0010000 EBCDIC 00000001 00000010 00100110 00000011 00110010 00110111 00101101 00101110 00111101 00010000 数据透明的实现:面向字符的同步协议,不象异步起止协议那样,需要在每个字符前后附加起始和停止位,因此,传输效率提高了。同时,由于采用了一些传输控制字,故增强了通信控制能力和校验功能。但也存在一些问题,例如,如何区别数据字符代码和特定字符代码的问题,因为在数据块中完全有可能出现与特定字符代码相同的数据字符,这就会发生误解。比如正文有个与文终字符ETX的代码相同的数据字符,接收端就不会把它当作为普通数据处理,而误认为是正文结束,因而产生差错。因此,协议应具有将特定字符作为普通数据处理的能力,这种能力叫做“数据透明”。为此,协议中设置了转移字符DLE(Data Link Escape)。当把一个特定字符看成数据时,在它前面要加一个DLE,这样接收器收到一个DLE就可预知下一个字符是数据字符,而不会把它当作控制字符来处理了。DLE本身也是特定字符,当它出现在数据块中时,也要在它前面加

- 11 -

上另一个DLE。这种方法叫字符填充。字符填充实现起来相当麻烦,且依赖于字符的编码。正是由于以上的缺点,故又产生了新的面向比特的同步协议。 3.1.3 面向比特的同步协议

特点与格式:面向比特的协议中最具有代表性的是IBM的同步数据链路控制规程SDLC(Synchronous Data Link Control),国际标准化组织ISO(International Standard Organization)的高级数据链路控制规程HDLC(High Level Data link Control),美国国家标准协会(Americal National Standard Institute)的先进数据通信规程ADCCP(Advanced Data Communication Control Procedure)。这些协议的特点是所传输的一帧数据可以是任意位,而且它是靠约定的位组合模式,而不是靠特定字符来标志帧的开始和结束,故称“面向比特”的协议。这中协议的一般帧格式如图所示:

- 图4.2 帧格式

帧信息的分段:由图4.2可见,SDLC/HDLC的一帧信息包括以下几个场(Filed),所有场都是从有效位开始传送。

(1)SDLC/HDLC标志字符:SDLC/HDLC协议规定,所有信息传输必须以一个标志字符开始,且以同一个字符结束。这个标志字符是 01111110,称标志场(F)。从开始标志到结束标志之间构成一个完整的信息单位,称为一帧(Frame)。所有的信息是以帧的形传输的,而标志字符提供了每一帧的边界。接收端可以通过搜索“01111110”来探知帧的开头和结束,以此建立帧同步。

(2)地址场和控制场:在标志场之后,可以有一个地址场A(Address)和一个控制场C(Control)。地址场用来规定与之通信的次站的地址。控制场可规定若干个命令。SDLC规定A场和C场的宽度为8位或16位。接收方必须检查每个地址字节的第一位,如果为“0”,则后面跟着另一个地址字节;若为“1”,则该字节就是最后一个地址字节。同理,如果控制场第一个字节的第一位为“0”,则还有第二个控制场字节,否则就只有一个字节。

(3)信息场:跟在控制场之后的是信息场I(Information)。I场包含有要传送的数据,并不是每一帧都必须有信息场。即信息场可以为0,当它为0时,则这一帧主要是

- 12 -

控制命令。

(4)帧校验信息:紧跟在信息场之后的是两字节的帧校验,帧校验场称为FC(Frame Check)场或称为帧校验序列FCS(Frame check Squence)。SDLC/HDLC均采用16位循环冗余校验码CRC(Cyclic Redundancy Code)。除了标志场和自动插入的“0”以外,所有的信息都参加CRC计算。

实际应用时的两个技术问题:

(1)“0”位插入/删除:如上所述,SDLC/HDLC协议规定以01111110为标志字节,但在信息场中也完全有可能有同一种模式的字符,为了把它与标志区分开来,所以采取了“0”位插入和删除技术。具体作法是发送端在发送所有信息(除标志字节外)时,只要遇到连续5个“1”,就自动插入一个“0”,当接收端在接收数据时(除标志字节)如果连续收到5个“1”,就自动将其后的一个“0”删除是,以恢复信息的原有形式。这种“0”位的插入和删除过程是由硬件自动完成的。

(2)SDLC/HDLC异常结束:若在发送过程中出现错误,则SDLC/HDLC协议常用异常结束(Abort)字符,或称为失效序列使本帧作废。在HDLC规程中,7个连续的“1”被作为失效字符,而在SDLC中失效字符是8个连续的“1”。当然在试销序列中不使用“0”位插入/删除技术。SDLC/HDLC协议规定,在一帧之内不允许出现数据间隔。在两帧之间,发送器可以连续输出标志字符序列,也可以输出连续的高电平,它被称为空闲(Idle)信号。

3.2 SPCP协议的发送格式

0 1/2 D1 D2 D3 D4 D5 D6 D7 D8 3 头 标志

数据类 - 13 -

数据尾 发送过程中的约定:当收信方收到0时为开始发送的开始标志,在此之后又收到1则表示是文本文件,如果收了2则表示是文件类型,当收到3时则表示发送完毕。

串口发送过来的数据作为一个数据流按SPCP协议进行处理,并加上控制字符进行发送;在接收端,根据接收到的数据进行处理,接收完成后在发送到显示窗口。

第4章 双机互联程序的实现

4.1 创建标准的项目文件

创建一个基于标准.EXE的项目,打开 Visual Basic,从“ 文件”菜单中选择“新建工程”,然后选择建立标准.EXE项目即可。

图4.1新建工程对话框

4.2 加入串口通信控件

默认的控件工具栏中没有MSComm控件,因此首先要把它加入到控件工具栏中。为了在实现文件传送功能时能够方便地选择文件路径,还应添加一个标准对话框,这在默认的控件工具栏中也是没有的。选择“Project”菜单下的“ Components? ”选项,在弹出的对话框中选取“controls”选项卡,选中“ Microsoft Comm Control 6.0”和“ Microsoft Common Dialog Control 6.0 ”,单击“确定”按钮将它们加入到控件工

- 14 -

具栏中来,这时就可以看到控件工具栏出现 MSComm控件图标(形状与电话相似)和标准对话框控件图标。

图4.2 外接程序管理器

4.3 设计程序主窗体

4.3.1主窗体的功能分析

本文的程序仅包含两个窗体,即主窗体和参数设置窗体。参数设置仅完成对MSComm进行参数设置,其他功能几乎均从主窗体中进行响应。本文将完成以下功能:

·整个程序的初始化。 ·对各标志变量的设置与响应。 ·对各个按钮的响应。 ·短语的输入功能。

程序的主界面应当能够响应各种操作,并调用程序的各个模块和功能,因此,主界面主要实现的功能就是调用本系统的所有其他功能,包括打开串行口、关闭串行口、启动参数设置、发送消息、或显示文件传送界面等功能。

本程序的基本功能是依靠MSComm控件实现的,首先要将其添加到窗体中,由于该控件在程序运行时是不可见的,我把它们放在窗体的底部即可。同样,标准对话框控

- 15 -

件也只需放在窗体底部即可。为了实现对串行口的操作,我利用组合框定制了一个简单的选择框,和两个按钮来实现对串口设置能改变到程序中和能将收到的信息清空以保证能把接下来收到的信息显示在窗口上,当在发送文件时会显示发送信息内容及文件路径。 4.3.2主窗体的界面设计

窗体及其控件的主要属性和作用如表所示:

表4.1 frmMain 窗体及其控件的主要属性和作用

名称 控件类型 主要属性 主要属性 frmMain Form Caption=双机互联 标题栏显示程序 CtrMSComm MSComm Settings和CommPort两属性运行时设置 用于操作串行口的控序控制启用和关闭 SendData CommandButton Caption=发送 控制发送一条消息 rtfReceive RichTextBox 显示信息记录 CmdSendText CommandButton Caption=发送文件 选择发送文件 SendFileDial Ole 调用发送对话框 - 16 -

cboBaud ComboBox List=9600,24001200 设置波特率 cboData ComboBox List=8、7、6 设置数据位 cboStop ComboBox List=1 设置停止位 cboOutBufferSize ComboBox List=256、512、1024、2046 设置缓冲区 cboComPort ComboBox List=1,2,3,4 设置串口号 SettingOk CommandButton Caption=打开串口 设置打开串口 CommPortClose CommandButton Caption=关闭串口 设置关闭串口 SaveFileDial Ole 调用保存对话框 frmMain 窗体的设计界面如图所示:

- 17 -

图4.3 整体控件图

图4.4 主窗体

左上部分负责聊天功能(收短信息),右下部分负责信息的发送,“发送“按钮实现文本的发送,“发送文件“按钮,实现文件传输功能。右上方的几个选择框可以实现配置串口参数功能,按钮分别完成打开串口、关闭串口。

如果需要发送文件,点击“发送文件”按钮,将自动弹出文件对话框,从中选择待发送文件,则程序在互联的另一方发送文件请求接收时自动打开文件对话框,要求用户选择文件保存路径和名称,然后将文件保存。

- 18 -

系统的加构方式所示。

接收 端应 程序间交换数据 发送端应用

文 短 其 文 短 其

传信息 它 件传信息 它 缓冲区 spcp串口通信协议 MSComm控件 Windows API 串行口 串口线 缓冲区 spcp串口通信协议 MSComm控件 Windows API 串行口 本系统中关注的重点是SPCP协议的设计和实现,而建立在SPCP协议上的两种上层应用,文件传输和短信息传输则是程序的主要目标。

- 19 -

第5章 程序的测试与运行

5.1 软件及硬件测试

本程序的测试运行需要把两台计算机用串口线连接起来进行,或者在把一台机器上的两个串行口连接起来,本论文采用的是前一种方式。 5.1.1 发送消息时

发送方和收信方见下图。

图5.1 发送方窗口

输入中文“04级通信工程毕业设计”点“发送”收信方窗口如图5.2:

- 20 -

图5.2 收信方窗口

同时发送方也可以作为接受方,例如输入中文“于向阳”点“发送”如图5.1。 5.1.2 发送文件时

当发送方选定文件路径即文件名后,接收端将弹出一个标准的“另存为”对话框由接收方选择存盘路径,如果所选择的路径指向的文件已存在,则程序会询问是否覆盖原有的文件,确定后即可开始接收。

图5.3 选择要发送的文件

- 21 -

图5.4 发送方窗口

图5.4 保存收到的文件

- 22 -

图5.5 收信方窗口

至此,完成了双机通信程序的发送消息和发送文件两个功能,达到了预期的效果。

5.2 总结

随着计算机应用领域的不断扩展,计算机之间的远程通信用得也越来越广泛。作为RAD开发工具代表的VisualBasic同样提供了一系列标准通信命令的接口,它允许建立串口连接,可以连接到其他通信设备(如Modem)、还可以发送命令、进行数据交换以及监视和响应在通信过程中可能发生的各种错误和事件等,可以满足通常情况下的串口通信需求。如果在实际应用过程中,能够很好的掌握MSComm控件的特性,灵活变通,就可以达到安全、稳定、高效通信的目的。

在本文中,以控件作为底层接口,在此基础上建立了一个简单的串行通信协议SPCP,并由此实现了实时通信和文件传输功能。当然还有一些缺点,比如文件传输效率较低,安全性也较差,由于是做聊天和数据的传输,为了减少传输的负担,就没有设置校验位,还有待于进一步的完善和优化。

- 23 -

附录

(1)相关代码

Dim RHead, RType, One, IsStr As Boolean Dim RStr, Sendstr As String Dim b(0 To 1) As Byte

Dim strSet As String Dim intPort As Long Dim intOutBuffer As Long

Private Sub OpenPort_Click()

If frmMain.ctrMSComm.PortOpen = False Then Call CommPortOpen

Sendstr = \设置:打开串行口!\ Else

Sendstr = \设置:串行口已经打开!\ End If End Sub

Private Sub ClearRecV_Click() RecV.Text = \End Sub

Private Sub CommPortClose_Click() If ctrMSComm.PortOpen = True Then ctrMSComm.PortOpen = False

Sendstr = MsgBox(\串行口已关闭!\ Else

Sendstr = MsgBox(\串行口已关闭!\

- 24 -

End If End Sub

Private Sub Form_Load()

If ctrMSComm.PortOpen = True Then ctrMSComm.PortOpen = False End If

RecV.Locked = True RecvHead = False RecvType = False One = False IsStr = False RStr = \

SaveFileDial.CancelError = True SendFileDial.CancelError = True End Sub

Private Sub ctrMSComm_OnComm() 'Dim RecVStr As String

If ctrMSComm.PortOpen = True Then Dim RecVByte() As Byte Dim RecvLen, i As Integer On Error GoTo ErrorHandler RecVByte = ctrMSComm.Input

For i = LBound(RecVByte) To UBound(RecVByte) If RHead Then If RType Then If IsStr Then

If RecVByte(i) = 3 Then

RecV.Text = RecV.Text & \收到:\ RStr = \

- 25 -

RHead = False RType = False IsStr = False One = False Else If One Then

b(1) = RecVByte(i)

RStr = RStr & StrConv(b, vbUnicode) One = False Else

If RecVByte(i) > 127 Then b(0) = RecVByte(i) One = True Else

RStr = RStr & Chr(RecVByte(i)) End If End If End If Else

If RecVByte(i) = 3 Then

RecV.Text = RecV.Text & \vbCrLf

SaveFileDial.FileName = \ SaveFileDial.DialogTitle = \ SaveFileDial.DefaultExt = \

SaveFileDial.Filter = \ SaveFileDial.Action = 2

Open SaveFileDial.FileName For Output As #2 Print #2, RStr

现在收到文件请选择保存路径:\保存文件\- 26 -

RecV.Text = RecV.Text & \收到文件保存在:\& SaveFileDial.FileName & vbCrLf Close #2 RStr = \ RHead = False RType = False IsStr = False One = False Else If One Then

b(1) = RecVByte(i)

RStr = RStr & StrConv(b, vbUnicode) One = False Else

If RecVByte(i) > 127 Then b(0) = RecVByte(i) One = True Else

RStr = RStr & Chr(RecVByte(i)) End If End If End If End If Else

If RecVByte(i) = 1 Then RType = True IsStr = True

ElseIf RecVByte(i) = 2 Then 'SaveFile.Enabled = True RType = True

- 27 -

IsStr = False Else

RHead = False End If End If Else

If RecVByte(i) = 0 Then RHead = True End If End If Next i ErrorHandler:

Select Case Err.Number Case 32755

RecV.Text = RecV.Text & \你没有保存收到的文件!\ RStr = \ RHead = False RType = False IsStr = False One = False End Select Else

MsgBox (\请打开串口\End If End Sub

Private Sub SendData_Click() Dim str() As Byte

Sendstr = Chr(0) + Chr(1) + SendD.Text + Chr(13) + Chr(10) + Chr(3) str = StrConv(Sendstr, vbFromUnicode) ctrMSComm.Output = str

- 28 -

End Sub

Private Sub SendFile_Click() Dim InputData, Sendstr As String Dim SendData() As Byte

SendFileDial.FileName = \SendFileDial.DefaultExt = \

SendFileDial.Filter = \On Error GoTo ErrorHandler SendFileDial.Action = 1 Sendstr = \

Open SendFileDial.FileName For Input As #1 Do While Not EOF(1)

Line Input #1, InputData

Sendstr = Sendstr + InputData + vbCrLf Loop Close #1

Sendstr = Chr(0) + Chr(2) + Sendstr + Chr(3) SendData = StrConv(Sendstr, vbFromUnicode) ctrMSComm.Output = SendData

SendD.Text = SendD.Text & \已发送文件:\ErrorHandler:

Select Case Err.Number Case 32755

SendD.Text = SendD.Text & \你选择发送文件后又取消了!\End Select End Sub

Private Sub SettingOk_Click()

If ctrMSComm.PortOpen = False Then

- 29 -

ctrMSComm.PortOpen = True

strSet = frmMain.cboBaud.Text + \+ \

intPort = Val(cboComPort.Text)

intOutBuffer = Val(cboOutBufferSize.Text)

Call frmMain.SetComm(strSet, intPort, intOutBuffer) Call frmMain.CommPortOpen End If End Sub

Public Sub CommPortOpen() On Error GoTo PortError

ctrMSComm.CommPort = intCommPort ctrMSComm.Settings = strCommSettings

ctrMSComm.InBufferSize = intInBufferSize ctrMSComm.InBufferCount = 0

ctrMSComm.OutBufferSize = intOutBufferSize ctrMSComm.OutBufferCount = 0 ctrMSComm.RThreshold = 1 ctrMSComm.Handshaking = comRTSXOnXOff PortError: Case Err.Number Case 8005

MsgBox (\该串口已经被占用,请换其它串口!\ End Select End Sub

Public Sub SetComm(strSet As String, intPort As Long, intOutBuffer As Long) strCommSettings = strSet

- 30 -

intCommPort = intPort

intOutBufferSize = intOutBuffer End Sub (2) 连线方法

在电脑的使用中往往会遇到各种各样的连接线。这些连接线外观上好像都差不多,但内部结构完全不同并且不能混用。如果在使用中这些连接线坏了,往往很多使用者都不知道应该怎么办,下面就给出这些常见的连接线的连线方法以便于修理或查找故障。在介绍之前先对一些市场常用名词做出解释。现在所有的接头都可以分为公头和母头两大类。

公头:泛指所有针式的接头。 母头:泛指所有插槽式的接头。

所有接头的针脚有统一规定,在接头上都印好了的,连接时要注意。 在接线时没有提及的针脚都悬空不管。

下面给出串口,并口各针脚功能表以供高级用户维护电缆或接头时使用。 25针串口功能一览 针脚功能

2 发送数据(TXD) 3 接收数据 (RXD) 4 发送请求 (RTS) 5 发送清除 (CTS) 6 数据准备好 (DSR) 7 信号地 (GND) 8 载波检测 (DCD) 20 数据终端准备好 (DTR)

22 振铃指示 (RI) 9针串口功能一览表 针脚功能

1 载波检测 (DCD) 2 接收数据 (RXD) 3 发送数据(TXD)

- 31 -

4 数据终端准备好 (DTR) 5 信号地 (GND) 6 数据准备好 (DSR) 7 发送请求 (RTS) 8 发送清除 (CTS) 9 振铃指示 (RI)

串口联机线的连接方法

串口联机线主要用于直接把两台电脑的com口连接。比较早一点的AT架构的电脑的串口有为9针,和25针两种,现在的ATX架构的电脑两个串口全部是9针。于是联机线就分为3种(9针对9针串口联机线,9针对25针串口联机线,25针对25针串口联机线)这些直接电缆连接线可以互换的连线方法如下表: 串口连机线一览 9针对9针串口连接 9针母头 9针母头 2 —— 3 3 —— 2 4 —— 6 5 —— 5 6 —— 4 7 —— 8 8 —— 7

25针对25针串口连接 25针母头 25针母头 2 —— 3 3 —— 2 4 —— 5 5 —— 4 6 —— 20 7 —— 7 20 —— 6

- 32 -

9针对25针串口连接 9针母头 25针母头 2 —— 2 3 —— 3 4 —— 6 5 —— 7 6 —— 20 7 —— 5 8 —— 4

串口转接线

这种转接线适用于9针串口和25针串口的转换。 首先,根据需要(9转25或25转9)选择两个转接头。 选择方法如下:

9针转25针(9针公头,25针母头)。25针转9针(25针公头,9针母头)。然后使用尽量短的带屏蔽的多芯连接线。连接方法如下表 串口转接线一览 9针接头 25针接头 1 —— 8 2 —— 3 3 —— 2 4 —— 20 5 —— 7 6 —— 6 7 —— 4 8 —— 5 9 —— 22

二、 EIA RS—232C接口 1、引脚规定

保护地:1号脚,它与设备的外壳相连,需要时可以使它直接与大地相连; TXD:发送数据,2号脚;

- 33 -

RXD:接收数据,3号脚; 信号地:7号脚;

RTS:请求发送,这是数据终端设备(以下简称DTE)向数据通信设备(以下简称DCE)提出发送要求的请求线。

CTS:准许发送,这是DCE对DTE提出的发送请求作出的响应信号。当CTS在接通状态时,就是通知DTE可以发送数据了。当RTS在断开状态时。CTS也随之断开,以备下一次应答过程的正常进行;当RTS在接通状态时,只有当DCE进入发送态时,即DCE已准备接收DTE送来的数据进行调制并且DCE与外部线路接通时,CTS才处于接通状态。

DSR:数据通信设备准备就绪,它反映了本端数据通信设备当前的状态。当此线在接通状态时,表明本端DCE已经与信道连接上了且并没有处在通话状态或测试状态,通过此线,DCE通知DTE,DCE准备就绪。DSR也可以作为对RTS信号的响应,但DSR线优先于CTS线成为接通态。

DTR:数据终端准备就绪。如果该线处于接通状态,DTE通知DCE,DTE已经作好了发送或接收数据的准备,DTE准备发送时,本设备是主动的,可以在准备好时,将DTR线置为接通状态。如果DTE具有自动转入接收的功能,当DTE接到振铃指示信号RI后,就自动进入接收状态,同时将DTR线置为接通状态。

RI:振铃检测,当DCE检测到线路上有振铃信号时,将RI线接通,传送给DTE,在DTE中常常把这个信号作为处理机的中断请求信号,使DTE进入接收状态,当振铃停止时,RI也变成断开状态。DCD:接收线路信号检测,这是DCE送给DTE的线路载波检测线。MODEM在连续载波方式工作时,只要一进入工作状态,将连续不断地向对方发送一个载波信号。每一方的MODEM都可以通过对这一信号的检测,判断线路是否通,对方是否在工作。此外,还有一些其它控制线,但是不常用,这里就不再赘述了。 2、电气性能规定

1.)在TXD和RXD线上。 MARK(即数字“1”)=-3V~-25V SPACE(即数字“0”)=+3V~+25V

2.)在联络控制信号线上(如RTS、CTS、DSR、DTR、RI、DCD等) ON(接通状态)=+3V~+25V OFF(断开状态)=-3V~-25V

- 34 -

本文来源:https://www.bwwdw.com/article/fjf3.html

Top