[VISA]实现PC与外设串口通信功能

简述

串口通信是使用非常广泛的通信协议之一,一般都是指的RS232,一般PC都会支持串口的,对于速度要求不是特别高的,用串口来通信相对比较简单,而且成本也很低。

关于RS232

RS232常见的9针串口接口,其电平其实是-15V和15V的,-15V貌似表示数据1,而15V表示数据0。而一般单片机的UART接口是使用的TTL电平,0表示低电平,1表示高电平。因此单片机的UART和PC的RS232之间需要有一个转换,有许多成熟的IC可以使用。RS232的通信协议也相对简单。

关于VISA

LabVIEW的VISA模块是用于和外部仪器通信用的,其中有GPIO,串口等等。之前使用过调用MSComm控件的方式,即利用Windows提供的控件对象,在LabVIEW中对该控件的属性和方法进行操作,来实现串口通信。之所以使用MSComm控件,是因为比使用VISA来实现串口通信要灵活一些,比如可以通过回调的方式,在PC的串口buffer中数据字节数到达某一设定值时,可以触发注册好的LabVIEW回调函数来进行处理,这种方式就很好的避免了在轮询中去读取串口数据了,效率提升是很明显的,特别是在速度和数据吞吐率有略高的要求时。

当然了,使用VISA也是可以很简洁的实现串口通信的,其优点就是使用简单,虽然用户体验的简单性往往都会牺牲一些使用上的灵活性。

串口API

VISA一共提供了8个串口API,VISA配置串口API是第一个需要知道的,因为其余所有API使用之前,必须使用这个先。因为PC的串口也和MCU的串口工作原理都是一样的,必须先配置好,并生效,才能使用之。

VISA串口字节数API,因为串口设备一般都会有一个buffer,可以在开发者读出其数据前,将对方的串口设备送过来的数据先暂存在这buffer,而程序开发者需要读取其中数据时,先用这个API看下buffer里面有多少个byte数据,再取出即可。

VISA关闭API,其实LabVIEW中也是占用的PC的某个串口资源的,使用完了,就要关闭掉释放这个资源,可能出了LabVIEW程序,其他的运行于PC的程序偶尔也要用到呢。LabVIEW中有很多这种释放资源的API,大概像进行了malloc,那么用完就得free是一样的道理吧。

VISA清空I/O缓冲区API,作用就是清除掉暂存串口数据的buffer内容,可能有些时候需要丢掉一些数据,用这个API即可。

VISA读取API,显而易见,就是从串口buffer当中读出字节数据了,可以先获取buffer当中字节个数,然后读取对应个数的数据。

VISA串口中断API,这个和MCU的UART中断不是一回事的,是在数据线中设置中断,即两个串口相连,串口1调用该VISA串口中断API设置一次中断,那串口2就会检测到一次数据线中断。不过这个API具体的还没有实际用过。

VISA设置I/O缓冲区大小API,就是设置串口暂存数据buffer的大小,默认好像是无限大,但是那样做还是有风险的,因为PC内存毕竟也有限,如果串口数据一直接收,并一直不读出,那buffer其实会占掉较多内存了吧。所以buffer的大小可以根据自己的需要设置一个适当的值,比较妥当点。

VISA写入API,就是将数据写入串口write buffer咯,然后PC串口硬件检测到write buffer非空时,一个byte一个byte的将数据发出。

实现一个简单的串口助手

用VISA串口API可以实现简单的串口助手工具的,这个很多人都写过的,但是这种方式写的串口助手不高效,在实际使用的时候就能够感觉到的,串口不停的发数据,然后又一边不停的写数据时,很容易卡死的。

串口写

这里其实是通过串口发送仪器的控制指令,用一个UI线程实现即可。外面先调用VISA的配置API,然后在UI线程中完成VISA的写入,最后会将VISA串口资源释放。

串口读

这里其实用了一个队列,来循环的从串口buffer中读取数据,因为VISA串口读取没有中断方式,这里也是导致串口工具效率的最大瓶颈,因此先用一个循环,每隔500ms从串口中读出接收的数据到队列中,这样可以一次读取许多个byte数据,另外循环也不必一直进行,而是有一个500ms的等待,对其余线程的运行还是有些帮助的,当然如果需要不是那么快速,这个500ms等待时间或许还可以设置更长一些。

然后通过阻塞队列,只要队列中有数据了,就从队列中取出数据,用于自己的应用中。

使用VISA串口API,有利有弊。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-31 03:40:07

[VISA]实现PC与外设串口通信功能的相关文章

串口通信(基础)

参考文章:http://www.cnblogs.com/aierong/archive/2009/08/21/1551589.html http://www.cnblogs.com/procoder/archive/2009/04/07/1430871.html http://blog.csdn.net/cy757/article/details/4474930 SerialPort Class Windows 7 虚拟串口 VSPD 6 最近总结了串口(COM)读写操作的三种方式:第1种方式是

