当前位置:首页 > CN2资讯 > 正文内容

windows10 安装docker desktop windows10 安装 ni VISA16.0

11小时前CN2资讯


一、下载

波音747航班:https://www.ni.com/zh-cn/support/downloads/drivers/download.ni-visa.html#329456

选择合适的版本下载

 

二、安装

安装之前请关闭防火墙和其他杀毒软件等;

按照流程一路next即可。

 

三、.lib、.dll、.h文件位置

64位WIN10系统为例,.lib文件和.h文件在“C:\Program Files\IVI Foundation\VISA\Win64”目录下的include和lib_x64目录下,.dll文件在“C:\Windows\System32”和“C:\Windows\SysWOW64”中

 

四、案例

1】ComPort.h

#pragma once #include <string> #include <atlconv.h> #include <map> //包含VISA头文件和库文件 #include "visa.h" #ifdef COMMUNICATION_EXPORTS #define COMMUNICATION_API __declspec(dllexport) #else #define COMMUNICATION_API __declspec(dllimport) #endif //通信基类 class COMMUNICATION_API CComPort { protected: //通信口是否已打开 bool m_bIsOpened; //通信接口的互斥锁 CRITICAL_SECTION m_csComm; public: CComPort(void); virtual ~CComPort(void); public: //打开通信端口 virtual bool Open(std::string strParam) = 0; //关闭通信端口 virtual void Close(void) = 0; //发送数据 virtual int Send(const unsigned char *cData, int nLen) = 0; //接收数据 virtual int Recv(unsigned char *cData, int nLen) = 0; //重新打开通信口 virtual bool ReOpen(void) = 0; //通信口可能同时只能供一个线程调用,使用时请求锁 virtual bool TryToLock(bool bMode = true); //线程使用完串口后,为通信口实例释放锁 virtual void ReleaseLock(void); //通信口是够已经打开 virtual bool IsOpened(void) { return m_bIsOpened; } };

2】ComPort.cpp

#include "stdafx.h" #include "ComPort.h" CComPort::CComPort(void) { m_bIsOpened = false; InitializeCriticalSection(&m_csComm); } CComPort::~CComPort(void) { DeleteCriticalSection(&m_csComm); } //通信口可能同时只能供一个线程调用,使用时请求锁 bool CComPort::TryToLock(bool bMode) { EnterCriticalSection(&m_csComm); return true; } //线程使用完串口后,为通信口实例释放锁 void CComPort::ReleaseLock(void) { LeaveCriticalSection(&m_csComm); }

 

3】IEEE488Port.h

#pragma once #include "comport.h" class CComIEEE488Fun { public: //校验位类型和int的对应 static std::map<std::string, int> cComParityMap; }; //IEEE-488通信类 class COMMUNICATION_API CIEEE488Port : public CComPort { private: //IEEE-488通信口地址 char *m_pStrIEEEAddress; //IEEE-488参数 char *m_pStrIEEEParam; // 默认资源管理器会话的唯一逻辑标识符。 ViSession m_vfaultRM; //IEEE-488句柄 ViSession m_vIEEEHandle; public: CIEEE488Port(void); virtual ~CIEEE488Port(void); public: //打开通信端口 virtual bool Open(std::string strParam); //关闭通信端口 virtual void Close(void); //发送数据 virtual int Send(const unsigned char *cData, int nLen); //接收数据 virtual int Recv(unsigned char *cData, int nLen); //重新打开通信口 virtual bool ReOpen(void); private: //解析Open函数传递过来的串口参数 bool parseOpenParam(std::string strParam); //设置初始化参数,如缓冲区大小和超时时间等 bool initSetting(void); };

4】IEEE488Port.cpp

