底层会用到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库进行串口通信,包括初始化通信参数、查找和连接USB设备、执行命令如IDN查询、SN设置以及端口操作,如查询和设置端口状态。
最低0.47元/天 解锁文章

2871

被折叠的 条评论
为什么被折叠?



