Windows-Testwerkzeuge für virtuelle COM-Ports ergänzen
This commit is contained in:
parent
0eccd003f0
commit
d890aba7b4
2 changed files with 245 additions and 4 deletions
239
cmd/com0com-test/main.go
Normal file
239
cmd/com0com-test/main.go
Normal 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
|
||||||
|
}
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue