#!/usr/bin/env python #====================================================================== # Program that polls data from Tecsis pressure display mod. 1929.300. # Data is forwared to TCP server. # # The display has RS-485 interface. # We've used a RS-232 / 485 converter from www.danbit.no, # part no.: CNV232-485 # The converter is set to operate in half-duplex mode. # RTS from PC wil control RX/TX function of RS-485 side # of the converter. # # See documentation here: # http://www2.geo.uib.no/equipment/seismic/airpressure_sensor/ # # Dept. of Earth Science # University of Bergen, Norway # OM & JIS # 11. Oct. 2005 #====================================================================== SERIAL_DEVICE = "/dev/ttyS0" SERIAL_BAUDRATE = 9600 SENS_POLLINT = 0.2 DISPLAY_ADDRESS = 1 SENS_DESNUM = 2 SERVER = "your.server.name" SERVER_PORT = 8080 import time, thread, serial, struct, socket #----- This thread sends data polling requests at regular intervals def Query(): while True: ser.setRTS(1) ser.write("L%.2i:?*" % DISPLAY_ADDRESS) # Command to poll ordinary data ser.flush() ser.setRTS(0) # RTS control TX/RX on RS-232 / 485 Converter time.sleep(SENS_POLLINT) #----- Initialize serial port and socket ser = serial.Serial(SERIAL_DEVICE, SERIAL_BAUDRATE, bytesize=7, parity=serial.PARITY_EVEN, stopbits=1) sd = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sd.connect((SERVER, SERVER_PORT)) thread.start_new(Query,()) data = '' #----- Main loop --------------- while True: data = data + ser.read(1) if data[-1] == '*' or data[-1] == '\n': value = data.split(':', 1)[1].split('*',1)[0][:-1] if len(value) == 5: value = int(value, 16) if value > 0x7FFFF: value = 0 - (0xFFFFF - value) value = float(value) / (10 ** SENS_DESNUM) value = "%.2f bar" % value sd.send(value) print value data = ''