Windows-Testwerkzeuge für virtuelle COM-Ports ergänzen

This commit is contained in:
Dieter Lang 2026-08-22 15:22:40 +02:00
parent 0eccd003f0
commit d890aba7b4
2 changed files with 245 additions and 4 deletions

239
cmd/com0com-test/main.go Normal file
View file

@ -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
}

View file

@ -5,13 +5,15 @@ echo ==========================================
echo rs2322tcp Windows Client Test echo rs2322tcp Windows Client Test
echo ========================================== echo ==========================================
echo. echo.
echo Starte technischen Client... echo Starte normalen rs2322tcp-Client...
echo COM100 wird vom Client verwendet. 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.
echo Zum Beenden: Ctrl+C echo Zum Beenden: Ctrl+C
echo. echo.
go run .\cmd\rs2322tcp-client-test
go run .\cmd\rs2322tcp-client
echo. echo.
echo Client beendet. echo Client beendet.