This commit is contained in:
xyy
2026-05-23 21:18:46 +08:00
parent a93b6c0897
commit 24f438b81a
3 changed files with 178 additions and 20 deletions

View File

@@ -1,6 +1,7 @@
using System;
using System.IO.Ports;
using System.Threading.Tasks;
using System.Linq;
namespace ASTM_D7896_Tester.Services
{
@@ -31,41 +32,64 @@ namespace ASTM_D7896_Tester.Services
public bool IsOpen => _serialPort?.IsOpen == true;
/// <summary>
/// 发送命令并等待响应同步读写但因在Task.Run中执行不阻塞UI
/// </summary>
private async Task<string> QueryAsync(string command)
{
if (!_serialPort.IsOpen) throw new InvalidOperationException("串口未打开");
// 使用 Task.Run 避免阻塞 UI 线程
var tcs = new TaskCompletionSource<string>();
Task.Run(() =>
return await Task.Run(() =>
{
try
lock (_serialPort)
{
// 清空缓冲区
_serialPort.DiscardInBuffer();
_serialPort.DiscardOutBuffer();
_serialPort.WriteLine(command);
string result = _serialPort.ReadLine();
tcs.SetResult(result);
}
catch (Exception ex)
{
tcs.SetException(ex);
System.Diagnostics.Debug.WriteLine($"[发送] {command}");
string response = _serialPort.ReadLine();
System.Diagnostics.Debug.WriteLine($"[接收] {response}");
return response.Trim();
}
});
return await tcs.Task;
}
public string TestCommunication()
{
if (!_serialPort.IsOpen) throw new InvalidOperationException("串口未打开");
_serialPort.DiscardInBuffer();
_serialPort.WriteLine("*IDN?");
return _serialPort.ReadLine().Trim();
}
private async Task SendCommandAsync(string command)
{
if (!_serialPort.IsOpen) throw new InvalidOperationException("串口未打开");
await Task.Run(() => _serialPort.WriteLine(command));
await Task.Run(() =>
{
lock (_serialPort)
{
_serialPort.WriteLine(command);
}
});
}
/// <summary>
/// 配置为高速直流电压测量(FAST 分辨率
/// 配置为高速直流电压测量(根据8255文档
/// </summary>
public async Task ConfigureHighSpeedDcvAsync()
{
// 配置直流电压,自动量程
await SendCommandAsync("CONFigure:VOLTage:DC AUTO");
// 设置精度为FAST高速模式
await SendCommandAsync("SENSe:VOLTage:DC:RESolution FAST");
await SendCommandAsync("TRIGger:SOURce BUS"); // 使用软件触发
// 使用软件触发
await SendCommandAsync("TRIGger:SOURce BUS");
// 关闭自动延迟
await SendCommandAsync("TRIGger:DELay:AUTO OFF");
await SendCommandAsync("TRIGger:DELay 0");
}
@@ -80,7 +104,7 @@ namespace ASTM_D7896_Tester.Services
}
/// <summary>
/// 发送触发信号*TRG
/// 发送软件触发信号
/// </summary>
public async Task TriggerAsync()
{
@@ -88,24 +112,31 @@ namespace ASTM_D7896_Tester.Services
}
/// <summary>
/// 获取批量采集结果(在 PrepareBatchAsync 和 TriggerAsync 之后调用)
/// 获取批量采集结果
/// </summary>
public async Task<double[]> FetchBatchAsync()
{
string response = await QueryAsync("FETCh?");
if (string.IsNullOrWhiteSpace(response))
throw new Exception("FETCh? 返回空响应");
// 文档示例返回值如 "+1.234500E-02,+2.345600E-02"
string[] parts = response.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
double[] values = new double[parts.Length];
for (int i = 0; i < parts.Length; i++)
{
if (!double.TryParse(parts[i], System.Globalization.NumberStyles.Float,
string valStr = parts[i].Trim();
if (!double.TryParse(valStr, System.Globalization.NumberStyles.Float,
System.Globalization.CultureInfo.InvariantCulture, out values[i]))
throw new Exception($"解析失败: {parts[i]}");
{
throw new Exception($"解析失败: {valStr},原始响应: {response}");
}
}
return values;
}
/// <summary>
/// 单次读取电压(用于实时监控)
/// 单次读取电压
/// </summary>
public async Task<double> ReadVoltageAsync()
{