Получение ошибки ввода / вывода из Python с pySerial - PullRequest
4 голосов
/ 15 июня 2009

У меня есть скрипт 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, и реализация только передает ошибку в мой код. Так что никаких новых реальных идей оттуда нет. Есть ли хороший способ проверить, что происходит в программе?

Ответы [ 4 ]

2 голосов
/ 16 июня 2009

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

1 голос
/ 15 июня 2009

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

1 голос
/ 15 июня 2009

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

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

0 голосов
/ 06 ноября 2013

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

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

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

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

...