查询返回数据转double

This commit is contained in:
2026-08-19 20:04:10 +08:00
parent fb6e5b3cb1
commit 38f594e4aa
12 changed files with 283 additions and 248 deletions
+34 -8
View File
@@ -4,6 +4,7 @@ using Model.Models;
using System;
using System.Globalization;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
@@ -22,6 +23,29 @@ namespace DeviceCommand.Devices
{
}
/// <summary>
/// 从示波器返回的 SCPI 响应字符串中提取数值部分并转换为 double。
/// 响应格式示例: "C1:PAVA PKPK,2.48E-03V" → 按逗号分割后提取 2.48E-03
/// </summary>
/// <param name="raw">示波器返回的原始字符串</param>
/// <returns>提取到的数值,解析失败时返回 0</returns>
private static double ExtractDouble(string raw)
{
if (string.IsNullOrWhiteSpace(raw)) return 0;
string dataPart = raw;
// 按逗号分割,取最后一段(数值通常在逗号后面)
int commaIdx = raw.LastIndexOf(',');
if (commaIdx >= 0 && commaIdx < raw.Length - 1)
dataPart = raw.Substring(commaIdx + 1);
// 从数据段中提取数值(含正负号、小数点、科学计数法)
var match = Regex.Match(dataPart, @"[+-]?(?:\d+\.?\d*|\.\d+)(?:[Ee][+-]?\d+)?");
return match.Success && double.TryParse(match.Value, NumberStyles.Float, CultureInfo.InvariantCulture, out double val)
? val
: 0;
}
#region 1. IEEE 488.2
/// <summary>
@@ -175,9 +199,10 @@ namespace DeviceCommand.Devices
/// <param name="channel">通道号 (1 - 4)</param>
/// <param name="ct">取消令牌</param>
/// <returns>当前电压档位值 (Volts/Div)</returns>
public virtual async Task<string> (int channel, CancellationToken ct = default)
public virtual async Task<double> (int channel, CancellationToken ct = default)
{
return await WriteReadAsync($"C{channel}:VDIV?{ScpiDelimiter}", ScpiDelimiter, ct);
string res = await WriteReadAsync($"C{channel}:VDIV?{ScpiDelimiter}", ScpiDelimiter, ct);
return ExtractDouble(res);
}
/// <summary>
@@ -278,11 +303,12 @@ namespace DeviceCommand.Devices
/// <param name="channel">通道号 (1 - 4)</param>
/// <param name="paramName">测量参数名称 (如 "PKPK", "FREQ", "RMS" 等)</param>
/// <param name="ct">取消令牌</param>
/// <returns>测量参数的实时数值字符串</returns>
public virtual async Task<string> (int channel, string paramName, CancellationToken ct = default)
/// <returns>测量参数的实时数值 (double)</returns>
public virtual async Task<double> (int channel, string paramName, CancellationToken ct = default)
{
string query = string.Format(CultureInfo.InvariantCulture, "C{0}:PAVA? {1}{2}", channel, paramName.ToUpper(), ScpiDelimiter);
return await WriteReadAsync(query, ScpiDelimiter, ct);
string res = await WriteReadAsync(query, ScpiDelimiter, ct);
return ExtractDouble(res);
}
/// <summary>
@@ -291,7 +317,7 @@ namespace DeviceCommand.Devices
/// <param name="channel">通道号 (1 - 4)</param>
/// <param name="ct">取消令牌</param>
/// <returns>电压峰峰值 (Vpp)</returns>
public virtual async Task<string> (int channel, CancellationToken ct = default)
public virtual async Task<double> (int channel, CancellationToken ct = default)
{
return await (channel, "PKPK", ct);
}
@@ -302,7 +328,7 @@ namespace DeviceCommand.Devices
/// <param name="channel">通道号 (1 - 4)</param>
/// <param name="ct">取消令牌</param>
/// <returns>频率值 (单位: Hz)</returns>
public virtual async Task<string> (int channel, CancellationToken ct = default)
public virtual async Task<double> (int channel, CancellationToken ct = default)
{
return await (channel, "FREQ", ct);
}
@@ -313,7 +339,7 @@ namespace DeviceCommand.Devices
/// <param name="channel">通道号 (1 - 4)</param>
/// <param name="ct">取消令牌</param>
/// <returns>真均方根电压值 (Vrms)</returns>
public virtual async Task<string> (int channel, CancellationToken ct = default)
public virtual async Task<double> (int channel, CancellationToken ct = default)
{
return await (channel, "RMS", ct);
}