Files
admin 4acec81657 Antwortleitung (RX) verdrahtet und Flusskontrolle aktiviert
- WANT_RESPONSE=True: Anzeige-Antworttelegramm als Handshake, Fehlercode
  wird ausgewertet (Rueckweg verifiziert: 02 80 81 80 30 03)
- transport: Empfangspuffer vor jedem Senden leeren, damit read_response
  nur die frische Antwort sieht (Stoerbytes zwischen Telegrammen)
- run_display: Anzeige-/Antwortfehler abfangen statt abzustuerzen
- resp_test.py: Pruefwerkzeug fuer den Rueckkanal
- PORT auf /dev/cu.usbserial-120
- .gitignore ergaenzt, __pycache__ aus der Versionierung entfernt

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-16 17:27:32 +02:00

84 lines
2.9 KiB
Python

#!/usr/bin/env python3
"""Antwortleitung testen: Telegramme MIT Antwort-Anforderung senden.
Sendet im 1-Sekunden-Takt ein festes Telegramm mit gesetztem Antwort-Bit
(FC = 0x81). Nach jedem Empfang muss die Anzeige auf Pin 3 ihr Antworttelegramm
senden (erwartet: 02 80 81 80 30 03). Bricht bei ausbleibender Antwort NICHT ab,
damit man am Oszi in Ruhe messen kann; liest eine evtl. eintreffende Antwort mit
und zeigt sie als Hex.
python3 resp_test.py # 60 s, 1 s Takt
python3 resp_test.py --seconds 120
"""
import argparse
import sys
import time
import config
import migra
from transport import SerialTransport
def main(argv=None):
p = argparse.ArgumentParser(description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
p.add_argument("--seconds", type=float, default=60.0)
p.add_argument("--interval", type=float, default=1.0)
p.add_argument("--port", default=config.PORT)
args = p.parse_args(argv)
du = migra.DataUnit().fill(config.BACKGROUND).charset(0, spaced=True)
du.cursor(0, 0); du.text("RESP TEST")
frame = migra.build_telegram(du, dest=config.DISPLAY_ADDR, src=config.HOST_ADDR,
checksum=False, response=True) # FC-Bit0 = 1
t = SerialTransport(port=args.port, baudrate=config.BAUDRATE, parity=config.PARITY,
bytesize=config.BYTESIZE, stopbits=config.STOPBITS, timeout=0.5)
print("Port :", args.port)
print("TX (%d B): %s" % (len(frame), " ".join("%02X" % b for b in frame)))
print("FC : 0x%02X (Bit0=1 -> Antwort anfordern)" % frame[3])
print("Erwartete Antwort auf Pin 3: 02 80 81 80 30 03")
print("Laufzeit %.0f s, Takt %.1f s. Abbruch mit Ctrl-C.\n" % (args.seconds, args.interval))
deadline = time.monotonic() + args.seconds
n = 0
got = 0
try:
while time.monotonic() < deadline:
n += 1
t._port.reset_input_buffer()
t.write(frame)
# kurz auf eine Antwort lauschen (blockiert das Oszi nicht)
end = time.monotonic() + 0.4
buf = bytearray()
while time.monotonic() < end:
c = t._port.read(1)
if c:
buf.extend(c)
if c[0] == migra.ETX:
break
elif buf:
break
if buf:
got += 1
print("#%02d RX: %s" % (n, " ".join("%02X" % b for b in buf)))
else:
print("#%02d RX: (nichts empfangen)" % n)
# bis zum naechsten Sekundentakt warten
rest = args.interval - 0.4
if rest > 0:
time.sleep(rest)
except KeyboardInterrupt:
print("\nabgebrochen")
finally:
t.close()
print("\n%d Telegramme gesendet, %d Antworten empfangen." % (n, got))
return 0
if __name__ == "__main__":
sys.exit(main())