본문 바로가기

개발/Python

[파이썬] 시리얼통신 (pyserial)

우선 serial module을 import하여 사용하기 위해서 PySerial 모듈을 install 해준다.
파이챰의 Terminal에서  pip install pyserial 명령어를 통해 설치해주자.

install command : pip install pyserial

- openSerial

가변적인 port만 입력받게 하고 그 외의 값은 default 값을 주었다. 상황에 맞게 baudrate와 sytesize등을 변경해 주어 사용가능하다.

def openSerial(port, baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False):
    ser = serial.Serial()

    ser.port = port
    ser.baudrate = baudrate
    ser.bytesize = bytesize
    ser.parity = parity
    ser.stopbits = stopbits
    ser.timeout = timeout
    ser.xonxoff = xonxoff
    ser.rtscts = rtscts
    ser.dsrdtr = dsrdtr

    ser.open()
    return ser

 

- write

def writePort(ser, data):
    ser.write(data)

 

- write with encode

encode함수를 사용하여 encoding된 데이터를 write해 줄 수 있다.

def writePortUnicode(ser, data):
    writePort(ser, data.encode())

- read

size 1씩 읽어온다

def read(ser, size=1, timeout=None):
    ser.timeout = timeout
    readed = ser.read(size)
    return readed

- read until specific code

특정 코드가 날라올 때까지 read할 수 있다. 예제의 경우 byte \x03을 입력 받을 때까지 읽어오도록 되어 있다.

def readUntilExitCode(ser, exitcode=b'\x03'):
    readed = b''
    while True:
        data = ser.read()
        print(data)
        readed += data
        if exitcode in data:
            return readed[:1]

- readEOF

def readEOF(ser):
    readed = ser.readline()
    return readed[:-1]

 

- pyserial 예제

if __name__ == '__main__':
    ser = openSerial('com1')

    string = 'hello world\r\n'
    writePort(ser, string)
    writePort(ser, string.encode())
    writePortUnicode(ser, string)

    string = b'Hello World\r\n'
    writePort(ser, string)

    string = '한글 전송 테스트\r\n'
    writePortUnicode(ser, string)

    readed = read(ser)
    print(readed)
    print(read(ser, 10))
    print(read(ser, size=3, timeout=5))
    print(readEOF(ser))
    print(readUntilExitCode(ser))