Как мне правильно управлять последовательным ресурсом? [Python]

#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 сработал, но это сработало, и это заставило меня подумать, что должно быть что-то, что я неправильно инициализирую.