Nonaktifkan DTR pada ttyUSB0

11

Saya menghubungkan dari Pi ke papan klon Arduino. Masalahnya adalah, saya harus menonaktifkan jalur DTR, untuk mencegah Arduino mengatur ulang saat terhubung.

Saya telah membaca bahwa pada RPi tidak mungkin untuk mengontrol DTR, DCD dan jalur lainnya. Apakah ini berlaku untuk RPi secara global atau hanya untuk pin GPIO yang digunakan untuk komunikasi serial?

Jika mungkin untuk menonaktifkan DTR pada port USB, bagaimana Anda melakukannya?

jnovacho
sumber

Jawaban:

6

Sifat-sifat konverter serial USB tidak ada hubungannya dengan perangkat keras dari sistem hosting, tetapi hanya dengan chip serial USB itu sendiri, dan tumpukan perangkat lunak dari sistem hosting.

Pi harus menggunakan driver serial USB Linux.

Oleh karena itu, Anda dapat mengaktifkan / menonaktifkan tautan DTR ke port buka / tutup melalui metode pembersihan kliring Linux hupclseperti yang didokumentasikan di situs Arduino dan di tempat lain:

stty -F /dev/ttyUSB0 -hupcl

Atau mengganti / dev / ttyUSB0 dengan file perangkat apa pun yang sebenarnya sesuai dengan port serial USB Anda (misalnya, Uno pertama yang terhubung kemungkinan akan menjadi / dev / ttyACM0)

Bahkan sehubungan dengan port serial asli PI sendiri, perilaku DTR ini pada akhirnya berada di bawah kendali perangkat lunak - siapa pun yang berpendapat sebaliknya mengabaikan fakta bahwa itu hanya driver Linux, dan bukan perangkat keras, yang memiliki pengetahuan tentang port yang sedang dibuka atau ditutup. Perangkat keras port aktual hanya dapat mengetahui bahwa perangkat sedang dibaca dari atau ditulis ke atau dikonfigurasi ulang, tidak ada yang benar-benar identik dengan membuka perangkat seri.

Chris Stratton
sumber
Apakah ini hanya akan berfungsi selama pi hosting tidak direstart?
user2395126
6

@ChrisStrattons post menjelaskan cara menggunakan stty -F /dev/ttyUSB0untuk menghindari hangup yang mengakibatkan reset. Berikut ini cuplikan untuk melakukannya dengan 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.

Perhatikan bahwa jumlah pastinya saat memasang kembali kabel USB, jadi saya mendeteksi jalur dengan menggumpal:

try:
    path = glob.glob('/dev/ttyACM*')[0]
except IndexError:
    # retry, error out, etc.
    pass
Lekensteyn
sumber
Saya telah mengkonfirmasi bahwa ini berfungsi di Ubuntu baik pada laptop x86_64 generik dan Raspberry Pi 2.
Cerin
Apakah ada alasan untuk menggunakan termioslebih, katakanlah os.system("stty -F /dev/ttyUSB0 -hupcl"),? Juga, btw, saya perhatikan ini tidak mencegah pengaturan ulang Arduino saat pertama kali Anda terhubung setelah sistem host dinyalakan; itu mencegahnya mengatur ulang pada koneksi berikutnya. Yang lebih baik daripada tidak sama sekali. Tapi saya berharap bisa mencari cara untuk menghentikannya dari beralih DTR.
Jason C
2
@JasonC Menggunakan termiosmenyimpan garpu / exec (panggilan) ke program eksternal ( stty). Tidak yakin apa yang harus dilakukan tentang hal DTR, saya pikir saya baru saja menerima "fitur" ini dan menambahkan beberapa logika (jabat tangan kustom dengan menulis / membaca) untuk mendeteksi apakah Arduino dan aplikasi pada Pi disinkronkan.
Lekensteyn
Solusi utama saya adalah menambahkan perintah stty ketika pi dinyalakan, diikuti oleh gema ke port untuk memaksa reset pertama, dan penundaan 3 detik untuk menunggu arduino reset. Maka saya tidak perlu memikirkannya lagi setelah itu atau khawatir tentang hal itu dalam skrip Python. Saya melakukannya di rc.local tetapi di mana pun. Biaya adalah +3 detik waktu boot pi.
Jason C
3

Anda dapat menambahkan 120Ohm (atau kombinasi untuk membuat 120Ohm) antara RESETdan 5Vini akan mencegah reset sepenuhnya. Ini adalah yang paling tidak invasif karena solusi lain mengharuskan untuk menghapus resistor atau kapasitor dari papan, itu mempersulit unggahan. Jangan simpan resistor jika Anda pemrograman. Singkirkan.

masukkan deskripsi gambar di sini

Papan Leonardo tidak mengatur ulang meskipun DTRdipicu tetapi masalahnya dimulai ketika Anda harus mengatur ulang dari jarak jauh karena kadang-kadang kehilangan koneksi ke Raspberry dan Anda harus mengatur ulang secara fisik.

Piotr Kula
sumber
3
Saya tidak yakin ini layak untuk downvote. Ini menyebalkan untuk melakukannya, dan bukan berbasis perangkat lunak, tetapi setelah beberapa penelitian tampaknya menjadi solusi perangkat keras yang masuk kerja.
Jason C
0

Jika Anda menggunakan Seria dan perpustakaan pySerial, Anda dapat menggunakan:

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

polo04
sumber
-1

Anda bisa menggunakan PySerial. Berikut ini contoh kode Python:

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

untuk opsi lainnya, periksa Pyserial.

hsantana8
sumber
1
Ini bukan masalah perpustakaan. Saya juga telah mencoba 4 lib yang berbeda, hasilnya selalu sama - perintah DTR diabaikan.
jnovacho
Jika ini adalah pernyataan akurat tentang sesuatu yang bekerja di Linux lain, itu harus bekerja pada pi juga, karena perangkat keras pi hanya hosting perangkat lunak generik linux, dan tidak terlibat secara unik.
Chris Stratton
1
Ini tidak berhasil. Di Linux, ini masih menyebabkan Arduino diatur ulang.
Cerin
1
Dapat mengkonfirmasi ini tidak berfungsi pada versi Pi dan Arduino apa pun yang saya miliki (saya tidak tahu, maaf, saya tidak tahu apa-apa tentang hal ini, saya tidak ingin tahu, saya hanya diberi sistem untuk men-debug beberapa kode aktif, heh.) Juga, tidak yakin apakah itu terkait, tetapi stty -F /dev/ttyUSB0 -cdtrdsrmelaporkan invalid argument: -cdtrdsr.
Jason C