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/scpi.py | |
| parent | c3f07a7ffa320aecb3fca5dd40e7644424bddfb5 (diff) | |
Enhance protocol layers: implement I/O locking for thread safety in serial communication
Diffstat (limited to 'api_layers/protocols/scpi.py')
| -rw-r--r-- | api_layers/protocols/scpi.py | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/api_layers/protocols/scpi.py b/api_layers/protocols/scpi.py index 526ed21..fca5ba4 100644 --- a/api_layers/protocols/scpi.py +++ b/api_layers/protocols/scpi.py @@ -54,8 +54,9 @@ class SCPILayer(BaseProtocol): if not ch.query.strip(): continue try: - self._ser.write(f"{ch.query.strip()}\n".encode()) - resp = self._ser.readline().decode(errors="replace").strip() + with self._io_lock: + self._ser.write(f"{ch.query.strip()}\n".encode()) + resp = self._ser.readline().decode(errors="replace").strip() val = _parse_numeric(resp) if val is not None: result[ch.channel_id] = val * ch.scale @@ -77,7 +78,8 @@ class SCPILayer(BaseProtocol): return True try: cmd = ch.write_cmd.format(value=value) - self._ser.write(f"{cmd}\n".encode()) + with self._io_lock: + self._ser.write(f"{cmd}\n".encode()) return True except Exception: return False @@ -87,8 +89,9 @@ class SCPILayer(BaseProtocol): if not self._ser: return "(not connected)" try: - self._ser.write(b"*IDN?\n") - return self._ser.readline().decode(errors="replace").strip() + with self._io_lock: + self._ser.write(b"*IDN?\n") + return self._ser.readline().decode(errors="replace").strip() except Exception as e: return f"(error: {e})" |