#include "stdafx.h" #include "IEEE488Port.h" std::pair<std::string, int> pairParityType[]= { std::make_pair("N", 0), std::make_pair("O", 1), std::make_pair("E", 2), std::make_pair("M", 3), std::make_pair("S", 4), }; std::map<std::string, int> CComIEEE488Fun::cComParityMap(pairParityType, pairParityType+sizeof(pairParityType)/sizeof(pairParityType[0])); CIEEE488Port::CIEEE488Port(void) : CComPort() { // 存放IEEE-488通信地址 m_pStrIEEEAddress = new char[128]; m_pStrIEEEAddress[0]=0; // 存放参数 m_pStrIEEEParam = new char[32]; m_pStrIEEEParam[0] = 0; } CIEEE488Port::~CIEEE488Port(void) { //试图关闭通信口 Close(); delete []m_pStrIEEEAddress; delete []m_pStrIEEEParam; } //打开通信端口 bool CIEEE488Port::Open(std::string strParam) { //通信口已被打开 if(m_bIsOpened) return true; //解析IEEE-488通信口打开参数 if(parseOpenParam(strParam)==false) { return false; } // 初始化一个VISA资源管理器 ViStatus status = viOpenDefaultRM (&m_vfaultRM); if(status!= VI_SUCCESS) return false; //打开IEEE-488通信口,并创建操作句柄 status = viOpen(m_vfaultRM, m_pStrIEEEAddress,VI_NULL,VI_NULL, &m_vIEEEHandle); if(status != VI_SUCCESS) { return false; } //设置IEEE-488通信口初始化参数 if(initSetting()==false) return false; m_bIsOpened = true; return true; } //关闭通信端口 void CIEEE488Port::Close(void) { if(m_bIsOpened==false) return; // viClose:关闭特定的会话、事件或查找列表 viClose(m_vIEEEHandle); viClose (m_vfaultRM); m_bIsOpened = false; } //发送数据 int CIEEE488Port::Send(const unsigned char *cData, int nLen) { ViPUInt16 status = NULL; DWORD dwRealSend = 0; if(m_bIsOpened==false) return -1; 如果IEEE-488有错误,则清除输入/输出缓冲区 viReadSTB(m_vIEEEHandle, status); if(status != VI_SUCCESS) { // 终止操作(VISA将中止当前进程中对指定vi执行的任何调用) viTerminate(m_vIEEEHandle, VI_NULL, VI_NULL); //格式化指定缓冲区 viFlush(m_vIEEEHandle,VI_WRITE_BUF_DISCARD); } //写数据(同步) // viPrintf(m_vIEEEHandle, (ViString)cData) if(viWrite(m_vIEEEHandle, cData, nLen, &dwRealSend) != VI_SUCCESS) { return -2; } //返回实际发送的数据大小 return dwRealSend; } //接收数据 int CIEEE488Port::Recv(unsigned char *cData, int nLen) { ViPUInt16 status = NULL; DWORD dwRealRead = 0; if(m_bIsOpened==false) return -1; //如果IEEE-488有错误,则清除输入/输出缓冲区 viReadSTB(m_vIEEEHandle, status); if(status != VI_SUCCESS) { // 终止操作(VISA将中止当前进程中对指定vi执行的任何调用) viTerminate(m_vIEEEHandle, VI_NULL, VI_NULL); //格式化指定缓冲区 viFlush(m_vIEEEHandle,VI_READ_BUF_DISCARD); } //读数据(同步) // 从设备读取一个字符串,然后格式化后保存值dwRealRead中(隐式分割符是被忽略的) // viScanf(m_vIEEEHandle, (ViString)cData) if(viRead(m_vIEEEHandle, cData, nLen, &dwRealRead) != VI_SUCCESS) { return -2; } return dwRealRead; } //重新打开通信口 bool CIEEE488Port::ReOpen(void) { if(strlen(m_pStrIEEEAddress)==0 || strlen(m_pStrIEEEParam)==0) return false; //关闭通信口 Close(); //打开通信口 std::string strParam = m_pStrIEEEAddress + std::string(";") + m_pStrIEEEParam; return Open(strParam); } //解析Open函数传递过来的串口参数 bool CIEEE488Port::parseOpenParam(std::string strParam) { //寻找IEEE-488通信地址的结束位置(";"号) std::size_t nFound = strParam.find(';'); //未找到通信口名 if (nFound==std::string::npos) return false; //分解参数字符串为端口名和参数两个部分 strcpy_s(m_pStrIEEEAddress, 128, strParam.substr(0, nFound).c_str()); strcpy_s(m_pStrIEEEParam, 32, strParam.substr(nFound+1).c_str()); return true; } //设置初始化参数,如缓冲区大小和超时时间等 bool CIEEE488Port::initSetting(void) { //设置I/O读/写缓冲区大小(初始化一个指定的通信设备的通信参数。) if(!viSetBuf(m_vIEEEHandle, VI_READ_BUF|VI_WRITE_BUF, 1024)) { Close(); return false; } //设置超时参数 viSetAttribute(m_vIEEEHandle,VI_ATTR_TMO_VALUE,1000); //格式化指定缓冲区 viFlush(m_vIEEEHandle,VI_READ_BUF |VI_WRITE_BUF); /******************************************************/ //开始设置通信口的波特率,数据位,停止位,流控,校验等参数 char **cRemainder = NULL; char* cBaud = strtok_s(m_pStrIEEEParam, ",", cRemainder); viSetAttribute(m_vIEEEHandle,VI_ATTR_ASRL_BAUD, atoi(cBaud)); char* cDataBits = strtok_s(NULL, ",", cRemainder); viSetAttribute(m_vIEEEHandle,VI_ATTR_ASRL_DATA_BITS, atoi(cDataBits)); char* cParity = strtok_s(NULL, ",", cRemainder); viSetAttribute(m_vIEEEHandle,VI_ATTR_ASRL_PARITY, CComIEEE488Fun::cComParityMap[cParity]); char* cStopBits = strtok_s(NULL, ",", cRemainder); viSetAttribute(m_vIEEEHandle,VI_ATTR_ASRL_STOP_BITS, atoi(cStopBits)); return true; }

【注】请自觉在项目属性页->【配置属性】->【链接器】->【常规】->【附加库目录】中添加所需lib文件所在位置;

            项目属性页->【配置属性】->【链接器】->【输入】->【附加依赖项】中添加所需.lib文件;

             dll文件需放在项目对应的目录下。

【注】具体的信息参见“NI-VISA用户手册和NI-VISA程序员参考手册.zip”,网上有资源,请自行搜索。

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/27074.html

    分享给朋友:

    “windows10 安装docker desktop windows10 安装 ni VISA16.0” 的相关文章

    RackNerd VPS服务测评:性价比高、稳定性强的主机商推荐

    在当今的网络世界中,选择合适的主机商显得尤为重要。我最近体验了RackNerd这家提供VPS服务的主机商,想和大家分享一些我的观点。RackNerd因其性价比高而广受好评,这让我在决定购买前进行了详细的测评。我会从多个角度来探讨RackNerd的各方面表现。 RackNerd不仅在价格上拥有明显优势...

    eno VPS:掌握网络接口命名规则与性能优化技巧

    在了解eno VPS之前,我们先来看看什么是eno命名规则。ena作为一种网络接口命名方式,通过特定的规则来表示Linux系统中的网络设备。这种规则帮助用户更容易地识别和管理各种网络接口。具体来说,eno采用的是eno[n|d]的格式,主要用于板载设备。而对于热插拔设备,则使用ens[f][n|d]...

    如何获取低价域名:选购指南与注意事项

    在当今数字化时代,网上存在着大量的低价域名和注册选项。低价域名通常是指那些价格较为便宜的域名,相比传统的域名选择,它们为个人和企业提供了更加实惠的选择。注册这些域名的方式多种多样,市场上也有许多能够提供成本效益高的选择,适合各类需求的用户。 在这个竞争激烈的网上环境中,很多人希望能以较低的成本建立自...

    双ISP配置:提升网络可靠性与速度的最佳解决方案

    双ISP,顾名思义,就是同时连接两个互联网服务提供商。这种配置听起来可能有点复杂,但其实它是为了确保我们在享受网络服务时能够拥有更高的可靠性和更好的体验。想象一下,当你正在进行重要的在线会议或下载一个大文件,网络突然断了,这可真让人头疼。而双ISP就能帮助我们避免这样的困境。 双ISP的基本概念是,...

    深入了解DMIT不同线路,优化您的网络体验

    在开始深入了解DMIT这一知名VPS提供商之前,我想先分享一下我对于它的初步印象。DMIT的使命是为用户提供高性能、稳定的VPS解决方案,特别是在跨境访问方面表现不俗。他们采用的CN2优化线路更是让其在众多竞争对手中脱颖而出。通过不断的发展与创新,DMIT为不同需求的用户提供了多种线路选择。 DMI...

    如何获取免费VPS服务无需信用卡:一站式指南

    在互联网时代,虚拟专用服务器(VPS)成为了很多开发者和企业的优选。VPS基本上是一个分隔的服务器环境,用户可以在其中安装操作系统和运行应用程序。它既拥有独立服务器的功能,又比共享主机更具经济性。对很多人来说,了解VPS的运行机制和它的适用场景是非常重要的。 免费VPS服务越来越受到关注。在预算有限...