From 63a5f089630307d174783f6981615e5593dbc3f3 Mon Sep 17 00:00:00 2001 From: Timo Niemann Date: Thu, 4 Jun 2026 11:40:09 +0200 Subject: [PATCH] added a response tester which spams 2048 indexed ping commands and measures the latency between send to receive --- response_tester.cs | 101 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 response_tester.cs diff --git a/response_tester.cs b/response_tester.cs new file mode 100644 index 0000000..ec1a150 --- /dev/null +++ b/response_tester.cs @@ -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 commands = Enumerable.Range(1, spamCounter).ToDictionary(i => $"{i}:ping\n", i => DateTime.MaxValue); + static private Dictionary responses = new Dictionary(); + + 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(); + 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"); + } + } +} \ No newline at end of file