#python #memory #resources
#python #память #Ресурсы
Вопрос:
Я работаю над проектом автоматизации с помощью python и Arduino. Мне нужно запустить тест, который гарантирует, что подключен Arduino (а не какое-либо другое устройство). У меня есть простой тестовый пример, который работает, но вообще не управляет памятью последовательного объекта. У меня есть решение, которое, по моему мнению, должно работать, однако оно вызывает проблему с последовательным подключением. В результате первое чтение возвращает пустую строку. Последующие чтения возвращают правильное значение. Для моего приложения мне нужно, чтобы оно правильно считывалось с первой попытки.
Вот тестовый код, который я использовал. Этот код работает просто отлично (я знаю, что проблема не в Arduino)
ser = serial.Serial('/dev/tty.usbmodem14101', 9600, timeout=1)
ser.flush()
while True:
text = input("Input: ")
ser.write(bytes(text, 'utf-8'))
time.sleep(0.2)
line = ser.readline().decode('utf-8').rstrip()
print(line)
Это моя попытка создать лучший способ управления последовательным ресурсом с помощью диспетчера контекста и оператора with . Я попробовал 2 вещи. Класс ArduinoWith возвращает только false (и печатает и пустую строку) без указания какого-либо ввода на Arduino. ArduinoSelf в первый раз выдает тот же результат, но во второй раз возвращает True.
import serial
import time
from contextlib import contextmanager
@contextmanager
def arduino_serial_connection(path, rate, timeout=1):
connection = serial.Serial(path, rate, timeout=timeout)
yield connection
connection.close()
class ArduinoWith:
def __init__(self):
pass
def connection_test(self):
try:
with arduino_serial_connection('/dev/tty.usbmodem14101', 9600) as connection:
connection.write(b"Sn")
time.sleep(0.2)
answer = connection.readline().decode('utf-8').rstrip()#connection.read(8)
if answer == "H":
return True
else:
print("Answer: "" answer """)
except serial.serialutil.SerialTimeoutException:
print("Timeout")
except Exception:
print("Execption")
return False
class ArduinoSelf:
def __init__(self):
self.ser = serial.Serial('/dev/tty.usbmodem14101', 9600, timeout=1)
def connection_test(self):
try:
self.ser.write(b"Sn")
time.sleep(0.2)
answer = self.ser.readline().decode('utf-8').rstrip()#connection.read(8)
if answer == "H":
return True
else:
print("Answer: "" answer """)
except serial.serialutil.SerialTimeoutException:
print("Timeout")
except Exception:
print("Execption")
return False
a1 = ArduinoWith()
print(a1.connection_test())
time.sleep(1)
a2 = ArduinoSelf()
print(a2.connection_test())
time.sleep(1)
print(a2.connection_test())
Я не совсем уверен, почему запуск метода во второй раз в классе ArduinoSelf сработал, но это сработало, и это заставило меня подумать, что должно быть что-то, что я неправильно инициализирую.