TtyUSB0 üzerinde DTR'yi devre dışı bırak


11

Pi'den Arduino-clone board'a bağlanıyorum. Sorun, Arduino'nun bağlantıda sıfırlanmasını önlemek için DTR hattını devre dışı bırakmam gerekiyor.

RPi'de DTR, DCD ve diğer hatları kontrol etmenin mümkün olmadığını okudum. Bu, global olarak RPi için mi yoksa sadece seri iletişim için kullanılan GPIO pinleri için mi geçerli?

USB bağlantı noktasında DTR'yi devre dışı bırakmak mümkünse, bunu nasıl başarırsınız?

Yanıtlar:


6

Bir USB seri dönüştürücünün özellikleri , barındırma sisteminin donanımı ile ilgisi yoktur, ancak sadece USB seri yongasının kendisi ve barındırma sisteminin yazılım yığını ile ilgilidir.

Pi stok Linux USB seri sürücüleri kullanıyor olmalıdır.

Bu nedenle, DTR'nin bağlantıyı hupclArduino sitesinde ve başka yerlerde belgelendiği gibi her zamanki Linux temizleme yöntemiyle açma / kapama bağlantısına etkinleştirebilir / devre dışı bırakabilirsiniz :

stty -F /dev/ttyUSB0 -hupcl

Veya / dev / ttyUSB0 yerine USB seri bağlantı noktanıza karşılık gelen herhangi bir aygıt dosyası koymak (örneğin, bağlanan ilk Uno büyük olasılıkla / dev / ttyACM0 olacaktır)

PI'nin kendi yerel seri portu ile ilgili olarak bile, DTR'nin bu davranışı nihayetinde yazılım kontrolü altındadır - aksi halde tartışan herkes, portun herhangi bir bilgisine sahip olan donanım değil, sadece Linux sürücüsü olduğunu görmezden gelir. açık veya kapalı. Gerçek bağlantı noktası donanımı, yalnızca hiçbirinin seri aygıtın açılmasıyla eşanlamlı olarak okunmadığını veya yazıldığını veya yeniden yapılandırıldığını söyleyebilir.


Bu sadece barındırma pi yeniden başlatılmadığı sürece çalışır mı?
user2395126

6

@ChrisStrattons yazısı , stty -F /dev/ttyUSB0sıfırlamaya neden olan videoyla sohbetten kaçınmak için nasıl kullanılacağını açıklar . Python'da bunu yapmak için bir pasaj:

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 kablosunu çıkarırken tam sayının olabileceğini unutmayın, bu yüzden yolu globbing ile tespit ediyorum:

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

Bunun Ubuntu'da genel bir x86_64 dizüstü bilgisayarda ve bir Raspberry Pi 2'de çalıştığını doğruladım.
Cerin

termiosDiyelim ki kullanmak için herhangi bir neden var mı os.system("stty -F /dev/ttyUSB0 -hupcl")? Ayrıca, btw, bunun ana sistem açıldıktan sonra ilk kez bağlandığınızda Arduino'nun sıfırlanmasını engellemediğini fark ettim; sonraki bağlantılarda sıfırlanmasını engeller. Hangisi hiç yoktan iyidir. Ama keşke DTR'yi değiştirmesini nasıl engelleyebileceğimi anlayabilseydim.
Jason C

2
@JasonC Kullanarak termiosharici bir programa ( stty) çatal / exec (çağrı) kaydeder . DTR şey hakkında ne yapacağından emin değilim, ben sadece bu "özelliği" kabul ve Pi üzerinde Arduino ve uygulama senkronize olup olmadığını tespit etmek için bazı mantık (yazma / okuma ile özel el sıkışma) ekledi düşünüyorum.
Lekensteyn

Nihai çözümüm, pi önyüklendiğinde stty komutunu, ardından ilk sıfırlamayı zorlamak için bağlantı noktasına bir yankı ve arduino sıfırlamasını beklemek için 3 saniyelik bir gecikme eklemekti. Sonra bundan sonra düşünmek ya da Python senaryolarında endişelenmek zorunda değilim. Ben rc.local ama her yerde yaptım. Maliyet +3 saniye pi açılış süresidir.
Jason C

3

Arasına bir 120Ohm (veya 120Ohm yapmak için bir kombinasyon) ekleyebilirsiniz RESETve 5VBu tamamen sıfırlamayı önleyecektir. Diğer çözümler ya bir direnci ya da kapasitörü tahtadan çıkarmayı gerektirdiğinden, en az invazivdir, yüklemeleri zorlaştırır. Programlıyorsanız direnci korumayın. Onu kaldır.

resim açıklamasını buraya girin

Leonardo panoları DTRtetiklense bile sıfırlanmaz , ancak bazen Ahududu ile olan bağlantıyı kaybettiği ve fiziksel olarak sıfırlamanız gerektiği için sorunu uzaktan sıfırlamanız gerektiğinde başlar.


3
Bunun bir düşüşü hak ettiğinden emin değilim. Bunu yapmak berbat ve yazılım tabanlı değil, ancak bazı araştırmalardan sonra çalışan donanım çözümü gibi görünüyor.
Jason C

0

Seria ve pySerial kütüphanesini kullanıyorsanız şunları kullanabilirsiniz:

ser = serial.Serial ('/ dev / ttyACM0', 9600, dsrdtr = Doğru)


-1

PySerial kullanabilirsiniz. İşte Python koduna bir örnek:

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

daha fazla seçenek için Pyserial'ı kontrol edin .


1
Bu kütüphane sorunu değil. Ben alreadz 4 farklı libs denedim, her zaman aynı sonuç - DTR komutları yok sayılır.
jnovacho

Bu, başka bir Linux'ta çalışan bir şeyin doğru bir ifadesiyse, pi donanımı da çalışır, çünkü pi donanımı yalnızca genel linux yazılımını barındırır ve benzersiz bir şekilde dahil değildir.
Chris Stratton

1
Bu işe yaramıyor. Linux'ta, bu hala Arduino'nun sıfırlanmasına neden oluyor.
Cerin,

1
Bu Pi ve Arduino sürümüm ne olursa olsun çalışmadığını onaylayabilir miyim (bilmiyorum, üzgünüm, bu şeylerin hiçbirini bilmiyorum, bilmek istemiyorum, sadece bazı kod hata ayıklamak için bir sistem verildi Ayrıca, ilgili olup olmadığından emin değil, ancak stty -F /dev/ttyUSB0 -cdtrdsrraporlar invalid argument: -cdtrdsr.
Jason C
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.