added a response tester which spams 2048 indexed ping commands and measures the latency between send to receive
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
#:package System.IO.Ports@10.0.8
|
||||
#:property LangVersion=latest
|
||||
#:property Nullable=enable
|
||||
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.IO.Ports;
|
||||
|
||||
namespace ResponseTester
|
||||
{
|
||||
class Program
|
||||
{
|
||||
private static int spamCounter = 2048;
|
||||
|
||||
static private Dictionary<string, DateTime> commands = Enumerable.Range(1, spamCounter).ToDictionary(i => $"{i}:ping\n", i => DateTime.MaxValue);
|
||||
static private Dictionary<string, DateTime> responses = new Dictionary<string, DateTime>();
|
||||
|
||||
static private void SerialReader(SerialPort serialPort, CancellationToken ct)
|
||||
{
|
||||
var responseCounter = 0;
|
||||
var timeout = DateTime.Now.AddSeconds(10);
|
||||
while (!ct.IsCancellationRequested && responseCounter < spamCounter && DateTime.Now < timeout)
|
||||
{
|
||||
try
|
||||
{
|
||||
var response = serialPort.ReadLine();
|
||||
responses[response] = DateTime.Now;
|
||||
Console.WriteLine($"Received response: {response.Trim()}");
|
||||
responseCounter++;
|
||||
}
|
||||
catch (TimeoutException)
|
||||
{
|
||||
// Ignore timeout exceptions
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void Main(string[] args)
|
||||
{
|
||||
Console.WriteLine("Starting response tester...");
|
||||
|
||||
var portName = "COM30";
|
||||
var baudrate = 115200;
|
||||
|
||||
using var serialPort = new SerialPort(portName, baudrate, Parity.None, 8, StopBits.One);
|
||||
serialPort.ReadTimeout = 100;
|
||||
serialPort.DtrEnable = true; // ← neu
|
||||
serialPort.RtsEnable = true; // ← neu (manche Stacks brauchen es)
|
||||
serialPort.NewLine = "\n"; // ← neu, sonst erwartet ReadLine "\r\n"
|
||||
try
|
||||
{
|
||||
serialPort.Open();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Failed to open serial port: {ex.Message}");
|
||||
return;
|
||||
}
|
||||
|
||||
CancellationTokenSource cts = new();
|
||||
var task = Task.Run(() => SerialReader(serialPort, cts.Token), cts.Token);
|
||||
|
||||
var burst = 16;
|
||||
var counter = 0;
|
||||
foreach(var command in commands.Keys.ToList())
|
||||
{
|
||||
serialPort.Write(command);
|
||||
commands[command] = DateTime.Now;
|
||||
Console.WriteLine($"Sent command: {command.Trim()}");
|
||||
|
||||
counter++;
|
||||
if (counter % burst == 0) {
|
||||
Thread.Sleep(10);
|
||||
}
|
||||
}
|
||||
|
||||
task.Wait();
|
||||
cts.Dispose();
|
||||
|
||||
var latencies = new List<TimeSpan>();
|
||||
foreach(var command in commands)
|
||||
{
|
||||
var prefix = command.Key.Split(':')[0] + ":";
|
||||
var response = responses.Keys.FirstOrDefault(r => r.StartsWith(prefix));
|
||||
if (response != null)
|
||||
{
|
||||
var latency = responses[response] - command.Value;
|
||||
latencies.Add(latency);
|
||||
Console.WriteLine($"Command: {command.Key.Trim()} | Response: {response.Trim()} | Latency: {latency.TotalMilliseconds} ms");
|
||||
}
|
||||
else Console.WriteLine($"Command: {command.Key.Trim()} | Response: No response received");
|
||||
}
|
||||
|
||||
var averageLatency = latencies.Count > 0 ? TimeSpan.FromMilliseconds(latencies.Average(l => l.TotalMilliseconds)) : TimeSpan.Zero;
|
||||
Console.WriteLine($"Average Latency: {averageLatency.TotalMilliseconds} ms");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user