Получение ошибки ввода/вывода из Python с помощью pySerial

StackOverflow https://stackoverflow.com/questions/994538

Вопрос

У меня есть скрипт Python, который записывает пакеты данных на плату Arduino через pySerial.Иногда при записи кода на плату pySerial выдает ошибку ввода/вывода с номером 5.

Некоторые исследования показывают, что это указывает на ошибку при записи в файл, представляющий подключение к плате Arduino.

Код, который отправляет, отправляет только однобайтовые пакеты:

try:
    # Check if it's already a single byte
    if isinstance(byte, str):
        if len(byte) == 1: # It is. Send it.
            self.serial.write(byte)
        else: # It's not
            raise PacketException
    # Check if it's an integer
    elif isinstance(byte, int):
        self.serial.write(chr(byte)) # It is; convert it to a byte and send it
    else: raise PacketException # I don't know what this is.
except Exception as ex:
    print("Exception is: " + ex.__getitem__() + " " + ex.__str__())

Ошибка, напечатанная этим кодом:

Ошибка ОС Ошибка ввода/вывода Errno 5

Что-то не так в моем коде при отправке?Нужно ли проверять, готово ли последовательное соединение что-то отправить или после отправки должна быть задержка?Или может быть проблема с железом или соединением с железом?

Редактировать:Я изучил реализацию Linux из pyserial, и она только передает ошибку в мой код.Так что никаких новых реальных идей оттуда не будет.Есть ли хороший способ проверить, что происходит в программе?

Это было полезно?

Решение

Извините, что побеспокоил вас, но я совершенно уверен, что ошибка вызвана тем, что Arduino перезапускается и, следовательно, закрывает соединение с компьютером.

Другие советы

Единственная проблема, которую я сразу вижу в вашем коде, — это проблема с отступами. Измените код следующим образом:

try:
    # Check if it's already a single byte
    if isinstance(byte, str):
        if len(byte) == 1: # It is. Send it.
            self.serial.write(byte)
        else: # It's not
            raise PacketException
    # else, check if it's an integer
    elif isinstance(byte, int): 
        self.serial.write(chr(byte)) # It is; convert it to a byte and send it 
    else: 
        raise PacketException # I don't know what this is.
except Exception as ex:
    print("Exception is: " + ex.__getitem__() + " " + ex.__str__())

Я сомневаюсь, что ваша ошибка связана с этим, но попробуйте так и дайте нам знать!Вы проверяли, если byte является int только в том случае, когда это str, Итак elif всегда провалился по определению.Но я думаю, если ты настоящий если бы отступы кода были такими, вы бы получили SyntaxError, поэтому я думаю, что вы просто ошиблись в публикации, и ваша реальная проблема остается скрытой.

Если вы используете это в Windows, вы не можете открыть Arduino IDE с последовательным соединением одновременно с запуском сценария Python.Это вызовет ту же ошибку.

Позвольте мне попытаться предложить несколько комментариев, которые могут быть полезны вам и другим людям с похожими проблемами.Сначала попробуйте несколько раз запустить скетч Arduino с помощью последовательного монитора.Вы можете найти последовательный монитор в разделе «Инструменты» меню IDE.Вы также можете нажать Ctrl-Shift-M, чтобы вызвать Serial Monitor.

Последовательный монитор отображает то, что отправляет вам эскиз Arduino.Однако он также позволяет вводить данные, которые отправляются в эскиз Arduino.Другими словами, вы тестируете и отлаживаете обе стороны потока последовательных данных, просто используя Serial Monitor.

Посмотрите, что появляется.Часто бывает весьма полезно предположить, что ваш скетч пытается отправить данные обратно через Serial.print().Несколько замечаний.Убедитесь, что скорость передачи данных, установленная в последовательном мониторе, точно соответствует скорости передачи данных в вашем эскизе (9600 — хороший выбор почти во всех случаях).

Второе замечание является критическим.Вызов последовательного монитора приводит к перезагрузке платы Arduino.Ваш эскиз начинается заново (всегда).Это хорошо, потому что каждый раз дает вам новую возможность.Обратите внимание, что вы можете принудительно выполнить сброс, просто установив скорость передачи данных на 9600 (даже если она уже равна 9600).Это позволяет запускать множество тестов внутри Serial Monitor без необходимости каждый раз перезапускать Serial Monitor.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top