海上月是天上月,眼前人是心上人
一、 UDP简介
Internet 协议集支持一种无连接的传输协议,该协议称为用户数据报协议(User Datagram Protocol)即UDP。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法,对应的需要建立连接才能发送数据包的Internet协议就是TCP。
由于UDP是一种无连接的传输层协议,因此不对传送数据包进行可靠性保证,UDP传输的可靠性由应用层负责,这是UDP的缺点。
但是,UDP的优点也很明显,无需连接开发简单,数据传输过程中延迟小、数据传输效率高,适合于一次传输少量数据,或者一点对多点的通信情况。所以通常音频、视频、监控界面等传输时通常使用UDP,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大的影响。
在LabVIEW中,对UDP协议进行了高度封装,我们只需要简单调用这些封装的函数,就可以比较轻松地实现以太网通信。UDP函数模块位于:右键程序框图面板→函数面板→数据通信→协议→UDP即可进如UDP函数子模块。
下面我们通过一个实例,来比较详细地讨论一下在LabVIEW中如何使用UDP进行数据通信。
二、实战练习
① 示例说明
平时我们从网上查到的UDP教程或者编程书籍上给的示例一般都是这样的:先建一个VI程序,作为UDP服务端,用于发送数据;然后再建一个VI程序,作为UDP客户端,用于接收数据。一个VI发送,一个VI接收,这看起来弄得UDP像一个半双工协议,其实不是的。在LabVIEW中UDP协议不像TCP协议,是没有严格的服务器端和客户端之分。
为了让大家更好的理解UDP通信,本示例用一个单独的VI程序作为服务端,与网络调试助手进行UDP通信,双方之间同时进行数据的发送和接收,VI程序发送给数据给网络调试助手,然后接收网络调试助手发送过来的数据并在前面板显示出来,而网络调试助手可以清楚的显示接收和发送的数据。
当然,两个LabVIEW UDP程序之间的通信更简单,程序基本是一样的,大家感兴趣可以自己去尝试一下;也可以将编写的LabVIEW程序与具备网口的硬件如单片机、PLC等用网线连接起来,让LabVIEW与各种硬件进行UDP通信,也是很容易实现的操作。后面有时间我再写一下LabVIEW如何与西门子S7-1200进行以太网通信。
② 服务端程序设计
服务端是一个VI程序,由于服务器端和客户端都是在同一台电脑上方运行,所以远程地址直接使用“127.0.0.1”,当然也可以使用本机的静态IP地址。
VI程序比较简单,设置一下本地和远程端口,就可以进行数据的发送和接收。发送端先将一个6个元素的布尔数组转化为一个字符串,当数组元素为0时,字符串为AABB CCDD;当数组元素为1时字符串为1122 3344(16进制字符串,总共4个字节)。那么最后写入UDP的字符串数据就是:AABB CCDD 1122 3344 AABB CCDD 1122 3344 AABB CCDD 1122 3344,总共24个字节的16进制数据。
UDP读取模块直接接收客户端发送过来的数据,并在前面上显示出来。实现方法如下:
③ 客户端使用说明
客户端是一个网络调试助手,在网上可以下载,各种版本的功能都大同小异。先设置协议类型为UDP,然后设置本地主机地址、本地主机端口6060,再打开端口,就可以接收数据了。
在发送端设置远程主机地址以及端口6050(也就是我们VI程序中的本地端口),然后在数据发送框中填写要发送的数据,并设置发送的循环周期,点击发送按钮,就可以以UDP协议周期性发送数据,我发送的一帧数据是:A1 A2 B1 B2 C1 C2 D1 D2 E1 E2 F1 F2 共12个字节的16进制数据。
三、小结
1 .通过上面两图我们可以发现,VI服务端的前面板正常显了网络调试助手发过来的12个字节数据;而网络调试助手的数据接收栏也显示了Labview程序发送过来的24个字节数据。这也说明VI程序与网络调试助手之间的UDP通信是正常的。
2 .服务端和客户端谁先启动都可以,对数据收发没有影响。
3 .在Labview中,UDP的读取和写入模块都只支持字符串格式的数据,如果我们要发送或接收的数据是数组或者其他标量数据,都需要先进行数据处理转换成字符串后,才能使用UDP模块进行数据的收发。
4 .LabVIEW中字符串的正常显示模式是ASCII模式,为了便于我们观察数据的收发,我们需要把前面板的2个字符串模块右键改为16进制显示模式;然后把网络调试助手的数据发送和接收模式都统一改为16进制模式,这样LabVIEW接收的字符串就不会显示乱码。