summaryrefslogtreecommitdiff
path: root/api_layers/protocols/scpi.py
diff options
context:
space:
mode:
authorChristian Kolset <ckolset@colostate.edu>2026-07-27 17:34:30 -0600
committerChristian Kolset <ckolset@colostate.edu>2026-07-27 17:34:30 -0600
commitee4965f4d4d1fc5d40be24b99341620e32386d40 (patch)
tree0dbafaa8aee899895b974ade9c9a2c7b66918701 /api_layers/protocols/scpi.py
parentc3f07a7ffa320aecb3fca5dd40e7644424bddfb5 (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.py13
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})"