PySerial не разговаривает с Arduino - PullRequest
8 голосов
/ 16 ноября 2011

Я написал некоторый код для имитации оборудования, с которым я работаю, и загрузил его на плату Arduino.Этот код работает.Я знаю это, потому что я получаю ожидаемый ответ от HyperTerminal.

Однако, когда я пытаюсь подключиться с помощью PySerial, соединение не выдает ошибку, но я не получаю ответ на отправляемые команды.

Почему это может быть?

Код Python

import serial

def main():
    sp = serial.Serial()
    sp.port = 'COM4'
    sp.baudrate = 19200
    sp.parity = serial.PARITY_NONE
    sp.bytesize = serial.EIGHTBITS
    sp.stopbits = serial.STOPBITS_ONE
    sp.timeout = 0.5
    sp.xonxoff = False
    sp.rtscts = False
    sp.dsrdtr = False

    sp.open()

    sp.write("GV\r\n".encode('ascii'))
    value = sp.readline()
    print value
    sp.write("GI\r\n".encode('ascii'))
    value = sp.readline()
    print value

    sp.close()

if __name__ == "__main__":
    main()

Примечание: код на Arduino отправляет обратно \r\n в конце ответа на команду.

Конфигурация HyperTerminal:

COM4 configuration in HyperTerminal

Редактировать

Я обнаружил, что если я увеличу время ожидания до 10 секунд и добавлю sp.readline() перед отправкой чего-либо, тоЯ получаю ответы на обе команды.

Сколько обычно аппаратное рукопожатие между PySerial и портами Arduino или USB RS-232?

Ответы [ 4 ]

5 голосов
/ 16 ноября 2011

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

Чтобы проверить это, вы можете попробовать и опросить, пока не будет данных

value = None
while not value:
   value = sp.readline()
print value

Редактировать

Arduino будет сброшен при открытии последовательного соединения, любые данные, записанные во время загрузки, скорее всего, попадут на небеса. Вы можете использовать сон в течение 2 секунд (не можете найти точное время, которое требуется, скорее всего, все равно будет меняться), прежде чем выполнять какие-либо операции чтения / записи.

В качестве альтернативы вы можете писать в нее, пока не получите ответ, после того, как вы получите ответ, вы начнете выполнять «настоящую работу».

3 голосов
/ 16 ноября 2011

Пока я использую обходной путь.Я установил для timeout значение 1,5 секунды и перед первой записью установил вызов readline.

Итак, теперь код Python выглядит следующим образом:

import serial

def main():
    sp = serial.Serial()
    sp.port = 'COM4'
    sp.baudrate = 19200
    sp.parity = serial.PARITY_NONE
    sp.bytesize = serial.EIGHTBITS
    sp.stopbits = serial.STOPBITS_ONE
    sp.timeout = 1.5 #1.5 to give the hardware handshake time to happen
    sp.xonxoff = False
    sp.rtscts = False
    sp.dsrdtr = False

    sp.open()

    sp.readline() #to give the hardware handshake time to happen

    sp.write("GV\r\n".encode('ascii'))
    value = sp.readline()
    print value
    sp.write("GI\r\n".encode('ascii'))
    value = sp.readline()
    print value

    sp.close()

if __name__ == "__main__":
    main()
2 голосов
/ 04 июля 2012

Я также недавно столкнулся с этой проблемой и вот мое решение:

import serial

ser = serial.Serial(4, timeout=2)
ser.setRTS(True)
ser.setRTS(False)
while 1:
    line = ser.readline()
    print(line)
ser.close

Оказывается, это успешно сбросит плату Arduino.

0 голосов
/ 16 августа 2016

Добавьте задержку после того, как вы откроете порт, поскольку Arduino сбрасывается и загрузчик начинает прослушивать новые прошивки. Если что-то отправлено в этот момент, MCU остается застрявшим в загрузчике. Задержка приводит к превышению времени ожидания загрузчика.

sp.open()
time.sleep(2) # 2 seconds or possibly a bit less
sp.write("blahblah")
...