본문 바로가기
프로그래밍/파이썬

파이썬 COM port에서 데이터 읽기 (공부중)

by 훨훨날아 2021. 6. 8.

아두이노를 통해서 센서데이터를 파이썬으로 불러오는 방법

파이썬 모듈중에서 serial을 사용하면 된다.

 

import serial

ser = serial.Serial() # 시리얼을 연결한다.
ser.port = 'COM6' # 아두이노가 연결된 포트
ser.baudrate = 9600 # baudrate를 지정해줄 수 있다.

# baudrate를 모른다면 연결된 serial을 불러와서 확인할 수 있다.
# print(ser)

ser.timeout = 1 #시리얼에 데이터를 불러올 때 지정하는 딜레이

# 시리얼을 열어준다.
ser.open()

# 데이터를 저장할 공간을 만들어주었다.
data3 = []

# 반복해서 데이터를 출력하기 위해 while 을 만들어주었다.
while True:

  data = ser.readline() # serial에 출력되는 데이터를 읽어준다.
  data2 = data.split(b'\\') # byte 형태로 출력되는 데이터를 \ 로 나눠서 입력받는다. (센서마다 다름)
  # data3 = int(data2, 16)  # convert hex to decimal (16진법으로 출력되는 데이터를 10진법으로 바꿔준다)(여긴 안되서 공부중)

  data3.append(data) # 출력된데이터를 data3에 저장한다.

  print(data3) #저장되는 데이터를 확인하고 data3의 크기가 10을 넘어가면 while을 끝낸다.
  if len(data3) > 10:
    break
    
 ser.close() # serial 사용이 끝나면 닫아줘야 나중에 오류가 생기지 않는다고 한다.

 

공부해야할 것

1. serial을 통해서 넘어오는 데이터가 1개씩 오는것이 아니라 여러데이터가 한번에 같이 입력된다. 이것을 하나하나 나누는 방법

2. 입력되는 데이터를 실시간으로 출력하기

 

 

오류들

1. ser.redline()이 무한 loop 에 빠져서 작동하지 않을때
- ser.timeout을 처음에는 10 으로 설정했었는데 ser.readline() 코드가 실행될때 무한루프에 빠져 작동하지 않았다. 그래서 timeout시간을 1로 줄여주니 작동했다. 아마, timeout되는 시간길어서 중간에 쌓이는 데이터가 많아져서 중간에 어떤 충돌이 있었던것이 아닐까 생각해본다. 

2. serial.serialutil.SerialException: could not open port 'COM6': PermissionErro
- 컴퓨터에서 연결된 COM 을 보면 연결이 되어있는데 파이썬에서 serial이 열수없다는 오류가 나왔다. 아두이노나 다른 프로그램에서 신호를 받고 있다면 두개의 프로그램이 하나에 동시에 접속할 수 없기 때문에 생기는 오류이다. 데이터를 수집하던 다른 프로그램을 종료하면 해결할 수 있다.

2. Python typeerror: a bytes-like object is required, not ‘str’ Solution
- ser.readline()을 사용하는 과정에서 출력되는 데이터에 여려개의 함수가 있어서 split()으로 데이터를 나누고자했다. 출력되는 데이터는 b'0x94 와같은 형식을 가지고 있어서 data.split()을 사용했더니 오류가 생겼다. 찾아보니 b' 는 byte 객체를 의미하는 것이며 문자열입력 받을때 사용했던 split이라는 함수를 똑같이 사용할 수 없었다. split()안쪽에 b'을 적어서 구분하는 기준이 byte 형식의 데이터라고 입력하니 오류가 해결되었다.

반응형