serialtest.py
0.00MB

 

파이썬으로 구현해본 시리얼통신이다. 드론을 제어하는 프로그램이나, opencv 응용하여 다른 프로그램을 만들어볼 생각으로 코드를 만들었다.

 

포트 연결이 끊긴 것을 알 수 있고 다시 연결하면 자동으로 연결하는 기능도 만들었다. 실제 다른 프로그램에서도 이런 식으로 만드는지는 모르겠지만 작동은 했다.

 

스레드를 사용하여 데이터를 처리하려고 테스트용으로 100ms마다 데이터를 받아야 하는 상황을 실험했지만 데이터가 밀려 받은 데이터를 즉시 출력할 수 없어 사용하지 않았다.

 

실시간 데이터를 그래프로 출력하는 것을 테스트했다.

 

 

 

serialtest.py - (0)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def serial_ports():
    """ Lists serial port names
 
        :raises EnvironmentError:
        On unsupported or unknown platforms
        :returns:
        A list of the serial ports available on the system
    """
    if sys.platform.startswith('win'):
        ports = ['COM%s' % (i + 1for i in range(256)]
    elif sys.platform.startswith('linux'or sys.platform.startswith('cygwin'):
        
        ports = glob.glob('/dev/tty[A-Za-z]*')
    elif sys.platform.startswith('darwin'):
        ports = glob.glob('/dev/tty.*')
    else:
        raise EnvironmentError('Unsupported platform')
     result = []
    for port in ports:
        try:
            s = serial.Serial(port)
            s.close()
            result.append(port)
        except (OSError, serial.SerialException):
            pass
    return result
 

 

현재 작동하는 COM Port를 확인할 수 있다. 구글링 해서 찾은 코드이다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class serialdata:
    def __init__(self, port, baudrate):
        self.port=port
        self.baudrate=baudrate
        self.counter=0
        self.connection=False
        self.exitThread=False
 
 
        while True:
            try:
                self.ser=serial.Serial(self.port,baudrate=self.baudrate)
 
            except serial.SerialException:
                continue
            else:
                print("connect",self.ser)
                self.connection=True
                break
 
    def serial_run(self):
        while True:
            if self.connection:
                
                try:
                    res=self.ser.readline()
                    data=res.decode('utf-8')
 
                    if data=='\r' or data=='\n':
                        continue
                    else:
                        self.counter+=1
                        self.datalist=data.split('\t')
                        for val in self.datalist:
                            print(float(val))
 
 
                except ValueError:
                    print("valueError")
                except serial.SerialException:
                    print("disconnect")
                    self.ser.close()
                    self.connection=False
                except UnicodeDecodeError:
                    print("UnicodeDecodeError")
                    
 
            else:
                while True:
                    try:
                        self.ser=serial.Serial(self.port,baudrate=self.baudrate)
 
                    except serial.SerialException:
                        continue
                    else:
                        print("connect",self.ser)
                        self.connection=True
                        break
    
 

 

serialdata 클래스의 모습이다. plot_data 메소드는 그래프를 출력하기 위해 코드를 조금만 변경했으므로 serial_run 메소드만 알면 이해하기 쉽다.

 

10~19번째 줄은 처음 serialdata객체를 초기화할때 원하는 COM Port가 연결돼있지 않다면 연결될 때까지 while문이 작동한다.

 

serial_run 메소드는 실제 데이터를 받는 부분이다. 이때 try 문에서 예외처리를 하는데 여기서 연결이 끊겼는지 확인한다.

 

29번째 줄은 self.ser.readline() 때문에 설정했다. 테스트에 사용한 값들의 마지막 값은 \n\n\r의 형태인데 readline()의 경우 마지막 \n \n \r[data] 의 형태로 읽게 되는데 필요 없는 값이 들어가 한번 넘어가기 위해 넣어준 코드이다.

 

48번째 줄의 코드는 포트가 다시 연결됐을때 자동적으로 연결하게 해주는 코드이다.

 

대부분의 코드가 테스트용으로 사용한 값들에 맞춰있어 조금 바꿔야 한다.

 

 

 

 

결과 - (1)

 

 

plot_data() 코드를 실행해서 실시간으로 데이터를 읽어 그래프로 표시했다. icm20958 가속도계와 ms5611 기압 센서를 사용하여 기압을 측정한 값이다.

 

실제 그래프를 볼 수 있어 SmarTTY 보다 보기 쉬웠고 연결이 끊겨도 자동으로 연결이 되는 점이 매우 편했다.

 

물론 파이썬 코드나 기압 센서 코드는 아직 개선해야 될 점이 많다.

 

 

 

 

-

드론과 조종기가 문제가 많다. 특히 건전지에서 열이 나면서 부풀어 오르기도 해서 조종기가 고장 난 게 아닌가 싶다.

 

고도 값을 읽어오는 코드도 정리해서 드론에 적용하고 싶은데 할 거는 많고 문제도 많고 머리가 복잡하다...

Posted by DDTXRX
,