简述
串口通信是使用非常广泛的通信协议之一,一般都是指的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,有利有弊。
版权声明:本文为博主原创文章,未经博主允许不得转载。