Arduino Serial Monitor работает, но не на PySerial и PuTTY

Я сделал простую пользовательскую плату Arduino, используя atmega328p и микросхему PL2303 Serial to USB.

В моей программе на Arduino я нахожусь в цикле, который непрерывно отправляет строку. Я могу прочитать это в последовательном мониторе Arduino со скоростью 9600 бод. Однако в моей программе python, использующей библиотеку pySerial, функция readline ничего не возвращает. Я проверил с помощью PuTTY, но он по-прежнему ничего не делает.

Теперь я попытался поиграться с настройками серийного номера и обнаружил, что эти строки кода работают (readline возвращает строку), если я вызываю их в том же порядке.

ser = serial.Serial(comm_port)
ser.xonxoff = True
ser.rtscts = True
ser.dsrdtr = True
ser.readline()

Однако приведенный ниже код не работает

ser = serial.Serial(comm_port, xonxoff=True, rtscts=True, dsrdtr=True)
ser.readline()

Что может быть причиной этого? Я предполагаю, что каким-то образом я переключил линии данных в своем USB-кабеле, и что последовательный монитор Arduino каким-то образом справляется с этим.

Еще одна вещь, которую следует отметить, это то, что я не мог запрограммировать Arduino обычным способом через USB. Мне всегда приходится программировать его, используя порт ICSP и программатор USBasp.

, 👍0


2 ответа


0

Я написал приложение на Python, которое обменивалось данными с Arduino, и по какой-то причине мне пришлось вставить задержку после открытия последовательного порта, чтобы оно работало правильно, иначе первые отправленные данные всегда будут сброшены. Возможно, это то, что здесь происходит? Такая установка атрибутов последовательного соединения, вероятно, медленнее, чем при инициализации.

Для себя я обнаружил, что задержка в 3 секунды - это то, что мне нужно, чтобы он работал на 100% правильно на всех компьютерах (на некоторых хватило секунды). Вам нужно было только подождать после открытия, как только оно открылось, все заработало нормально.

Чтобы сделать задержку, импортируйте модуль времени и используйте функцию сна, которая принимает в качестве аргумента секунды.

import time

time.sleep(3)

Также стоит отметить, что в зависимости от вашего приложения стоит установить значение тайм-аута для серийного номера, которое подходит, или просто оставить его открытым с параметром тайм-аута.

 ser = serial.Serial(com, 115200, timeout=0) 

Если вы это сделаете, не забудьте закрыть его, когда закончите с ним (я лично использовал блок try finally, который гарантирует, что он всегда закрыт).

try:
  ser = serial.Serial(com, 115200, timeout=0)
  #go nuts with whatever communicating your doing
finally:
  ser.close()

Боюсь, я не могу точно сказать вам, что вызвало проблему. Я также понимаю, что этот вопрос довольно старый, поэтому я надеюсь, что мой ответ все еще будет полезен, если не вам, то кому-то еще, кто наткнется на него. На будущее обратите внимание, что люди на официальном форуме Arduino могут помочь в вопросах, связанных с arduino в целом.

,

Задержка до того, как он будет готов, почти наверняка вызвана автоматическим сбросом при открытии последовательного порта и последующим тайм-аутом загрузчика., @Chris Stratton

Да, попробуйте вместо этого подключиться к контактам RX/TX., @user2497


-1

"Еще следует отметить, что я не смог запрограммировать Arduino обычным способом через USB. Мне всегда приходится программировать его, используя порт ICSP и программатор USBasp». похоже, что у вашего atmega328p нет загрузчика. Или у PL2303 нет подходящего драйвера.

Я никогда не использовал PL2303, но использовал адаптеры FTDI USB TTL (ft232r). Когда я впервые использовал адаптер, на моем компьютере под управлением Windows был установлен неверный драйвер для адаптера, и мне пришлось вручную загрузить правильную прошивку с веб-сайта FTDI и установить ее вручную. Проверить правильность драйвера можно в диспетчере устройств, автором драйвера должно быть имя производителя (не Microsoft).

,