From 2ece92bd0706e89240eba24ade99c8630586564e Mon Sep 17 00:00:00 2001 From: Abed Tshilombo Date: Sat, 21 Mar 2026 23:57:57 +0100 Subject: [PATCH] Fix UnicodeDecodeError in serial_comms by adding safe fallback decoding (utf-8 -> latin-1) --- gsmmodem/serial_comms.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/gsmmodem/serial_comms.py b/gsmmodem/serial_comms.py index 22e722c..14d2c7e 100644 --- a/gsmmodem/serial_comms.py +++ b/gsmmodem/serial_comms.py @@ -18,7 +18,7 @@ class SerialComms(object): # End-of-line read terminator RX_EOL_SEQ = b'\r\n' # End-of-response terminator - RESPONSE_TERM = re.compile('^OK|ERROR|(\+CM[ES] ERROR: \d+)|(COMMAND NOT SUPPORT)$') + RESPONSE_TERM = re.compile(r'^OK|ERROR|(\+CM[ES] ERROR: \d+)|(COMMAND NOT SUPPORT)$') # Default timeout for serial port reads (in seconds) timeout = 1 @@ -84,6 +84,15 @@ def _handleLineRead(self, line, checkForResponseTerm=True): def _placeholderCallback(self, *args, **kwargs): """ Placeholder callback function (does nothing) """ + def safe_decode(data): + try: + return data.decode('utf-8') + except UnicodeDecodeError: + try: + return data.decode('latin-1') + except Exception: + return data.decode('utf-8', errors='ignore') + def _readLoop(self): """ Read thread main loop @@ -100,7 +109,7 @@ def _readLoop(self): rxBuffer.append(ord(data)) if rxBuffer[-readTermLen:] == readTermSeq: # A line (or other logical segment) has been read - line = rxBuffer[:-readTermLen].decode() + line = self.safe_decode(rxBuffer[:-readTermLen]) rxBuffer = bytearray() if len(line) > 0: #print 'calling handler'