Проблемы с отправкой команд через pySerial

Я пытаюсь поговорить с самодельной картой через последовательный порт и поэтому использую pySerial. В Гипертерминале все работает нормально. Я могу написать:

$ audio on

и звук включен, но если я использую

ser = serial.Serial("COM1", 38400)
ser.write("audio on\r\n")

Ничего не произошло. Однако я могу читать входящие данные, так что это не проблема со связью. Мне не поможет, если я изменю \r\n просто на \n или \r.

РЕДАКТИРОВАТЬ: Иногда я действительно получаю обратную связь: нет такой команды при отправке точно такой же команды, как работает из HyperTerminal. Настройка точно такая же, как и в HyperTerminal.

Решено: чтобы это сработало, мне пришлось отправить один и один символ и завершить передачу с помощью \r.


person martiert    schedule 25.06.2010    source источник


Ответы (3)


Возьми осциллограф (у тебя ведь он есть, да?) и посмотри последовательную линию. Отправляйте через него один символ в секунду и смотрите, что появляется в области видимости (настройте его на запуск по стартовому биту). Биты последовательного порта идут в следующем порядке: старт, младший бит..старший бит, четность, стоп.

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

person Mike DeSimone    schedule 25.06.2010

  1. Трижды проверьте, что скорость передачи данных устройства действительно равна 38400.
  2. Тройная проверка четности, стоповые биты и т.д.
  3. Помните об ухудшении сигнала при последовательной передаче на большие расстояния (вероятно, это не ваша проблема).

Если все вышеперечисленное проверить, попробуйте поместить строку в массив байтов и отправить ее с помощью команды записи. Просто предположение.

person nathan    schedule 25.06.2010

Отправка символов через Hyperterminal доставляет символы с той скоростью, с которой вы их вводите. При отправке символов через pyserial они доставляются как непрерывный поток. Приемник (особенно при высоких скоростях передачи данных) может отбросить их, в зависимости от характера получателя.

Кроме того, когда вы отправляете команды интерпретатору, вам нужен только терминатор \r (без \n) (обычно это все, что отправляет гипертерм). ОДНАКО, если вы просто отображаете значения, вам может понадобиться \n для создания новой строки.

person RufusVS    schedule 12.04.2014