1、计算机通信网课程设计手册通信网络系统课程设计手册河海大学常州校区目录课题一:串口通信 11、1 基本概念 11、2 RS232标准 11、3串口编程的基本方法 21、4 基于Delphi 、net串口类的实现 3课题二:UDP通信 72、1 UDP协议简介 72、2 、NET UDP编程的基本方法 72、3 基于Delphi 、net的UDP发送程序的实现 9课题三:TCP通信 123、1 TCP协议简介 123、2 、NET TCP编程的基本方法 133、2、1 TcpListener类 133、2、2 TcpClient 类 133、3 基于C# 、NET的时间服务器的实现 13课题一:串
2、口通信随着计算机在工业中的广泛应用,控制局域网络也深入应用到各行各业之中,用串口实现组网是一种较常见且又非常简捷有效的方法。串口也是仪器仪表设备通用的通信协议,同时,串口通信协议也可以用于获取远程采集设备的数据。大多数计算机包含两个基于RS232的串口。1、1 基本概念串口通信的概念非常简单,串口按位(bit)发送和接收数据。尽管比按字节(byte)传送的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个通信的端口,这些参数必须匹配: a, 波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例
3、如300波特表示每秒钟发送300个bit。必须注意的是:波特率和距离成反比,高波特率常常用于放置的很近的仪器间的通信。 b, 数据位:这是衡量通信中实际数据位的参数,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0127(7位),那么每个数据包使用7位数据。c, 停止位:用于表示单个包的最后一位。典型的值为1,1、5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时
4、也越慢。 d, 奇偶校验位:奇偶校验是串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。1、2 RS232标准现今被广泛运用的通信串口主要有三种,即RS232、RS422
5、和RS485,RS是英文推荐标准的首字母缩写,232、422、485是标识号。计算机串行接口采用RS232标准(如图1、1所示):规定逻辑1的电平为-3-15V,逻辑0的电平为+3+15V,常用的信号有8个,其中RXD、TXD为收、发数据,可与RS232串行口设备直接进行通讯,RTS、DTR、CD、DSR、CTS、BELL为控制与检测MODEM的信号,在通讯过程中起联络与控制作用,如图1、2所示。图1、1 RS232引脚排列图1、2 RS232引脚功能特性由于RS232不适合远距离传输,因此后来又提出了RS422和RS485两种标准。RS422与 RS232相比,无论从传输距离还是传输速率上均
6、优于RS232,在1200m的距离传输时,其速率仍可达到100kbps,短距离传输则可达到10Mbps。它与RS232的最大不同是在其串口上可以挂接多个设备,因此更适合于组网。在使用时,其接口只有四根线,即TX+,TX-,RX+,RX-,其中TX用于发送,RX则用于接收。RS422采用的是平衡发送和差分接收的方式,对地线及共模干扰有很强的抑制作用,因此接受的灵敏度很高,检测电压可低至20mV。 还有一种串口是RS485,其实它是RS422的一种特殊形式。它仅有两根线,即发送和接收各一根;其采用的是半双工结构,任何时候只能有一点处于发送状态,所以它不如RS422灵活。RS485接口标准是基于考虑
7、在同一线上进行中距离,多接收,多发送而设计产生的数据传送标准,因此,在一条总线上,其允许同时存在32个接收器和32个发送器。1、3串口编程的基本方法串行口编程方法主要有三种:硬件编程法、文件操作法、串口控件法。1、硬件编程法直接使用端口的输入、输出(I/O)函数对串行口的控制电路进行编程。适用于DOS及Windows平台 (Windows Me以前的各版本),但在基于NT技术构建的操作系统(Windows NT、Windows 2000、Windows XP等)中因不允许用户程序直接操作硬件而不适用。常用的端口输入、输出函数(指令)有:汇编语言的IN、OUT指令及软中断调用,C语言的inpor
8、t()、outport()、inportb()、outportb(),C+的_inp()、_outp()等。2、文件操作法文件操作法是将串行口作为系统的一个文件来处理,通过对这个文件的读、写操作引发串口对数据进行收、发动作。这种方法在DOS、Windows、Windows NT、Windows2000及Windows XP等平台下都能正常工作。在Delphi和VC+中,可用CreateFile()、ReadFile()、WriteFile()等函数将串行口作为文件进行操作。3、串口控件法用Delphi、VB及VC+编程时,可用控件对串行口进行编程。这种方法通用性好,在Windows、Windo
9、ws NT、Windows2000及Windows XP等平台下都能正常工作。在VB中,使用MSCOMM控件;在VC+下使用Microsoft Communication Control这一ActiveX类控件。在Delphi win32下使用SPCOMM控件。串口控件使用方法请参考相关资料。1、4 基于Delphi 、net串口类的实现下面给出了一个基于Delphi 、net 2006平台的一个串口通信的类的部分源代码。只要用串口线将两台PC连接起来,就可以调用该串口类收发数据了。unit PDP、Common、Comm;interfaceuses Windows, System、Runti
10、me、InteropServices, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ShellAPI, System、ComponentModel, System、Threading, System、Net, System、Net、Sockets, System、Text;type TComm = class private Private declarations hComm:integer; FPortNum:integer; /1,2,3,4 BaudRate:integer; /1
11、200,2400,4800,9600 ByteSize:byte; /8 bits Parity:byte; / 0-4=no,odd,even,mark,space StopBits:byte; / 0,1,2 = 1, 1、5, 2 ReadTimeout:integer; /10 FPortName:String; lpol:_OVERLAPPED; dcbCommPort:_DCB; ctoCommPort:_COMMTIMEOUTS; procedure Close; public Public declarations constructor Create(APortNum:Int
12、eger); function SendMsg(Msg:String):Integer; function GetMsg(NumBytes:integer):string; destructor Destroy; override; end;implementation/TCOMM类的构造函数,调用时传入COM口的编号如1就可以了。constructor TComm、Create(APortNum: Integer);begin inherited create; FPortNum:=APortNum; FPortName:=COM+FPortNum、ToString; BaudRate:=2
13、400; ByteSize:=8; Parity:=0; StopBits:=0; ReadTimeout:=100; try hComm := CreateFile(FPortName,GENERIC_READ or GENERIC_WRITE,0, 0,OPEN_EXISTING,0,0); except showmessage(Unable to open +FPortName+ port!) end; / SET THE COMM TIMEOUTS、 GetCommTimeouts(hComm,ctoCommPort); ctoCommPort、ReadTotalTimeoutCons
14、tant := ReadTimeout; ctoCommPort、ReadTotalTimeoutMultiplier := 0; ctoCommPort、WriteTotalTimeoutMultiplier := 0; ctoCommPort、WriteTotalTimeoutConstant := 0; SetCommTimeouts(hComm,ctoCommPort); / SET BAUD RATE, PARITY, WORD SIZE, AND STOP BITS、 / THERE ARE OTHER WAYS OF DOING SETTING THESE BUT THIS IS
15、 THE EASIEST、 / IF YOU WANT TO LATER ADD CODE FOR OTHER BAUD RATES, REMEMBER / THAT THE ARGUMENT FOR BuildCommDCB MUST BE A POINTER TO A STRING、 / ALSO NOTE THAT BuildCommDCB() DEFAULTS TO NO HANDSHAKING、 dcbCommPort、DCBlength := Marshal、SizeOf(dcbCommPort); GetCommState(hComm,dcbCommPort); dcbCommP
16、ort、BaudRate:=BaudRate; dcbCommPort、Parity:=Parity; dcbCommPort、ByteSize:=ByteSize; dcbCommPort、StopBits:=StopBits; SetCommState(hComm,dcbCommPort);end;destructor TComm、Destroy;begin Close; inherited;end;procedure TComm、Close;begin if (hComm INVALID_HANDLE_VALUE) then begin CloseHandle(hComm); end;e
17、nd;/从串口读入消息,返回的是字符串类型。function TComm、GetMsg(NumBytes:integer):string;var BufBytes:array of byte; OutBytes:array of byte; BytesRead:cardinal; i:integer;begin setlength(BufBytes,NumBytes); try BytesRead:=0; ReadFile(hComm,BufBytes,NumBytes,BytesRead,lpol); setlength(OutBytes,BytesRead); for I := 0 to
18、BytesRead - 1 do begin OutBytesi:=BufBytesi; end; except showmessage(read error); end; Result:=Encoding、ASCII、GetString(OutBytes);/ showmessage(Result);/ frmSend、Form1、Edit1、Text:=Result;end;/发送消息,传入的参数是字符串格式的消息。$UNSAFECODE ONfunction TComm、SendMsg(Msg: String):Integer;unsafe;var Number:cardinal; Wr
19、iteData:array of byte;begin setlength(WriteData,length(Msg); WriteData:=Encoding、ASCII、GetBytes(Msg); try WriteFile(hComm,WriteData,length(Msg),Number,lpol); except raise exception、Create(Comm Write Error); end; Result:=Number;end;end、课题二:UDP通信2、1 UDP协议简介UDP协议是英文User Datagram Protocol的缩写,即用户数据报协议,主要
20、用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。UDP协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数据报就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。UDP数据报格式如图2、1所示。图2、1 UDP数据报格式与我们所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议
21、的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。与TCP不同,UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议。也许有人会问,既然UDP是一种不可靠的网络协议,那么还有什么使用价值或必要呢?其
22、实不然,在有些情况下UDP协议可能会变得非常有用,因为UDP具有TCP所望尘莫及的速度优势。虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑使速度受到严重的影响。反观UDP由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。2、2 、NET UDP编程的基本方法socket是套接字的英文名称,主要是用于网络编程。Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,
23、一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。、net的System、Net、Sockets 命名空间包含 Windows 套接字接口的托管实现。而System、Net 命名空间中的所有其他网络访问类都建立在该套接字实现之上,有就是说使用System、Net、Sockets和System、Net 命名空间中类可以完成通过socket动态库中的几乎全部功能。基于、net的UDP编程主要使用UdpClient 类实现。UdpClient 类提供了一些简单的方法,用于在阻塞同步模式下发送和接收无连接 UDP 数据报。因为 UDP 是无连接传输协议,所以不需要在发送和接收数据前建
24、立远程主机连接。但可以选择使用下面两种方法之一来建立默认远程主机: 使用远程主机名和端口号作为参数创建 UdpClient 类的实例。 创建 UdpClient 类的实例,然后调用 Connect 方法。 可以使用在 UdpClient 中提供的任何一种发送方法将数据发送到远程设备。使用 Receive 方法可以从远程主机接收数据。UdpClient 方法还允许发送和接收多路广播数据报。使用 JoinMulticastGroup 方法可以将 UdpClient 预订给多路广播组。使用 DropMulticastGroup 方法可以从多路广播组中取消对 UdpClient 的预订。UdpClie
25、nt提供的公共方法有:public void Close();public void Connect( System、Net、IPEndPoint endPoint);public void Connect( System、Net、IPAddress addr, int port);public void Connect( System、String hostname, int port);public void DropMulticastGroup( System、Net、IPAddress multicastAddr);public void JoinMulticastGroup( Sys
26、tem、Net、IPAddress multicastAddr);public void JoinMulticastGroup( System、Net、IPAddress multicastAddr, int timeToLive);public ubyte Receive( System、Net、IPEndPoint& remoteEP);public int Send( ubyte dgram, int bytes);public int Send( ubyte dgram, int bytes, System、Net、IPEndPoint endPoint);public int Sen
27、d( ubyte dgram, int bytes, System、String hostname, int port);2、3 基于Delphi 、net的UDP发送程序的实现下面给出了一个基于Delphi 、net 2006的UDP发送端的类的部分源代码。读者只要编写一个UDP接收端的程序,就可以实现基于UDP协议的消息的发送和接收了。unit PDP、ScoreUdpSock;interfaceuses System、Threading, Classes, System、Net, System、Net、Sockets, System、Text, Borland、Vcl、Forms ;co
28、nst PORT = 2007;type TPDPUdpSock = class(TThread) protected procedure Execute; override; private Private declarations udps:array of UdpClient; ips:array of IPAddress; ipends:array of IPEndPoint; byteSend:array of byte; PDANums:Integer; SendMsg:String; public constructor Create(PDAIPs:array of String
29、;Msg:String); destructor Destroy; override; end;implementation TPDPUdpSock /UDP发送类的构造函数,继承于TThread类。实现IPEndPoint和UdpClient的初始化等。输入参数为(1)UDP接收方:可以多一个或者多个,是IP地址的动态数组(2)发送的消息。constructor TPDPUdpSock、Create(PDAIPs:array of String;Msg:String);var I: Integer;begin PDANums:=high(PDAIPs)-low(PDAIPs)+1; SetL
30、ength(ips,PDANums); SetLength(ipends,PDANums); SetLength(udps,PDANums); for I := low(PDAIPs) to high(PDAIPs) do begin ipsi := IPAddress、Parse(PDAIPsi); ipendsi := IPEndPoint、Create(ipsi, port); udpsi:= UdpClient、Create; end; SendMsg:=Msg; inherited Create(true);end;/UDP发送类的析构函数,实现socket的关闭和释放。destru
31、ctor TPDPUdpSock、Destroy;var I:Integer;begin for I := 0 to PDANums-1 do begin udpsi、Close; if udpsiNil then udpsi、Free; end; inherited;end;/向多个UDP接收方发送消息。procedure TPDPUdpSock、Execute;var I: Integer;begin inherited; while(not terminated) do begin Thread、Sleep(1000); byteSend:=Encoding、ASCII、GetBytes(SendMsg); for
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1