毕业论文-modbus通信协议在tcpip上的实现内容摘要:

addr FAR* addr, int FAR* addrlen )。 s:是一个套接字,它应处于监听状态。 addr:是一个 sockaddr_in 结构指针,包含一组客户端的端口号、 IP 地址等信息。 addrlen:用于接收参数 addr 的长度。 ( 6) send()和 recv()函数 TCP 连接建立以后,数据即可被传送。 将 send()和 recv()函数专门设计成和已经连接的套接字一起使用。 ( 7) close()函数 一旦不使用,通过该函数关闭套接字。 应用程序与套接字关系 系统调用 大多数操作 系统使用系统调用 (system call)的机制在应用程序和操作系统之间传递控制权。 对程序员来说,每一个系统调用和一般程序设计中的函数调用非常相似,只是系统调用是将控制权传递给了操作系统。 如下图所示: 应用程序 1 应用程序 2 应用程序 n由应用程序调用的系统函数系统调用接口用户地址空间中的应用程序系统地址空间中的协议软件包括 T C P / IP 软件协议的操作系统内核„ „ 应用编程接口 API (Application Programming Interface) 如上图所示,当某个应用进程启动 系统调用 时,控制权就从应用进程传递给了 系统调用接口。 操作系统将此接口再将控制权传递给计算机的操作 系统。 此调用转给某个内部过程,并执行所请求的操作。 内部过程一旦执行完毕,控制权就又通过系统调用接口返回给应用进程。 由上可知, 系统调用接口实际上就是 应用进程的控制权和操作系统的控制权进行转换的一个接口,即 应用编程接口 API。 套接字( Socket)就是由操作系统提供的一组有关 TCP/IP 的 API1。 套接字( Socket)的作用 如下图所示,应用进程通过套接字接入到网络。 应 用 进 程套 接 字T C P客 户应 用 进 程套 接 字T C P因 特 网因 特 网客 户由 操 作 系统 控 制由 应 用程 序 控制 第四章 课题的 具体实现流程 编程环境 VC++与面向对象 Windows 编程采用的是面向对象的方法 ( Object Oriented Programming,简称 OOP)。 要编写真正的 Windows 应用程序,就必须对 OOP 有一定了解。 而 Visual C++是 Windows 环境下最主要的开发环境,它支持面向对象编程,并提供可视化编程。 面向对象编程技术不只是一种程序设计的方法,而是客观建立事物模型,分析复杂事物思想的方法。 面向对象方法的本质,就是强调从客观事物固有的事物出发来构造系统,用 人类常用的思维方式来认、理解和描述事物。 利 面向对象的程序设计的核心为: 设计思路:对客观事物的抽象。 程序特点:对类(对象的存在形式)进行结构化程序设计。 类提供简单的对外接口。 面向对象技术的基本特征为: 继承性:继承性是指一个新类可以从现有的类中派生出来,新类具有父类中的所有特性,直接继承父类的方法和数据,新类的对象可以调用该类及父类的成员变量和成员函数。 封装性:封装性是指把数据和方法放在同一个对象中,对数据的存取只能通过该对象本身的方法来进行。 多态性:是指同一消息被不同 的对象界首市,可以解释为不同意义的能力,会产生不同的行为。 Visual C++ /MFC 开发程序 库( library)是可以重复使用的源代码和目标代码的集合。 MFC( Microsoft Fundamental Classes)是 Visual C++开发环境所带的类库,在该类库中提供了大量的类,可以帮助开发人员快速建立应用程序。 这些类可以提供程序框架、进行文件和数据库操作、建立网络连接、进行绘图和打印等各种通用的应用程序操作。 使用 MFC 库开发应用程序可以减少很多工作量。 MFC 借助 C++的优 势为 Windows 开发开辟了一片新天地,同时也借 助ApplicationWizzard 使开发者摆脱离了那些每次都必写基本代码,借 ClassWizard2和消息映射使开发者摆脱了定义消息处理时那种混乱和冗长的代码段。 更令人兴奋的是利用 C++的封装功能使开发者摆脱 Windows 中各种句柄的困扰,只需要面对 C++中的对象,这样一来使开发更接近开发语言而远离系统。 编程语言 正因为 MFC 是建立在 C++的基础上,所以我强调 C/C++语言基础对开发的重要性。 利用 C++的封装性开发者可以更容易理解和操作各种窗口对象;利用C++的派生性开发者可以减少开发自定义窗口的时间和创造出可重用的代码;利用虚拟性可以在必要时更好的控制窗口的活动。 而且 C++本身所具备的超越 C语言的特性都可以使开发者编写出更易用,更灵活的代码。 现在 C++由以下四个子语言 组成: C 子语言。 C++支持 C 语言的几乎全部功能,在语法上与 C 语言仅有极微妙的差别。 面向对象的 C++。 C++首先作为一门面向对象的语言而闻名,这个特点在这里不再详述。 泛型编程语言。 C++强大模板功能使它能在编译期完成许多工作,从而大大提高运行期效率。 STL3。 随着 STL 的不断发展,它已经逐渐成为 C++程序设计中不可或缺的部分,其效率可能比一般的 na239。 ve 代码低些,但是其 安全 性与规范性使它大受欢迎。 套接字实现流程 1 、 套接字工作原理 (1) 当应用进程需要使用网络进行通信时就发出系统调用,请求操作系统为其创建 “套接字 ”,以便把网络通信所需要的系统资源分配给该应用进程。 (2) 操作系 统为这些资源的总和用一个叫做套接字描述符的号码来表示,并把此号码返回给应用进程。 应用进程所进行的网络操作都必须使用这个号码。 (3) 通信完毕后,应用进程通过一个关闭套接字的系统调用通知操作系统回收与该 “号码 ”相关的所有资源。 创建套接字 (流程把文字改成程序流程图) 服务器端: 当套接字被创建后,它的端口号和 IP 地址都是空的,因此应用进程要调用 bind(绑定) 来指明套接字的本地地址。 例如,在服务器端调用 bind 时 就是 把熟知端口号和本地 IP地址填写到已创建的套接字中。 这就叫做 把本 地地址绑定到套接字。 服务器在调用 bind 后,还 必须 调用 listen(收听) 把套接字设置为 被动方式 ,以便随时接受客户的服务请求。 UDP4服务器由于只提供无连接服务,不使用 listen 系统调用。 服务器紧接着就调用 accept(接受) ,以便把远地客户进程发来的连接请求提取出来。 系统调用 accept 的一个变量就是要指明从哪一个套接字发起的连接。 具体的服务器端进程如下所示: if(! AfxSocketlnit()){ MessageBox(“ WindowsSocket initial failed!”,“ Send”, MB— ICONSTOP); Return; }//套接字初始化 CSocket ChatSend, Server;//构造 2个套接字对象, nPort是 socket的端口号。 if(!Chatsend. Create(nPort)){//初始化 socket. MessageBox ( “ SendSocket create failed!”, MB— ICONSTOP); Return ; else ChatSend. Bind(nPort, strAddr);//把本地址和 socket绑定 ,其中 nPort是 socket的端口号, strAddr是机器的 IP地址。 ChatSend. Listen();//开始侦听 ChatSend. Accept(server);//新的套接字上接收客户端 socket连接 } Server. SendTo(csSendText. csCount, nPurt, strAddr);//发送一个字符串 Server. close();//关闭这 2个 socket ChatSend Close(); 流程:文字改成程序流程图 客户端: 它比较简单,第一 , 创建套接字 socket,第 二,通过 connect 函数向服务器发出连接请求,然后就可以通过 send, recv 函数发送和 接 收信息了。 具体客户端进程代码如下所示: if(!AfxSocketlnit()){ MessageBox( “WindowsSocket initial failed!” , “Receive”, MB— ICONSTOP); Return; }//套接字初始化 bcket ChatReceive;//构建一个 Socket对象 if(!ChatReceive. Geste(nPort)){//初始化 socket. MessageBox(“Receive. Socket create failed !” , “Receive”, MB— ICONSTOP); Return; } else{ChatReceive. Connect(strAdamp。 , nPort);//建立和服务器的连接 } ChatReceive. ReceiveFrcgn(csReceiveText, csCount, strAddr, nPort);//接收字符串 ChatReceive. Close();//关闭套接字 socket MODBUS 协议编程实 现 (一)通讯口设置 DCB dcb。 hCom=CreateFile(COM1, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL)。 if(hCom==INVALID_HANDLE_VALUE) { MessageBox(createfile error,error)。 } BOOL error=SetupComm(hCom,1024,1024)。 if(!error) MessageBox(setupm error)。 error=GetCommState(hCom,amp。 dcb)。 if(!error) MessageBox(getmstate,error)。 =2400。 =8。 =EVENPARITY。 //NOPARITY。 =ONESTOPBIT。 error=SetCommState(hCom,amp。 dcb)。 (二) CRC 校验码计算 UINT crc void calccrc(BYTE crcbuf) { BYTE i。 crc=crc ^ crcbuf。 for(i=0。 i8。 i++) { BYTE TT。 TT=crcamp。 1。 crc=crc1。 crc=crcamp。 0x7fff。 if (TT==1) crc=crc^0xa001。 crc=crcamp。 0xffff。 } } (三)数据发送 zxaddr=11。 //读取地址为 11 的巡检表数据 zxnum=10。 //读取十个通道的数据 writebuf2[0]=zxaddr。 writebuf2[1]=3。 writebuf2[2]=0。 writebuf2[3]=0。 writebuf2[4]=0。 writebuf2[5]=zxnum。 crc=0xffff。 calccrc(writebuf2[0])。 calccrc(writebuf2[1。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。