diff options
| author | Christian Kolset <ckolset@colostate.edu> | 2026-07-27 17:34:30 -0600 |
|---|---|---|
| committer | Christian Kolset <ckolset@colostate.edu> | 2026-07-27 17:34:30 -0600 |
| commit | ee4965f4d4d1fc5d40be24b99341620e32386d40 (patch) | |
| tree | 0dbafaa8aee899895b974ade9c9a2c7b66918701 /api_layers/protocols/modbus_rtu.py | |
| parent | c3f07a7ffa320aecb3fca5dd40e7644424bddfb5 (diff) | |
Enhance protocol layers: implement I/O locking for thread safety in serial communication
Diffstat (limited to 'api_layers/protocols/modbus_rtu.py')
| -rw-r--r-- | api_layers/protocols/modbus_rtu.py | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/api_layers/protocols/modbus_rtu.py b/api_layers/protocols/modbus_rtu.py index 68d644e..33f6877 100644 --- a/api_layers/protocols/modbus_rtu.py +++ b/api_layers/protocols/modbus_rtu.py @@ -91,10 +91,11 @@ class ModbusRTULayer(BaseProtocol): def _read_registers(self, fc: int, start: int, count: int) -> List[int]: req = _frame(struct.pack(">BBHH", self.slave_addr, fc, start, count)) - self._ser.write(req) - time.sleep(0.005) - n_bytes = 5 + 2 * count - resp = self._ser.read(n_bytes) + with self._io_lock: + self._ser.write(req) + time.sleep(0.005) + n_bytes = 5 + 2 * count + resp = self._ser.read(n_bytes) if len(resp) < n_bytes: raise IOError(f"Short response {len(resp)}/{n_bytes} bytes") crc_recv = struct.unpack("<H", resp[-2:])[0] @@ -142,9 +143,10 @@ class ModbusRTULayer(BaseProtocol): def _write_register(self, register: int, value: int) -> bool: req = _frame(struct.pack(">BBHH", self.slave_addr, 0x06, register, value & 0xFFFF)) - self._ser.write(req) - time.sleep(0.005) - resp = self._ser.read(8) + with self._io_lock: + self._ser.write(req) + time.sleep(0.005) + resp = self._ser.read(8) return len(resp) == 8 def write(self, channel_id: str, value) -> bool: |
