From d890aba7b4b179787060d34f584076b9224b53c3 Mon Sep 17 00:00:00 2001 From: Dieter Lang Date: Sat, 22 Aug 2026 15:22:40 +0200 Subject: [PATCH] =?UTF-8?q?Windows-Testwerkzeuge=20f=C3=BCr=20virtuelle=20?= =?UTF-8?q?COM-Ports=20erg=C3=A4nzen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/com0com-test/main.go | 239 ++++++++++++++++++++++++++++++++ scripts/test-windows-client.bat | 10 +- 2 files changed, 245 insertions(+), 4 deletions(-) create mode 100644 cmd/com0com-test/main.go diff --git a/cmd/com0com-test/main.go b/cmd/com0com-test/main.go new file mode 100644 index 0000000..c635396 --- /dev/null +++ b/cmd/com0com-test/main.go @@ -0,0 +1,239 @@ +//go:build windows + +/* + * ============================================================================ + * Projekt.....: rs2322tcp + * Datei.......: cmd/com0com-test/main.go + * Copyright (C) 2026 Dieter Lang + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + * Beschreibung: + * Direkter Test eines com0com-Portpaares. + * + * Der Test öffnet COM100 und COM10 gleichzeitig und überprüft die + * Datenübertragung in beide Richtungen: + * + * COM100 -> COM10 + * COM10 -> COM100 + * + * Dadurch kann die Funktion von com0com und go.bug.st/serial unabhängig + * vom rs2322tcp-Client, TCP-Server und PTY-Testaufbau geprüft werden. + * ============================================================================ + */ + +package main + +import ( + "fmt" + "log" + "time" + + "go.bug.st/serial" +) + +func main() { + fmt.Println("rs2322tcp com0com Direkt-Test") + fmt.Println() + + mode := &serial.Mode{ + BaudRate: 600, + DataBits: 8, + Parity: serial.NoParity, + StopBits: serial.OneStopBit, + } + + com10, err := serial.Open("COM10", mode) + if err != nil { + log.Fatalf("COM10 öffnen: %v", err) + } + defer com10.Close() + + fmt.Println("COM10 geöffnet.") + + com100, err := serial.Open("COM100", mode) + if err != nil { + log.Fatalf("COM100 öffnen: %v", err) + } + defer com100.Close() + + fmt.Println("COM100 geöffnet.") + fmt.Println() + + // ------------------------------------------------------------------------ + // Test 1: COM100 -> COM10 + // ------------------------------------------------------------------------ + + request := []byte{ + 0x57, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x1F, + 0x20, + } + + fmt.Printf( + "COM100 TX: %d Bytes\n", + len(request), + ) + printHex(request) + + n, err := com100.Write(request) + if err != nil { + log.Fatalf("COM100 schreiben: %v", err) + } + + if n != len(request) { + log.Fatalf( + "COM100 schreiben: %d von %d Bytes geschrieben", + n, + len(request), + ) + } + + fmt.Println("COM100 schreiben erfolgreich.") + + received := make([]byte, len(request)) + + if err := com10.SetReadTimeout(2 * time.Second); err != nil { + log.Fatalf("COM10 ReadTimeout setzen: %v", err) + } + + n, err = com10.Read(received) + if err != nil { + log.Fatalf("COM10 lesen: %v", err) + } + + fmt.Printf( + "COM10 RX: %d Bytes\n", + n, + ) + printHex(received[:n]) + + if n != len(request) { + log.Fatalf( + "COM10: %d Bytes empfangen, erwartet %d", + n, + len(request), + ) + } + + if !equalBytes(request, received[:n]) { + log.Fatal("COM10: empfangene Daten stimmen nicht mit den gesendeten Daten überein") + } + + fmt.Println("Test COM100 -> COM10 erfolgreich.") + fmt.Println() + + // ------------------------------------------------------------------------ + // Test 2: COM10 -> COM100 + // ------------------------------------------------------------------------ + + response := []byte{ + 0x57, + 0x07, + 0x01, + 0x06, + 0x00, + 0x01, + 0x03, + 0x06, + 0x02, + 0x00, + 0x01, + 0x20, + } + + fmt.Printf( + "COM10 TX: %d Bytes\n", + len(response), + ) + printHex(response) + + n, err = com10.Write(response) + if err != nil { + log.Fatalf("COM10 schreiben: %v", err) + } + + if n != len(response) { + log.Fatalf( + "COM10 schreiben: %d von %d Bytes geschrieben", + n, + len(response), + ) + } + + fmt.Println("COM10 schreiben erfolgreich.") + + received = make([]byte, len(response)) + + if err := com100.SetReadTimeout(2 * time.Second); err != nil { + log.Fatalf("COM100 ReadTimeout setzen: %v", err) + } + + n, err = com100.Read(received) + if err != nil { + log.Fatalf("COM100 lesen: %v", err) + } + + fmt.Printf( + "COM100 RX: %d Bytes\n", + n, + ) + printHex(received[:n]) + + if n != len(response) { + log.Fatalf( + "COM100: %d Bytes empfangen, erwartet %d", + n, + len(response), + ) + } + + if !equalBytes(response, received[:n]) { + log.Fatal("COM100: empfangene Daten stimmen nicht mit den gesendeten Daten überein") + } + + fmt.Println("Test COM10 -> COM100 erfolgreich.") + fmt.Println() + + fmt.Println("==========================================") + fmt.Println("Alle com0com-Direkt-Tests erfolgreich.") + fmt.Println("==========================================") +} + +// printHex gibt einen Byte-Block hexadezimal aus. +func printHex(data []byte) { + for i, b := range data { + if i > 0 { + fmt.Print(" ") + } + + fmt.Printf("%02X", b) + } + + fmt.Println() +} + +// equalBytes compares two byte slices. +func equalBytes(a, b []byte) bool { + if len(a) != len(b) { + return false + } + + for i := range a { + if a[i] != b[i] { + return false + } + } + + return true +} diff --git a/scripts/test-windows-client.bat b/scripts/test-windows-client.bat index 4e76b80..e5fbb0e 100644 --- a/scripts/test-windows-client.bat +++ b/scripts/test-windows-client.bat @@ -5,14 +5,16 @@ echo ========================================== echo rs2322tcp Windows Client Test echo ========================================== echo. -echo Starte technischen Client... +echo Starte normalen rs2322tcp-Client... echo COM100 wird vom Client verwendet. -echo COM10 wird fuer die Testsequenz verwendet. +echo Die konfigurierte Startsequenz wird nach +echo erfolgreichem Verbindungsaufbau automatisch gesendet. echo. echo Zum Beenden: Ctrl+C echo. -go run .\cmd\rs2322tcp-client-test + +go run .\cmd\rs2322tcp-client echo. echo Client beendet. -pause +pause \ No newline at end of file