LabView支持多种串口通信技术,本文介绍的程序基于MScomm控件开发,具有易用和通信效率高的特点。通过对在简单、状态机、队列处理器和生产者消费者几种编程模式下开发的LabView串口通信程序进行比较,探讨编程模式对程序开发的影响。 如图1所示为程序前面板,用几种不同模式开发的程序具有相同的前面板。前面板左上角的电话机符号是在电脑注册了MScomm控件,并且在LabView中调用了相应的ActiveX控件后才会出现。电话机符号下面的二个方框定义了串口通信参数。在中间一列的第一个方框表示送到数字引脚的开关量,第二个方框表示送到模拟引脚(PWN)的数值。点按“Read & Write”按钮,二个方框中的数据被送至串口被下位机接收。同时电脑从串口读取下位机发送的数据,将接收的数据整理后显示在右列的二个方框中。右列第一个方框表示接收到的数字引脚信号,第二个方框中的数值表示接收到的模拟引脚信号。点按“停止”按钮将结束程序运行。
图1 串口通信程序前面板 一、简单模式 如图2所示的串口通信程序框图,具有事件结构的简单模式的程序采取了顺序数据流方式,程序简单易懂,但是在程序复杂时程序框图会变得无比繁复,简单易懂的特点全然消失。该程序中采用了Write和Read两个子程序改善了程序,不然该程序框图会繁复至难以展现。Write和read子程序是程序与串口输入输出间的格式接口,修改write和read子程序可以适应不同格式的串口输入输出。事件结构在while循环中具有二个分支,一个分支如图2所示完成串口的读写操作事件,另一个未在图中显示的是退出while循环结束程序运行的Stop分支。
图2 简单模式的串口通信程序框图 二、状态机模式 状态机模式利用了LabView的特点编写程序,将程序分成小块,如图3列出的串口通信程序框图所示,程序框图更便于观察、分析和修改。处于while循环中的程序采用了条件结构,并且用图4所示的枚举控件实现条件结构的条件选定,完成程序的数据流向。条件结构设置了Initialize、Wait for Event、Write、Read和Stop五个分支,其中Wait for Event分支包含类同图2所示的事件结构。枚举控件的项值赋予移位寄存器,每一个分支完成后通过移位寄存器(上一次循环存入的枚举控件的项值)转向另一个分支,直至执行到Stop分支退出while循环结束程序运行,或者在程序出错时退出while循环结束程序运行。
图3 状态机模式的串口通信程序框图
图4 枚举控件立项 三、队列处理器模式 队列处理器模式采用了队列操作函数,用队列操作函数取代了状态机模式中的枚举控件和移位寄存器。队列处理器模式的其他部分与状态机模式相同。队列处理器模式继承了状态机模式的所有优点,并因为采用了队列操作函数,程序编写更加自由。如图5所示的用队列处理器模式模式编写的程序框图,一开始让Initialize和Wait for Event二个元素加入队列,while循环中先从队列取出元素,这样可以连续运行二次,完成条件结构中Initialize分支和Wait for Event分支。而在状态机模式中的移位寄存器一次只能存入一个项值。
图5 队列处理器模式的串口通信程序框图 四、生产者消费者模式 生产者消费者模式对队列处理器模式作了改进,将元素入队列和元素出队列分在二个while循环中并行完成。图6所示的串口通信程序框图中,元素入队列在图6下面的while循环(生产者循环)中完成,元素出队列在上面的while循环(消费者循环)中完成。元素入队列和元素出队列分在二个不同while循环中不仅使程序表达更加清晰明了,而且并行设计让程序的多线程运行效率更高。生产者循环中的while循环包含的事件结构具有二个按钮事件,“Read & Write”按钮表示读写串口操作,“停止”按钮表示完成工作结束程序运行。生产者循环根据事件指令退出while循环,然后释放队列引用。程序开始时获取的队列引用结束了存在,消费者循环中检查元素出队列时检出错误,导致消费者循环退出其while循环,从而结束整个程序运行。
图6 生产者消费者模式的串口通信程序框图
五、结论 根据前面对串口通信程序的简单、状态机、队列处理器和生产者消费者几种编程模式的探讨,总结出以下几点: (1) 简单模式简单易学,对于初学者容易上手,但是随着程序复杂程度上升,简单模式的程序框图会越来越繁复,不利于编写和分析程序。 (2) 状态机模式明显改善了程序框图的布置方式,使得编写的程序易读易懂。 (3) 队列处理器在编写程序易读易懂的基础上进一步提升了程序编写的自由度。 (4) 对于串口通信这一类程序,生产者消费者模式是最理想的编程模式,值得LabView爱好者学习掌握。
备注:相关程序见附件
|