# HG changeset patch # User Daniel O'Connor # Date 1313063289 -34200 # Node ID ef713fe03db894769245e27aca9ad79de9bbc40f # Parent 6e7619f2dffd2ee2d4968ea007f54b5109a27eef Add SCPI socket class. diff -r 6e7619f2dffd -r ef713fe03db8 scpisock.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scpisock.py Thu Aug 11 21:18:09 2011 +0930 @@ -0,0 +1,70 @@ +#!/usr/bin/env python + +# Copyright (c) 2011 +# Daniel O'Connor . All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# + +import select +import socket + +# See this for more info +# http://www.staff.uni-bayreuth.de/~btp918/cmt2007/geraete/agilent_34410A_dmm/manual/SCPI_Sockets.pdf +# +# ToDo: Implement the SRQ & DCL channel (I don't have any supported hardware) + +SCPI_PORT = 5025 + +class SCPISockDevice(object): + def __init__(self, host, port = SCPI_PORT): + self.sock = socket.create_connection((host, port)) + + def flush(self): + while True: + r, w, x = select.select([self.sock], [], [], 0) + if len(r) == 0: + break + self.sock.recv(1024) + + def write(self, data): + trail = '' + if data[-1] != '\n': + trail = '\n' + + self.sock.send(data + trail) + + def read(self, timeout = None): + res = '' + if timeout == None: + timeout = 0.1 + + while True: + r, w, x = select.select([self.sock], [], [], timeout) + if len(r) == 0: + break + res = res + self.sock.recv(1024) + if res[-1] == '\n': + break + + return res.rstrip('\n') +