VISA串口通信函数-自己测试用

本文介绍了如何使用VISA库进行串口通信,包括初始化通信参数、查找和连接USB设备、执行命令如IDN查询、SN设置以及端口操作,如查询和设置端口状态。

底层会用到visa定义的一些函数和库,visa.h;visatype.h;…;visa32.lib
这里用射频开关做了一个测试

VISA串口通信函数

test.h

#include "visa.h"
#include <stdio.h>
#include <string.h>
#include <string>
#include <stdlib.h>
#include <vector>
#include <unordered_map>
#include <iostream>

#include <utility>
#define MAX_CNT 200
#define MAX_SCPI_LENGTH                 255                         // 最大的SCPI命令 
#define DEFAULT_TIMEOUT                 5000                    // 超时:5000ms   
using namespace std;

typedef struct {
   
   
	char in_port[4];
	std::string out_port[16];  //这里对应16个输出口的    PORT input out_port\n
	std::unordered_map <char, std::string> port_connect;
	std::string dis_out_port; //这里只保存1个未被占用的端口    PORT input out_port\n
}PortInfo;



static ViStatus status = 0;    //ViStatus接口返回值类型, VI_SUCCESS表示执行成功              
static ViSession defaultRM = 0,vi;  //句柄,其中vi为操作设备的句柄。
static ViUInt32 retCnt = 0;
static char bytesWrite[VI_FIND_BUFLEN] = {
   
   '\0'}; //vi写缓冲区
static char bytesRead[VI_FIND_BUFLEN] = {
   
   '\0'};  //vi读缓冲区



///////初始化,设置波特率等
static void SessInit(ViSession &defaultRM);


///////查找枚举USB设备,将找到的端口号和端口号对应的资源描述符组成map,方便后面操作
static void FindPort(ViSession &defaultRM, unordered_map<ViUInt16,string> &portmap); 

////////根据用户选择的COM口userinputport来连接相应设备,连接上的设备操作句柄为vi
static void ConnectPort(ViSession &defaultRM, unordered_map<ViUInt16,string> &portmap, ViUInt16 userinputport,PortInfo &pinfo);

////////向设备发送IDN查询命令
static void FindIDN();

///////////// 向设备发送SN查询命令
static void FindSN();

////// 写入SN
static void SetSN(const char* sn);

////////查询开关切换次数switch?\n
static void FindSwitchNum();




/***************************PORT操作相关*****************************/

///////// PORT?\n  查询当前四路端口的输出口。
static void FindAllPort();

//第一次连接成功后初始化端口--->使端口默认连接上01 02 03 04 号口,并点亮对应图标。
 static void InitPortInfo(PortInfo &pinfo);


 //PORT input out_port\n

 //比如现在要执行PORT A 01\n 需要先判断BCD端口没有连接01端口,
 //假设B端口连了01端口则需给B重连一个未分配的端口
 //typedef struct {
   
   
	// char in_port[4];
	// std::string out_port[16];  //这里对应16个输出口的    PORT input out_port\n
	// std::unordered_map <char, std::string> port_connect;
	// std::string dis_out_port; //这里只保存1个未被占用的端口    PORT input out_port\n
 //}PortInfo;

 //这个函数用于按键触发执行  类似接通单个串口的命令,执行前增加判断逻辑
 //根据不同按键触构造不同指令 eg: PORT B 01\n 
static void DoPortin2out(PortInfo &pinfo);
static void DoPortin2out(PortInfo &pinfo){
   
    
// 假设初始化后(A,01)(B,02)(C,03)(d,04);现在执行 PORT B 01\n , 但是01被A占用
	char do_inport('B');
	string do_outport("16");

	char cmd[32]={
   
   0};
	
	//先判01 是否被占用,遍历 unordered_map
	auto e = pinfo.port_connect.begin();
	for(;e!=pinfo.port_connect.end();e++
### VISA函数在LabVIEW中的应用 VISA(Virtual Instrument Software Architecture)是一套标准化的编程接口,广泛应用于仪器控制领域。它支持多种物理通信方式,其中包括串口通信(RS-232/RS-485)、GPIB、USB和TCP/IP等[^1]。因此,在LabVIEW中,VISA函数确实可以用于串口通信。 #### 具体作用 VISA函数的主要目的是提供一种统一的方式来管理和操作各种硬件设备间的通信协议。对于串口通信而言,VISA提供了如下几方面的功能: 1. **初始化与配置** 使用`VISA Open`节点打开指定的串口号,并对其进行必要的参数设定,例如波特率、数据位数、停止位以及校验类型等。这些设置决定了如何正确地解析接收到的信息。 2. **数据收发管理** `VISA Write` 和 `VISA Read` 是两个核心组件分别负责向外部设备发送命令字符串或是从该装置获取响应消息。此外还有其他辅助性的方法如查询超时时间(`VISA Set Timeout`)以应对可能存在的延迟问题。 3. **错误处理机制** 鉴于实际工程环境中不可避免会出现各类意外状况,所以引入了专门用来清除缓冲区内残留未处理字节序列的功能——即所谓的“寄存器清零”。正如之前提到过的案例那样,适当运用此技术可以帮助解决因缓存溢满而导致的数据混乱现象虽然可能会伴随轻微丢帧风险但总体利大于弊。 ```python # Python模拟LabVIEW中使用VISA进行串口通信的例子 import pyvisa rm = pyvisa.ResourceManager() inst = rm.open_resource('ASRL3::INSTR') # 打开COM3端口 inst.baud_rate = 9600 # 设置波特率为9600bps inst.write_termination = '\n' # 定义写入终止符为换行符 inst.read_termination = '\n' # 定义读取终止符同样为换行符 command_to_send = "*IDN?" # 查询设备身份识别号的标准指令 response = inst.query(command_to_send) # 同步执行写入与读后返回结果 print(response.strip()) # 输出不带多余空白字符的回答部分 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值