使用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功能。
图1. TCP/IP转串口模块
另外如果需要实现模块特有的一些管理。比如在局域网中搜索模块、读取模块的参数、修改模块的参数 。
我们知道TCP/IP转串口模块ZLSN2002基本上有TCP服务器、TCP客户端、UDP这几种工作模式,对于不同的工作模式,上位机软件也需要选择不同的TCP/IP工作模式和他对应:即模块为TCP服务器时上位机应该为TCP客户端、模块为TCP客户端时上位机应该为TCP服务器、模块为UDP时上位机也是UDP模式。请参考:TCP的工作模式的选择介绍。
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占用的内存将不会被释放。 |
send | TCP套接字使用该函数将数据发送到对方。对于调用了connect()的UDP套接字也可以使用该函数发送数据,但是如果还没有调用connect(),则会返回错误。 |
recv | TCP套接字接收数据,或者用于UDP套接字接收来自指定地址的数据(必须事先调用connect()指定地址) |
closesocket | 关闭连接,释放socket资源。 |
我们通过socket函数的不同调用。来实现上位机工作在不同的模式:
(1)TCP客户端模式:上位机调用connect这个socket函数实现向TCP/IP转串口模块发起连接,实现TCP客户端的功能。
(2)TCP服务器模式:上位机调用listen这个socket函数实现TCP服务器功能,即在一个特定端口等待ZLSN2002模块的连接。
(3)UDP模式:无需监听和发起连接,直接调用send和recv函数发送和接收即可。
提供了socket通信的源代码程序《计算机端socket编程例子》。在该代码中使用了非常简洁的代码,实现了上位机作为TCP客户端时的数据收发。让用户对socket编程马上有一个初步的印象。
在Microsoft Visula C++中已经对底层的socket接口再进行一次封装,即更加高级的CAsyncSocket、CSocket类。使用这两个类可以实现更加容易的编程。在此提供免费的代码《SocketTest的CSocket编程源代码》。
发送大量数据不丢失的方法:一些用户通过计算机向模块发送大批量数据,此时由于网络发送的数据过快,而串口的输出速度有限,经过一段时间肯定会导致发送不成功。所以一般情况下,用户需要检查send()的返回值,只有返回值和期望发送的数据量一样时,才算发送完毕。否则一定要继续调用send()发送未发送完毕的数据。通过这种检测,可以保证发送的数据不丢失。
楼主最近还看过