# -*- coding: UTF-8 -*-
import serial
import time
import binascii

'''
描述:串口同步基类
'''
class baseSerial():
    # 构造函数
    def __init__(self):
        self.exception = None
        self.ser = serial.Serial()

    # 析构函数(停用);
    # def __del__(self):
    #     self.close()

    def open(self, port, baudrate = 115200, bytesize = 8, parity = serial.PARITY_NONE, stopbits = 1, timeout = 2, writeTimeout = 0.5):
        if type(port) == type(0):
            self.ser.port = "COM"+str(port)
        else:
            self.ser.port = port
        # 波特率;
        self.ser.baudrate = baudrate
        # 数据位;
        self.ser.bytesize = bytesize
        # 校验码;
        self.ser.parity = parity # PARITY_NONE=0
        # 停止位;
        self.ser.stopbits = stopbits
        # 串口等待超时值(Read)
        self.ser.timeout = timeout  # 读超时;
        # 串口写超时值(Read)
        self.ser.writeTimeout = writeTimeout  # 写超时;
        try:
            self.ser.open()
            # 返回结果;
            return self.ser.is_open
        except Exception,e:
            self.exception = e
            print '打开串口异常',str(e)
            return False
    
    # 重新打开;
    def reOpen(self):
        self.exception = None
        self.ser.close()
        try:
            self.ser.open()
            # 返回结果;
            return self.ser.is_open
        except Exception,e:
            self.exception = e
            return False
    
    def close(self):
        self.ser.close()

    '''
    描述:写串口
    '''
    def write(self, cmd):
        try:
            self.exception = None
            writelen = self.ser.write(cmd)
            # flush等待写入完成;
            self.ser.flush()
            print "writehex:" + binascii.hexlify(cmd) + " writelen=" + str(writelen)
            return True if writelen == len(cmd) else False
        except Exception,e:
            self.exception = e
            print '写串口异常',str(e)
            return False

    '''
    描述:读取串口数据;
    返回:返回16进制字符串;
    补充:ser.in_waiting 实际是缓冲区里的数据长度,也就是要读的长度;
    '''
    def read(self):
        try:
            self.exception = None
            if self.ser.in_waiting == 0:
                time.sleep(self.ser.timeout)
            bys = self.ser.read(self.ser.in_waiting)
            print "readhex:" + binascii.hexlify(bys) + " readlen=" + str(bys.__len__())
            return bys
        except Exception,e:
            self.exception = e
            print '读串口异常',str(e)
            return None    

if __name__ == "__main__":
    pass