串口转TCP/IP模块的上位机TCP编程指南 点击:1709 | 回复:1



谢谢你的爱1999

    
  • [版主]
  • 精华:1帖
  • 求助:12帖
  • 帖子:717帖 | 3885回
  • 年度积分:23
  • 历史总积分:160147
  • 注册:2013年4月29日
发表于:2017-09-12 14:51:58
楼主

1.概述

                 

  使用ZLSN系列串口转TCP/IP模块可以方便的实现在下位机端的TCP联网。即只要通过串口收发数据即可实现TCP/IP数据的收发。那么对于上位机,即PC机、服务器等如何通过TCP实现和串口转TCP/IP模块的通信呢?基本上来说有三种方式:

                 

(1)使用虚拟串口:此时用户在上位机通过zlvircom虚拟一个com口,这个com口会在驱动底层和TCP/IP转串口模块建立网络连接。上位机还是通过串口(COM口)和TCP/IP模块通信。

                 

(2)使用Modbus TCP协议:采用具备Modbus TCP转Modbus RTU的TCP/IP模块可以实现将Modbus TCP协议直接转化为RTU协议。这样用户上位机可以使用通用的Modbus TCP协议,比如组态软件、OPC软件等。这些软件都是支持Modbus TCP的,这样用户可以借助这些工控软件进行开发。

                 

(3)TCP网络软件编写:第三种方法是本文介绍的主要方法,用户通过VC、VB、Delphi、C++Builder等开发环境开发出TCP软件和TCP/IP转串口模块通信。几乎所有的通用操作系统都支持TCP/IP协议栈,操作系统提供了一种称之为socket接口的通用的编程规范来调用操作系统的TCP/IP协议栈。实际中,在windows上此socket接口就是一个API接口,最终用户函数的执行,直接调用了操作系统提供的DLL库的TCP/IP功能。    

                 

串口转TCP/IP模块   

                 

图1.  TCP/IP转串口模块 

                 

  另外如果需要实现模块特有的一些管理。比如在局域网中搜索模块、读取模块的参数、修改模块的参数 。

                 

2. TCP/IP基础

                 

  我们知道TCP/IP转串口模块ZLSN2002基本上有TCP服务器、TCP客户端、UDP这几种工作模式,对于不同的工作模式,上位机软件也需要选择不同的TCP/IP工作模式和他对应:即模块为TCP服务器时上位机应该为TCP客户端、模块为TCP客户端时上位机应该为TCP服务器、模块为UDP时上位机也是UDP模式。请参考:TCP的工作模式的选择介绍

                 

3. socket函数和TCP/UDP

                 

  socket是通用的TCP/UDP调用接口,含有的主要主要函数如表1所示:

                 

表1. socket主要函数

                 

                 

函数功能
socket分配一个空闲的socket(套接字)
sendto将数据发送到指定地址。调用该函数的socket可以是TCP或者UDP。如果是TCP,目的地址将被忽略,它等同于send()
recvfrom该函数用于接收数据,数据来源的地址通过参数from返回。当TCP的socket调用该函数的时候,除了可以获得数据来源的地址外等同于调用recv()函数。
connect建立连接。
bind将本地地址和端口和socket绑定
listen让TCP套接字进行监听
accept用于接受一个socket连接请求。用户调用accept并返回一个有效的socketfd之后,用户需要在之后调用socketclose(socketfd)来释放这个socket,否则这个socket占用的内存将不会被释放。
sendTCP套接字使用该函数将数据发送到对方。对于调用了connect()的UDP套接字也可以使用该函数发送数据,但是如果还没有调用connect(),则会返回错误。
recvTCP套接字接收数据,或者用于UDP套接字接收来自指定地址的数据(必须事先调用connect()指定地址)
closesocket关闭连接,释放socket资源。

             

                 

我们通过socket函数的不同调用。来实现上位机工作在不同的模式:

                 

(1)TCP客户端模式:上位机调用connect这个socket函数实现向TCP/IP转串口模块发起连接,实现TCP客户端的功能。

                 

(2)TCP服务器模式:上位机调用listen这个socket函数实现TCP服务器功能,即在一个特定端口等待ZLSN2002模块的连接。

                 

(3)UDP模式:无需监听和发起连接,直接调用send和recv函数发送和接收即可。

                 

4. socket编程例子

                 

  提供了socket通信的源代码程序《计算机端socket编程例子》。在该代码中使用了非常简洁的代码,实现了上位机作为TCP客户端时的数据收发。让用户对socket编程马上有一个初步的印象。

                 

5. VC的CSocket编程例子

                 

  在Microsoft Visula C++中已经对底层的socket接口再进行一次封装,即更加高级的CAsyncSocket、CSocket类。使用这两个类可以实现更加容易的编程。在此提供免费的代码《SocketTest的CSocket编程源代码》。

                 

6. 网络编程的注意事项

                 

      发送大量数据不丢失的方法:一些用户通过计算机向模块发送大批量数据,此时由于网络发送的数据过快,而串口的输出速度有限,经过一段时间肯定会导致发送不成功。所以一般情况下,用户需要检查send()的返回值,只有返回值和期望发送的数据量一样时,才算发送完毕。否则一定要继续调用send()发送未发送完毕的数据。通过这种检测,可以保证发送的数据不丢失。


1分不嫌少!


楼主最近还看过



哈哈我了个去

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 184回
  • 年度积分:24
  • 历史总积分:250
  • 注册:2018年2月02日
发表于:2018-05-15 18:23:48
1楼
非常感谢楼主分享资料

热门招聘
相关主题

官方公众号

智造工程师