239 lines
4.3 KiB
Go
239 lines
4.3 KiB
Go
//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
|
|
}
|