2 个版本
0.1.1 | 2023 年 9 月 8 日 |
---|---|
0.1.0 | 2023 年 4 月 25 日 |
#404 在 并发
55KB
1K SLoC
虚拟仪器软件架构 (VISA)
这是一个围绕多个供应商的原生 Visa 实现的包装器。此包装器允许在需要时并发使用不同的 Visa 实现,或在运行时动态切换它们。此库尽可能地接近原生实现,因此用户需要使用 CTypes,例如 CString、[u8;x] 数组、c_char、c_uchar、c_schar、c_void 等。此库可以直接使用,或者如果您更喜欢安全的简化抽象,则可以使用将在 2023 年晚些时候发布的 instrument_communication 库。
如何使用
要使用此库,您可以动态加载 Visa 链接库 (.dll 或 .so 等)。Keysight 选项针对使用官方 Keysight 安装程序在目标平台上默认安装的二进制名称。同样,NiVisa 是针对 National Instrument Visa 的。"Primary" 选项针对当前作为默认 Visa 实现的任何实现。在 Windows 64 位上,Primary 是 C:\Windows\System32\visa32.dll。以下方法依次尝试加载每个库,并在首次成功或最后失败时返回。
let visa = visa::create(&visa::Binary::Keysight)
.or_else(|_| visa::create(&visa::Binary::NiVisa))
.or_else(|_| visa::create(&visa::Binary::Primary))
.or_else(|_| visa::create(&visa::Binary::Custom("visa.so".into())));
然后您需要打开默认会话
let mut _session = 0;
let status = visa.viOpenDefaultRM(&mut _session);
打开后,您可以使用其地址尝试连接到仪器
let address = CString::new(format!("TCPIP0::{IPADDRESS}::{PORT}::SOCKET"))?;
let mut vi = 0;
let status = visa.viOpen(_session, address.as_ptr(), 0, 0, &mut vi);
注意,成功连接将返回状态 0。然后您可以设置超时和终止字符
visa.viSetAttribute(vi, visa::VI_ATTR_TMO_VALUE, 5000); // Set timeout
visa.viSetAttribute(vi, visa::VI_ATTR_TERMCHAR, 10); // set termination byte to 10
visa.viSetAttribute(vi, visa::VI_ATTR_TERMCHAR_EN, 1); // enabled termination byte to stop reading when encountering this character.
将命令字符串定义为字节数组。
let cmd = b"*IDN?\n";
初始化返回字符计数
let mut ret_cnt = 0u32;
将命令写入仪器
let status=visa.viWrite(vi,cmd.as_ptr(),u32::try_from(cmd.len())?,&mut ret_cnt);
如果成功,状态将为 0。
定义读取缓冲区大小(本例中为 50 字节)
let resp = vec![0u8; 50];
然后读取返回的消息
let status = visa.viRead(vi, resp.as_ptr() as *mut _, 50, &mut ret_cnt);
将字节转换为可读文本。
let response = std::str::from_utf8(&resp[0..ret_cnt as usize])?;
打印它
println!("Response : {}", response);
依赖关系
~2MB
~49K SLoC