diff --git a/examples/ping_pong.py b/examples/ping_pong.py index 18fde7f0..4f2b29f8 100755 --- a/examples/ping_pong.py +++ b/examples/ping_pong.py @@ -11,6 +11,7 @@ Usage: # /// import argparse +import serial import sys import time @@ -22,27 +23,24 @@ parser.add_argument("--role", choices=["tx", "rx"], required=True) parser.add_argument("port", nargs="?", help="Serial port (auto-detect if omitted)") args = parser.parse_args() -ser = dl.connect(args.port) -print(dl.send(ser, "SetConfig", config=dl.DEFAULT_CONFIG)) +try: + ser = dl.connect(args.port) + print(dl.send(ser, "SetConfig", config=dl.DEFAULT_CONFIG)) -if args.role == "tx": - print("Transmitting every 2 seconds (Ctrl+C to stop)...\n") - seq = 0 - try: + if args.role == "tx": + print("Transmitting every 2 seconds (Ctrl+C to stop)...\n") + seq = 0 while True: msg = f"ping #{seq}" resp = dl.send(ser, "Transmit", payload=msg.encode()) print(f" TX: {msg!r} → {resp['type']}") seq += 1 time.sleep(2) - except KeyboardInterrupt: - print("\nDone.") -else: - print(dl.send(ser, "StartRx")) - print("Receiving (Ctrl+C to stop)...\n") - ser.timeout = 1 - try: + else: + print(dl.send(ser, "StartRx")) + print("Receiving (Ctrl+C to stop)...\n") + ser.timeout = 1 while True: data = dl.read_frame(ser) if data is None: @@ -52,6 +50,13 @@ else: p = resp["payload"] text = p.decode("utf-8", errors="replace") print(f" RX: {text!r} RSSI:{resp['rssi']}dBm SNR:{resp['snr']}dB") - except KeyboardInterrupt: + +except KeyboardInterrupt: + try: dl.send(ser, "StopRx") - print("\nDone.") + except Exception: + pass + print("\nDone.") +except serial.SerialException as e: + print(f"\nSerial error: {e}", file=sys.stderr) + sys.exit(1) diff --git a/examples/simple_rx.py b/examples/simple_rx.py index 91c50d92..4749c5a3 100755 --- a/examples/simple_rx.py +++ b/examples/simple_rx.py @@ -9,18 +9,20 @@ Usage: # dependencies = ["cobs", "pyserial"] # /// +import serial import sys + sys.path.insert(0, __import__("pathlib").Path(__file__).parent.as_posix()) import donglora as dl # noqa: E402 -ser = dl.connect(sys.argv[1] if len(sys.argv) > 1 else None) -print(dl.send(ser, "SetConfig", config=dl.DEFAULT_CONFIG)) -print(dl.send(ser, "StartRx")) - -print("\nListening (Ctrl+C to stop)...\n") -ser.timeout = 1 - try: + ser = dl.connect(sys.argv[1] if len(sys.argv) > 1 else None) + print(dl.send(ser, "SetConfig", config=dl.DEFAULT_CONFIG)) + print(dl.send(ser, "StartRx")) + + print("\nListening (Ctrl+C to stop)...\n") + ser.timeout = 1 + while True: data = dl.read_frame(ser) if data is None: @@ -30,5 +32,11 @@ try: p = resp["payload"] print(f" RSSI:{resp['rssi']:4d}dBm SNR:{resp['snr']:3d}dB len:{len(p):3d} {p.hex()}") except KeyboardInterrupt: - dl.send(ser, "StopRx") + try: + dl.send(ser, "StopRx") + except Exception: + pass print("\nDone.") +except serial.SerialException as e: + print(f"\nSerial error: {e}", file=sys.stderr) + sys.exit(1) diff --git a/examples/simple_tx.py b/examples/simple_tx.py index 9d2cbb24..abe56e77 100755 --- a/examples/simple_tx.py +++ b/examples/simple_tx.py @@ -9,7 +9,9 @@ Usage: # dependencies = ["cobs", "pyserial"] # /// +import serial import sys + sys.path.insert(0, __import__("pathlib").Path(__file__).parent.as_posix()) import donglora as dl # noqa: E402 @@ -24,7 +26,11 @@ elif args: if len(args) > 1: message = " ".join(args[1:]) -ser = dl.connect(port) -print(dl.send(ser, "SetConfig", config=dl.DEFAULT_CONFIG)) -print(dl.send(ser, "Transmit", payload=message.encode())) -print(f"Sent: {message!r}") +try: + ser = dl.connect(port) + print(dl.send(ser, "SetConfig", config=dl.DEFAULT_CONFIG)) + print(dl.send(ser, "Transmit", payload=message.encode())) + print(f"Sent: {message!r}") +except serial.SerialException as e: + print(f"\nSerial error: {e}", file=sys.stderr) + sys.exit(1)