#!/usr/bin/python # -*- coding: utf-8 -*- import serial import struct class pyXunDa4Ctl: """ 只用于4路继电器 版权所有:applepieqwer@gmail.com """ def __init__(self,serial_name,address=1): self._ser = serial.Serial(serial_name, 9600 , timeout=10) self._ser.open() if not self._ser.isOpen(): return None """ 55 01 01 02 02 02 02 5F 吸合所有继电器 55 01 01 02 00 00 00 59 吸合第1路继电器,其他继电器保持原来状态 55 01 01 00 02 00 00 59 吸合第2路继电器,其他继电器保持原来状态 55 01 01 00 00 02 00 59 吸合第3路继电器,其他继电器保持原来状态 55 01 01 00 00 00 02 59 吸合第4路继电器,其他继电器保持原来状态 55 01 01 01 01 01 01 5B 断开所有继电器 55 01 01 01 00 00 00 58 断开第1路继电器,其他继电器保持原来状态 55 01 01 00 01 00 00 58 断开第2路继电器,其他继电器保持原来状态 55 01 01 00 00 01 00 58 断开第3路继电器,其他继电器保持原来状态 55 01 01 00 00 00 01 58 断开第4路继电器,其他继电器保持原来状态 55 01 00 00 00 00 00 56 查询当前继电器板的状态 """ self._on_ctl = [struct.pack('8B',0x55,address,0x01,0x02,0x02,0x02,0x02,0x5F), struct.pack('8B',0x55,address,0x01,0x02,0x00,0x00,0x00,0x59), struct.pack('8B',0x55,address,0x01,0x00,0x02,0x00,0x00,0x59), struct.pack('8B',0x55,address,0x01,0x00,0x00,0x02,0x00,0x59), struct.pack('8B',0x55,address,0x01,0x00,0x00,0x00,0x02,0x59)] self._off_ctl = [struct.pack('8B',0x55,address,0x01,0x01,0x01,0x01,0x01,0x5B), struct.pack('8B',0x55,address,0x01,0x01,0x00,0x00,0x00,0x58), struct.pack('8B',0x55,address,0x01,0x00,0x01,0x00,0x00,0x58), struct.pack('8B',0x55,address,0x01,0x00,0x00,0x01,0x00,0x58), struct.pack('8B',0x55,address,0x01,0x00,0x00,0x00,0x01,0x58)] self._check_ctl = struct.pack('8B',0x55,address,0x00,0x00,0x00,0x00,0x00,0x56) def __del__(self): if self._ser.isOpen(): self._ser.close() def switchCount(self): return 4 def switchOn(self,i): if i < 1 or i > self.switchCount(): return None if not self._ser.isOpen(): return None self._ser.write(self._on_ctl[i]) return i def switchOnAll(self): if not self._ser.isOpen(): return None self._ser.write(self._on_ctl[0]) return 'ALL' def switchOff(self,i): if i < 1 or i > self.switchCount(): return None if not self._ser.isOpen(): return None self._ser.write(self._off_ctl[i]) return i def switchOffAll(self): if not self._ser.isOpen(): return None self._ser.write(self._off_ctl[0]) return 'ALL' def __status(self): if not self._ser.isOpen(): return [-1,-1,-1,-1,-1,-1,-1,-1] self._ser.write(self._check_ctl) r = self._ser.read(8) return struct.unpack('8B',r) def switchStatus(self,i): if i < 1 or i > self.switchCount(): return None r = self.__status()[2+i] if r == 1: return 'OFF' elif r == 2: return 'ON' else: return 'UNKNOWN' def switchStatusAll(self): t = self.__status() r = [] for i in t[3:(3+self.switchCount())]: if i == 1: r.append('OFF') elif i == 2: r.append('ON') else: r.append('UNKNOWN') return r if __name__ == '__main__': print 'pyXunDa4Ctl Test on /dev/ttyUSB0' xd = pyXunDa4Ctl('/dev/ttyUSB0') print xd.switchStatusAll()