LabVIEW如何实现高性能串口助手-附代码
Posted 技塑未来-苏导
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LabVIEW如何实现高性能串口助手-附代码相关的知识,希望对你有一定的参考价值。
LabVIEW基本上还是在Windows系统下进行开发。在Windows下,提供了非常多的系统接口,供应用开发时调用来实现各种功能,在LabVIEW里面也是可以通过对这些系统接口进行封装,形成LabVIEW里面的控件,供LabVIEW程序开发时调用。在之前的文章里面有提到过,在嵌入式开发领域,PC端的串口工具是非常重要的,但是有不少串口工具因为性能原因,在数据量较大时,经常会出现卡死的问题。另外固有的串口工具无法进行改造,来实现串口数据采集后的更多应用功能。前面的文章有用LabVIEW VISA API快速的开发了串口助手,但是串口数据接收效率比较低,因此本文将详细介绍,怎么用LabVIEW来快速开发更高性能的串口程序。
一 如何实现高性能的串口收发
我们知道一般单片机、ARM、FPGA等嵌入式系统的板子基本都会带有串口,因为协议简单,而且成熟,有许多现成的东西可以借鉴使用。在PC通过串口获取嵌入式系统传来的信息或数据,LabVIEW在Windows下一般有几种可选方案:
- 使用开发环境自身提供的串口操作接口函数;
- 使用ActiveX控件MSComm;
- 直接调用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,这时会弹出注册成功的提示框:
再在运行中输入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的串口实现源码,感兴趣的朋友可以在本公号(技塑未来)回复“LABV_UART”获取。同时前面提到的LabVIEW VISA串口助手的实现,也一并放在这一个LabVIEW project下了。
以上是关于LabVIEW如何实现高性能串口助手-附代码的主要内容,如果未能解决你的问题,请参考以下文章