LabVIEW如何实现高性能串口助手-附代码

LabVIEW基本上还是在Windows系统下进行开发。在Windows下,提供了非常多的系统接口,供应用开发时调用来实现各种功能,在LabVIEW里面也是可以通过对这些系统接口进行封装,形成LabVIEW里面的控件,供LabVIEW程序开发时调用。在之前的文章里面有提到过,在嵌入式开发领域,PC端的串口工具是非常重要的,但是有不少串口工具因为性能原因,在数据量较大时,经常会出现卡死的问题。另外固有的串口工具无法进行改造,来实现串口数据采集后的更多应用功能。前面的文章有用LabVIEW VISA API快速的开发了串口助手,但是串口数据接收效率比较低,因此本文将详细介绍,怎么用LabVIEW来快速开发更高性能的串口程序。

一 如何实现高性能的串口收发

我们知道一般单片机、ARM、FPGA等嵌入式系统的板子基本都会带有串口,因为协议简单,而且成熟,有许多现成的东西可以借鉴使用。在PC通过串口获取嵌入式系统传来的信息或数据,LabVIEW在Windows下一般有几种可选方案:

  1. 使用开发环境自身提供的串口操作接口函数;
  2. 使用ActiveX控件MSComm;
  3. 直接调用WindowsAPI实现串口操作。

直接调用WindowsAPI实现串口操作实现难度相对要大一些,要对Windows底层API比较熟悉,而且这些API的封装,MSComm控件已经实现好了。另外前面介绍过LabVIEW的VISA接口操作串口,收发效率是比较低的,因此选择MSComm控件来实现高性能的串口程序。

二 什么是MSComm

每个MSComm控件,都对应一个串口,若需访问多个串口时必须使用多个MSComm控件。

MSComm是ActiveX控件,可以在PC上控制串口数据的发送和接收,支持查询方式和中断方式(Windows下称为事件驱动方式)。

  • 中断方式:当串口有数据到达或有数据写入到串口缓冲中时,就会触发中断,可以使用OnComm捕获事件并进行处理。这种方式响应及时,比轮询方式效率要高。
  • 查询方式:实际上仍热是事件驱动的,需要检查CommEvent属性值来查询事件。

2.1 MSComm的常用属性

  • CommPort:设置并返回通讯端口号
  • Settings:以字符串形式设置并返回波特率、奇偶校验、数据位、停止位
  • PortOpen:设置并返回通讯端口的状态。也可以打开和关闭端口
  • Input:从接收缓冲区返回和删除字符
  • InputLen:设置并返回input属性从接收缓冲区读取的字符数
  • Output:向传输缓冲区写一个字符串
  • RThreshold:在设置CommEvent属性为comEvReceive并产生OnComm之前,设置并返回要接收的字符数
  • CTSHolding:确定是否可通过查询CTS线的状态发送数据
  • SThreshold:设置CommEvent属性为comEvSend并产生OnComm事件之前,设置并返回传输缓冲区中允许的最小字符数
  • CDHolding:通过查询CD线的状态确定当前是否有传输
  • DSRHolding:确定DSR线的状态
  • EOFEnable:确定在输入过程中MSComm控件是否寻找文件结尾(EOF)

2.2 MSComm控件的事件

MSCOMM控件只使用一个事件OnComm,用属性CommEvent的十七个值来区分不同的触发时机。主要有以下几个:

  • CommEvent=1时:传输缓冲区中的字符个数已少于Sthreshold(可设置的属性值)个
  • CommEvent=2时:接收缓冲区中收到Rthreshold(可设置的属性值)个字符,利用此事件可编写接收数据的过程
  • CommEvent=3时:CTS线发生变化
  • CommEvent=4时:DSR线发生变化
  • CommEvent=5时:CD线发生变化
  • CommEvent=6时:检测到振铃信号

另外十种情况是通信错误时产生,即错误代码。关于MSComm的更详细的资料可参考Microsoft的msdn网站。

三 MSComm控件的注册

在LabVIEW中使用MSComm控件时,需要导入--ActiveX控制至选板才可以看到MSComm控件。但是如果Windows PC的MSComm控件注册有问题,那么通过导入也是看不到的,那么就需要先下载注册MSComm控件。

首先将下载的mscomm32.ocx文件放到C:\windows\system32下,然后在运行中输入Regsvr32 C:\windows\system32,这时会弹出注册成功的提示框:

扫描二维码关注公众号,回复: 16024814 查看本文章

再在运行中输入Regedit命令打开注册表,找到HKEY_CLASSES_ROOT\Licenses,在里面添加主键,右键选择“新建”--“项”,然后将该项命名为4250E830-6AC2-11cf-8ADB-00AA00C00905,在右边右键“默认”选择“修改”,然后输入数值kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun。注册mscomm32.ocx控件防止在LabVIEW中导入时发生“类别未授权使用”错误。
注册完成后,重启一下电脑,此时就可以看到MSComm控件了(图中第三个):

四 LabVIEW使用MSComm控件实现串口程序

前面提到过一般的应用,LabVIEW中直接用VISA串口API函数就可以实现,方便快捷,但是对于需要使用中断方式进行串口通信的,就得使用MSComm控件了。操作ActiveX控件,最主要的就是要使用好它的属性、方法函数,并做好中断事件的回调处理。LabVIEW针对ActiveX设置的控件在“互连接口”的“ActiveX”中提供了8个功能函数:Automation Open, Close Reference, To Variant, Variant to Data, Invoke Node, Property Node, Register Event Callback, UnRegister Event Callback。

4.1 LabVIEW中使用MSComm控件

首先需要在LabVIEW中加入MSComm,在“工具”--“导入”--“ActiveX至选板”中将MSComm添加到LabVIEW环境,选择默认路径。然后可以在前面板的".Net与ActiveX"中找到mscomm然后拖拽到前面板中。也可以先在前面板放置ActiveX容器,然后右键选择mscomm控件:

调用ActiveX控件创建客户端应用程序:主要用到“互连接口”--“ActiveX”中的8个函数:

ActiveX事件注册相关:即使用事件回调处理中断事件等,

4.2 编程注意事项

对于MSComm控件,编程时使用的都是其自动化引用,即LabVIEW将ActiveX控件作为对象来处理。连接属性节点到控件,可以查看所有属性,连接调用节点时,MSComm没有提供方法,所以会显示没有方法。以下是LabVIEW中看到的MSComm的属性:

另外,回调事件注册首先要确定好需要传输什么样的数据,如果包含多种数据类型,可以使用簇来解决,回调函数中会自动创建与该数据类型相同的事件参数,并提供ActiveX控件的引用。

五 文末活动

对于LabVIEW的串口实现源码,感兴趣的朋友可以在vx gzh(技塑未来)回复“LABV_UART”获取。同时前面提到的LabVIEW VISA串口助手的实现,也一并放在这一个LabVIEW project下了。

猜你喜欢

转载自blog.csdn.net/suxiang198/article/details/128277414