PC软件与PLC串口通信 奇偶检验问题

PC软件与PLC进行串口通信 波特率:19200 校验位:偶检验 数据位:8 停止位:1 现象 一,PC软件向PLC可以发送1,2,4,5,7,8,但是3,6,9发送出去后,PLC无法收到 二,使用虚拟串口,PC软件与串口调试助手可以正常通信 原因 PC软件中,校验位按照Mark(奇偶校验位始终1)位填充. 即,在上述的环境中,PC软件用的是奇偶校验位1发送,PLC使用偶数检验接收,所以根据奇偶检验的原理,可以解释3,6,9无法接收的现象了. 奇偶检验原理 奇校验:就是让原有数据序列中(包括你要

Arduino nano pc 串口通信

上回书说到(以下省略100字) 说到底还是要自己写一个PC和Arduino 通信的程序,毕竟还是要集成到咱的系统上来. c# 其实本身是有串口通信的类库的 arduino也自带软硬串行通信类库 两个类库一对话,一切就成了. 哦,我用的vb,哈哈哈 Imports System.IO.Ports Public Class Form1 Private WithEvents port As SerialPort Private Sub btnPort_Click(sender As Object, e

labview与单片机串口通信

VISA是虚拟仪器软件体系结构的缩写(即Virtual Instruments Software Architecture),实质上是一个I/O口软件库及其规范的总称. VISA是应用于仪器编程的标准I/0应用程序接口,是工业界通用的仪器驱动器标准API(应用程序接口),采用面向对象编程,具有很好的兼容性.扩展性和独立性.用户可用一个API控制包括VXI.GPIB及串口仪器在内的不同种类的仪器.它还支持多平台工作.多接口控制,是一个多类型的函数库. 在LabVIEW中编写的VISA接口程序,当外

嵌入式Linux裸机开发(七)——UART串口通信

嵌入式Linux裸机开发(七)--UART串口通信 一.UART串口通信简介 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER, 它用来传输串行数据.发送数据时, CPU 将并行数据写入UART,UAR按照一定的格式在一根电线上串 行发出:接收数据时, UART检测另一根电线的信号,将串行收集在缓冲区中, CPU 即可读取 UART 获得这些数据. 在 S5PV210中, UART提供了 4 对独立的异步串口I/O端口,

SPCOMM控件在Delphi串口通信中的应用

SPCOMM控件在Delphi串口通信中的应用 2010-07-08 22:20:31|  分类: 个人日记 |举报 |字号 订阅 2009-03-01 05:35 摘要:利用Delphi开发工业控制系统软件成为越来越多的开发人员的选择,而串口通信是这个过程中必须解决的问题之一.本文在对几种常用串口通信方法分析比较的基础上,着重讨论了Delphi开发环境下利用Spcomm控件实现PC机与单片机之间串口通信的方法,研究了Spcomm串口通信的关键技术问题,并通过一个实例给出了Spcomm控件在De

Java串口通信具体解释

序言 说到开源,恐怕非常少有人不挑大指称赞.学生通过开源码学到了知识,程序猿通过开源类库获得了别人的成功经验及可以按时完毕手头的project,商家通过开源软件赚到了钱……,总之是皆大欢喜.然而开源软件或类库的首要缺点就是大多缺乏具体的说明文档和使用的样例,或者就是软件代码随便你用,就是文档,样例和后期服务收钱.这也难怪,毕竟就像某个著名NBA球员说的那样:“我还要养家,所以千万美元下面的合同别找我谈,否则我宁可待业”.是啊,支持开源的人也要养家,收点钱也只是分.要想既不花钱又学到知识就仅仅能借

13.5 串口通信原理和控制程序

我们前边学串口通信的时候,比较注重的是串口底层时序上的操作过程,所以例程都是简单的收发字符或者字符串.在实际应用中,往往串口还要和电脑上的上位机软件进行交互,实现电脑软件发送不同的指令,单片机对应执行不同操作的功能,这就要求我们组织一个比较合理的通信机制和逻辑关系,用来实现我们想要的结果. 本节所提供程序的功能是,通过电脑串口调试助手下发三个不同的命令,第一条指令:buzz on 可以让蜂鸣器响:第二条指令:buzz off 可以让蜂鸣器不响:第三条指令:showstr ,这个命令空格后边,可以

串口通信(1)

什么是串口? 什么是RS-232? 什么是RS-422? 什么是RS-485? 什么是握手? 1.什么是串口? 串口是计算机上一种非常通用的设备通信的协议.大多数计算机包含两个基于RS232的串口.串口同时也是仪器仪表设备通用的通信协议:很多GPIB兼容的设备也带有RS-232口.同时,串口通信协议也可以用于获取远程采集设备的数据. 串口通信的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据.它很简单并