LabVIEW가 코드를 사용하여 고성능 직렬 포트 도우미를 구현하는 방법

LabVIEW는 기본적으로 Windows 시스템에서 개발됩니다. Windows에서는 다양한 기능을 구현하기 위해 어플리케이션 개발 중에 호출할 수 있는 많은 시스템 인터페이스가 제공되며, LabVIEW에서는 이러한 시스템 인터페이스를 패키징하여 LabVIEW에서 컨트롤을 형성할 수 있으며 LabVIEW 프로그램 개발 중에 호출할 수 있습니다. 앞선 글에서 언급한 바와 같이 임베디드 개발 분야에서는 PC 쪽의 직렬 포트 도구가 매우 중요하지만 많은 직렬 포트 도구는 데이터 양이 많을 때 성능상의 이유로 스턱 문제를 겪는 경우가 많다. 또한 직렬 포트 데이터 수집 후 더 많은 응용 프로그램 기능을 실현하기 위해 고유한 직렬 포트 도구를 수정할 수 없습니다. 이전 기사에서는 LabVIEW VISA API를 사용하여 직렬 포트 도우미를 신속하게 개발했지만 직렬 포트 데이터 수신 효율이 상대적으로 낮기 때문에 이 기사에서는 LabVIEW를 사용하여 고성능 직렬 포트 프로그램을 신속하게 개발하는 방법을 자세히 소개합니다.

1 고성능 직렬 포트 트랜시버 구현 방법

단일 칩 마이크로 컴퓨터, ARM, FPGA와 같은 임베디드 시스템의 보드에는 기본적으로 직렬 포트가 있다는 것을 알고 있습니다. 프로토콜이 간단하고 성숙하고 참조로 사용할 수 있는 기성품이 많기 때문입니다. PC의 직렬 포트를 통해 임베디드 시스템에서 정보 또는 데이터를 얻기 위해 LabVIEW는 일반적으로 Windows에서 몇 가지 옵션을 제공합니다.

  1. 개발 환경 자체에서 제공하는 직렬 포트 작동 인터페이스 기능을 사용하십시오.
  2. ActiveX 컨트롤 MSComm을 사용하십시오.
  3. 직렬 포트 작동을 실현하기 위해 Windows API를 직접 호출합니다.

Windows API를 직접 호출하여 직렬 포트 작업을 실현하는 것은 비교적 어렵습니다.Windows의 기본 API에 익숙해야 하며 이러한 API의 캡슐화는 MSComm 컨트롤에 의해 실현되었습니다. 또한 LabVIEW의 VISA 인터페이스는 직렬 포트를 작동시키기 위해 이전에 도입되었으며 송수신 효율이 상대적으로 낮기 때문에 고성능 직렬 포트 프로그램을 구현하기 위해 MSComm 제어를 선택합니다.

2. MSComm이란?

각 MSComm 컨트롤은 직렬 포트에 해당하며 여러 직렬 포트에 액세스하려면 여러 MSComm 컨트롤을 사용해야 합니다.

MSComm은 PC에서 직렬 포트 데이터의 송수신을 제어할 수 있는 ActiveX 컨트롤이며 쿼리 모드와 인터럽트 모드(Windows에서는 이벤트 구동 모드라고 함)를 지원합니다.

  • 인터럽트 모드: 직렬 포트에 데이터가 도착하거나 데이터가 직렬 포트 버퍼에 기록되면 인터럽트가 트리거되고 OnComm을 사용하여 이벤트를 캡처하고 처리할 수 있습니다. 이 방법은 적시에 응답하며 폴링 방법보다 효율적입니다.
  • 쿼리 방법: 사실 여전히 이벤트 기반이며 이벤트를 쿼리하려면 CommEvent 특성 값을 확인해야 합니다.

2.1 MSComm의 공통 속성

  • CommPort: 통신 포트 번호 설정 및 반환
  • 설정: 전송 속도, 패리티, 데이터 비트, 정지 비트를 문자열로 설정 및 반환
  • PortOpen: 통신 포트의 상태를 설정하고 반환합니다. 포트도 열고 닫을 수 있습니다.
  • 입력: 수신 버퍼에서 문자를 반환하고 제거합니다.
  • InputLen: 입력 속성이 수신 버퍼에서 읽는 문자 수를 설정하고 반환합니다.
  • 출력: 전송 버퍼에 문자열 쓰기
  • RThreshold: CommEvent 속성을 comEvReceive로 설정하고 OnComm을 생성하기 전에 수신할 문자 수를 설정하고 반환합니다.
  • CTSHolding: CTS 회선의 상태를 쿼리하여 데이터를 보낼 수 있는지 여부를 결정합니다.
  • SThreshold: CommEvent 속성을 comEvSend로 설정하고 OnComm 이벤트를 생성하기 전에 전송 버퍼에 허용되는 최소 문자 수를 설정하고 반환합니다.
  • CDHolding: CD 라인의 상태를 쿼리하여 현재 전송이 있는지 확인
  • DSRHolding: DSR 라인의 상태를 결정합니다.
  • EOFEnable: MSComm 컨트롤이 입력 중에 파일 끝(EOF)을 찾을지 여부를 결정합니다.

2.2 MSComm 제어 이벤트

MSCOMM 컨트롤은 하나의 이벤트 OnComm만 사용하고 CommEvent 속성의 17개 값을 사용하여 다양한 트리거 기회를 구분합니다. 주로 다음이 있습니다.

  • CommEvent=1인 경우: 전송 버퍼의 문자 수가 Sthreshold(설정 가능한 속성 값)보다 작음
  • CommEvent=2인 경우: Rthreshold(설정 가능한 속성 값) 문자를 수신 버퍼에 수신하고, 이 이벤트를 이용하여 데이터를 수신하는 과정을 작성할 수 있음
  • CommEvent=3인 경우: CTS 라인 변경
  • CommEvent=4인 경우: DSR 라인 변경
  • CommEvent=5인 경우: CD 라인 변경
  • CommEvent=6인 경우: 링잉 신호가 감지되었습니다.

나머지 10가지 상황은 통신 오류, 즉 오류 코드가 있을 때 발생합니다. MSComm에 대한 자세한 정보는 Microsoft의 msdn 웹사이트를 참조하십시오.

3개의 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的串口实现源码,感兴趣的朋友可以在vx gzh(技塑未来)回复“LABV_UART”获取。同时前面提到的LabVIEW VISA串口助手的实现,也一并放在这一个LabVIEW project下了。

추천

출처blog.csdn.net/suxiang198/article/details/128277414