From efddfd60cb35e9ff095e659018ddf201f026d523 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Odd=20Str=C3=A5b=C3=B8?= <oddstr13@openshell.no>
Date: Wed, 26 Jan 2022 21:01:55 +0100
Subject: [PATCH] Handle CRC too short in readMemory

---
 solar_ble.py | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/solar_ble.py b/solar_ble.py
index 097bab1..a0518b1 100755
--- a/solar_ble.py
+++ b/solar_ble.py
@@ -305,7 +305,11 @@ def readMemory(fh: RawIOBase, address: int, words: int = 1) -> Optional[bytes]:
         data = fh.read(size)
         _crc = fh.read(2)
         if data and _crc:
-            crc = struct.unpack_from("<H", _crc)[0]
+            try:
+                crc = struct.unpack_from("<H", _crc)[0]
+            except struct.error:
+                log(f"readMemory: CRC error; read {len(_crc)} bytes (2 expected)")
+                return None
             calculated_crc = modbus(bytes([tag, operation, size, *data]))
             if crc == calculated_crc:
                 return data