diff --git a/src/libPS/SCPIPs.cpp b/src/libPS/SCPIPs.cpp
index 60660ac5f9a28c1781039de12a0a32b56836f6fd..78adb996e89994f7e3965abaee31d3d2eb5d2210 100644
--- a/src/libPS/SCPIPs.cpp
+++ b/src/libPS/SCPIPs.cpp
@@ -109,11 +109,13 @@ double SCPIPs::measureVoltage(unsigned channel)
 
 void SCPIPs::send(const std::string& cmd)
 {
+  m_com->lock();
   m_com->send(cmd);
   std::string opcreply=m_com->sendreceive("*OPC?");
   utils::rtrim(opcreply);
   if(opcreply!="1")
     throw std::runtime_error("SCPI command not completed");
+  m_com->unlock();
 }
 
 void SCPIPs::send(const std::string& cmd, unsigned channel)
@@ -124,10 +126,12 @@ void SCPIPs::send(const std::string& cmd, unsigned channel)
 	throw std::runtime_error("Invalid channel: "+std::to_string(channel));
     }
 
+  m_com->lock();
   if(m_maxChannels!=1)
     m_com->send("INST:NSEL "+std::to_string(channel));
 
   send(cmd);
+  m_com->unlock();
 }
 
 std::string SCPIPs::sendreceive(const std::string& cmd)
@@ -143,8 +147,11 @@ std::string SCPIPs::sendreceive(const std::string& cmd, unsigned channel)
 	throw std::runtime_error("Invalid channel: "+std::to_string(channel));
     }
 
+  m_com->lock();
   if(m_maxChannels!=1)
     m_com->send("INST:NSEL "+std::to_string(channel));
 
-  return sendreceive(cmd);
+  std::string ret=sendreceive(cmd);
+  m_com->unlock();
+  return ret;
 }