Вимкнути DTR на ttyUSB0


11

Я підключаюсь від Pi до Arduino-клонінг борту. Проблема полягає в тому, що мені потрібно відключити лінію DTR, щоб не допустити скидання Arduino під час з'єднання.

Я читав, що на RPi неможливо керувати DTR, DCD та іншими лініями. Це правда для RPi в усьому світі або лише для GPIO-штифтів, що використовуються для послідовного зв'язку?

Якщо можливо відключити DTR на порту USB, як це зробити?

Відповіді:


6

Властивості послідовного USB-перетворювача не мають нічого спільного з обладнанням системи хостингу, а лише з самим USB-послідовним чіпом і програмним стеком хостинг-системи.

Pi повинен використовувати базові драйвери USB-послідовних USB.

Отже, ви можете ввімкнути / відключити зв'язок DTR до відкритого / закритого порту за допомогою звичайного методу очищення hupclналаштувань Linux, як це зафіксовано на сайті Arduino та в інших місцях:

stty -F /dev/ttyUSB0 -hupcl

Або заміна / dev / ttyUSB0 будь-яким файлом пристрою фактично відповідає вашому послідовному порту USB (наприклад, першим підключеним Uno, ймовірно, буде / dev / ttyACM0)

Навіть що стосується власного серійного порту PI, така поведінка DTR знаходиться в кінцевому підсумку під контролем програмного забезпечення - кожен, хто стверджує інше, ігнорує той факт, що це лише драйвер Linux, а не апаратне забезпечення, яке має будь-які знання про те, що порт знаходиться відкриті чи закриті. Фактичне обладнання порту може лише визначити, що воно читається або записується або перенастроюється, жоден з яких насправді не є синонімом відкриття послідовного пристрою.


Це буде працювати лише до тих пір, поки хостинг пі не буде перезапущено?
користувач2395126

6

У публікації @ChrisStrattons описано, як користуватися, stty -F /dev/ttyUSB0щоб уникнути зависання, що призводить до скидання. Ось фрагмент, як зробити це в Python:

import termios

path = '/dev/ttyACM0'

# Disable reset after hangup
with open(path) as f:
    attrs = termios.tcgetattr(f)
    attrs[2] = attrs[2] & ~termios.HUPCL
    termios.tcsetattr(f, termios.TCSAFLUSH, attrs)

ser = serial.Serial(path, 9600)
# etc.

Зауважте, що точне число може підключитися під час підключення USB-кабелю, тому я визначаю шлях шляхом поглинання:

try:
    path = glob.glob('/dev/ttyACM*')[0]
except IndexError:
    # retry, error out, etc.
    pass

Я підтвердив, що це працює в Ubuntu або на загальному ноутбуці x86_64 і на Raspberry Pi 2.
Cerin

Чи є якась причина використовувати termiosнад, скажімо os.system("stty -F /dev/ttyUSB0 -hupcl"),? Також, btw, я помітив, що це не заважає Arduino скинутись під час першого підключення до нього після включення хост-системи; це заважає скинути його на наступні з'єднання. Що краще, ніж нічого. Але я б хотів, щоб я міг зрозуміти, як не допустити переключення DTR.
Jason C

2
@JasonC Використання termiosзберігає вилку / exec (виклик) у зовнішню програму ( stty). Не впевнений, що робити з DTR, я думаю, що я просто прийняв цю "особливість" і додав деяку логіку (власні рукостискання при написанні / читанні), щоб виявити, чи не синхронізовано Arduino та додаток на Pi.
Лекенштейн

Моє остаточне рішення полягало в тому, щоб додати команду stty, коли пі завантажується, з подальшим відлунням до порту, щоб примусити перше скидання, та затримкою на 3 секунди, щоб чекати скидання ардуїно. Тоді мені більше не доведеться думати про це після цього або турбуватися про це в сценаріях Python. Я робив це в rc.local, але куди б там не було. Вартість - +3 секунди пі час завантаження.
Джейсон C

3

Ви можете додати резистор 120Ohm (або комбінацію, щоб зробити 120Ohm) між резистором RESETі 5Vце запобіжить повністю скидання. Це найменш інвазивно, оскільки інші рішення вимагають або зняти резистор або конденсатор з плати, це ускладнює завантаження. Не тримайте резистор, якщо ви програмуєте. Видали це.

введіть тут опис зображення

Дошки Леонардо не скидаються, навіть якщо DTRвони спрацьовують, але проблема починається, коли потрібно скинути її віддалено, оскільки іноді втрачається з'єднання з малиною, і вам доведеться фізично скинути її.


3
Я не впевнений, що це заслуговує голоси. Це досить, щоб це зробити, але не на основі програмного забезпечення, але після деяких досліджень, здається, це робоче апаратне рішення.
Jason C

0

Якщо ви використовуєте бібліотеку Seria та pySerial, ви можете використовувати:

ser = serial.Serial ('/ dev / ttyACM0', 9600, dsrdtr = True)


-1

Можна використовувати PySerial. Ось приклад коду Python:

port =serial.Serial(
    "/dev/ttyUSB0",
    baudrate=57600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    dsrdtr = False
    )

Щоб отримати додаткові параметри, перевірте Pyserial.


1
Це не проблема бібліотеки. У мене alreadz пробував 4 різних ліб, завжди однаковий результат - команди DTR ігноруються.
jnovacho

Якщо це точне твердження про те, що працює на іншому Linux, воно повинно працювати також і на pi, оскільки апарат апарат pi містить лише універсальне програмне забезпечення для Linux, а не однозначно.
Кріс Страттон

1
Це не працює. У Linux це все ще викликає скидання Arduino.
Серін

1
Можу підтвердити, що це не працює в будь-якій версії Pi та Arduino (у мене немає (не знаю, вибачте, я нічого не знаю з цих речей, я не хочу знати, мені просто дали систему налагодження коду) о, хе.) Також не впевнений, чи це пов’язано, але stty -F /dev/ttyUSB0 -cdtrdsrзвіти invalid argument: -cdtrdsr.
Джейсон C
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.