LabVIEW开发TCP网络通讯程序4
创建连接处理程序
现在终于准备好实现管理这些消息的可重入命令处理程序了,关键点确保它是完全可重入的。这意味着,如果VI的主要子VI不是,那么VI本身可重入几乎没有好处。那么什么是“主要”子VI?需要考虑的两件事是:
子VI多久执行一次?如果子VI在初始化期间很少执行或只运行一次,则使其可重入可能不利。
执行需要多长时间?同样,实现简单逻辑、快速执行的子VI可能不会像可重入代码那样提供很多好处。
将处理程序的整体结构定义为具有三个状态的状态机,对应于响应交互的三个阶段。所以需要做的第一件事(也是要执行的第一个状态),它的工作是从新的TCP连接读取整个消息,测试它的有效性,如果有效,则将命令传递给状态。
协议要求每条消息以2字节计数开头,因此状态首先从接口读取两个字节,将生成的二进制值转换为U16数字,然后使用该数字读取消息的其余部分。然后,为了验证消息,代码对整个消息(包括末尾的CRC)执行CRC计算。如果消息和CRC有效,则此计算的结果将始终为0。代码会从字符串的末尾剥离CRC,并将字符串的剩余部分发送到子VI中,子VI将JSON对象转换为LabVIEW对象。这里选择了一种面向对象的方法,因为它实际上简化了代码,并且它提供了一个清晰的路线图,说明如果用户决定在未来添加更多接口命令,需要做什么。
状态调用一个动态调度方法,该方法负责通过定义的事件与应用程序的其余部分进行接口,并格式化要发送给调用方的响应。这部分代码的对象模型有5个子类(每个命令一个),当JSON命令结构不包含有效的命令对象时,父类用作默认值。
此处的作用是处理从远程访问引擎返回的响应,以及读取图形数据的事件的逻辑。由于响应通知程序中返回的变体可以是文本错误消息,也可以是实际数据数组,因此代码要做的第一件事是尝试将变体转换为字符串。如果此尝试失败并生成错误,用户知道响应包含数据,因此可以对其进行格式化以返回到远程调用方。如果变体成功转换为字符串,用户知道命令失败,并且可以将错误传递回调用方。
此时,已准备好将响应发送回调用方,因此状态机将转换为Send Response state。在这里,看到了格式化响应并将其传输到调用方的逻辑。
由于消息的核心是响应Cluster的JSON表示形式,因此代码首先将Cluster平展为JSON字符串。但是请注意,它生成的字符串不包含多余的空格,因此它看起来与之前展示的JSON示例不同。接下来,逻辑计算返回消息的长度和JSON的CRC。这两个值分别添加到JSON字符串的开头和结尾,结果将写回TCP连接。
最后,状态关闭TCP连接并停止状态机循环,该循环也会停止并从内存中删除一直在运行的可重入克隆。
最后,需要再次测试验证。
需要说明的是,上述的例程和文档,都是可以下载的,双击即可打开,其中压缩文件是可以采用粘贴复制的方式,拷贝到硬盘上。这不是图片,各位小伙伴看到后尝试一下,这个问题就不用加微信咨询了。有关LabVIEW编程、LabVIEW开发等相关项目,可联系们。附件中的资料这里无法上传,可去公司网站搜索下载。