-
Notifications
You must be signed in to change notification settings - Fork 0
/
force_test.py
140 lines (107 loc) · 4.31 KB
/
force_test.py
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
'''
### 시리얼값 들어오는지 체크용
import serial
import time
serial_port = 'COM7' # 예: Windows에서의 COM 포트 번호
baud_rate = 9600 # 아두이노와 일치하는 통신 속도
try:
ser = serial.Serial(serial_port, baud_rate, timeout=1) # timeout을 추가했습니다.
print("시리얼 포트가 성공적으로 열렸습니다.")
print("포트 설정:", ser)
# 데이터 읽기 시도
while True:
if ser.in_waiting > 0: # 입력 대기중인 데이터가 있는지 확인
line = ser.readline().decode('utf-8').rstrip() # 한 줄을 읽고 디코딩, 공백 제거
print(line) # 읽은 데이터 출력
except serial.SerialException:
print(f"{serial_port} 포트를 열 수 없습니다. 포트 번호를 확인해 주세요.")
except KeyboardInterrupt:
print("프로그램을 종료합니다.")
finally:
ser.close()
print("시리얼 포트가 닫혔습니다.")
'''
import serial
import threading
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation
# 시리얼 포트 설정 및 연결
serial_port = 'COM7' # 보고 세팅
baud_rate = 9600
ser = serial.Serial(serial_port, baud_rate, timeout=1)
# 전역 변수 선언 및 초기화
left_f_data = [0]
left_b_data = [0]
right_f_data = [0]
right_b_data = [0]
is_reading = True
def read_serial_data(ser):
global left_f_data, left_b_data, right_f_data, right_b_data, is_reading
while is_reading:
if ser.in_waiting > 0:
line = ser.readline().decode('utf-8').rstrip()
try:
left_f, left_b, right_f, right_b = map(float, line.split(','))
left_f_data.append(left_f)
left_b_data.append(left_b)
right_f_data.append(right_f)
right_b_data.append(right_b)
print(f"Left F: {left_f}, Left B: {left_b}, Right F: {right_f}, Right B: {right_b}")
# 각 데이터 리스트의 크기를 50으로 유지
for data_list in [left_f_data, left_b_data, right_f_data, right_b_data]:
if len(data_list) > 50:
data_list.pop(0)
except ValueError:
pass # 변환 실패 시 무시
def update_graph(frame):
# 데이터가 존재하는 경우에만 업데이트
if len(left_f_data) > 0:
# x 데이터의 길이를 현재 y 데이터의 길이와 동일하게 조정
x_len = len(left_f_data) # 모든 데이터 리스트는 동일한 길이를 가짐을 가정
x_data = np.arange(x_len)
# x_data 설정을 업데이트 해야 함
lines[0].set_data(x_data, left_f_data)
lines[1].set_data(x_data, left_b_data)
lines[2].set_data(x_data, right_f_data)
lines[3].set_data(x_data, right_b_data)
# x 축의 범위를 적절히 조정
ax.set_xlim(0, max(50, x_len - 1))
return lines
if __name__ == "__main__":
# 그래프 초기 설정
fig, ax = plt.subplots()
x_data = np.arange(50)
lines = [ax.plot(x_data, np.zeros(50), label=label)[0] for label in ['Left F', 'Left B', 'Right F', 'Right B']]
ax.set_xlim(0, 50)
ax.set_ylim(0, 1023)
ax.legend()
# 시리얼 데이터 읽기를 위한 스레드 시작
thread = threading.Thread(target=read_serial_data, args=(ser,))
thread.start()
# 애니메이션 시작
ani = FuncAnimation(fig, update_graph, blit=False, interval=1)
# 그래프 표시
plt.show()
# 종료 시 처리
is_reading = False
thread.join()
ser.close()
# # 그래프 초기 설정
# fig, ax = plt.subplots()
# x_data = np.arange(50)
# lines = [ax.plot(x_data, np.zeros(50), label=label)[0] for label in ['Left F', 'Left B', 'Right F', 'Right B']]
# ax.set_xlim(0, 50)
# ax.set_ylim(0, 1023)
# ax.legend()
# # 시리얼 데이터 읽기를 위한 스레드 시작
# thread = threading.Thread(target=read_serial_data, args=(ser,))
# thread.start()
# # 애니메이션 시작
# ani = FuncAnimation(fig, update_graph, blit=False, interval=1)
# # 그래프 표시
# plt.show()
# # 종료 시 처리
# is_reading = False
# thread.join()
# ser.close()