2013-03-11 14 views
5

Linux'taki seri portlara bağlı tüm bağlı cihazları tespit etmenin iyi bir yolu var mı? C++ 'da programlama yapıyorum ama diğer örnekler de memnuniyetle karşılıyor.C++ linux tüm seri portları algılar

Her bağlantı noktasını açmayı deneyebilir ve başarılı olduğunda bağlantı noktası listesine ekleyebilirsiniz ancak bu gerçekten iyi bir çözüm gibi görünmemektedir.

Dev yöneticilere gidebilir ve seri bağlantı noktamdan bir USB portu olabilir, hangi ttyUSB .. dosyalarının yapıldığını kontrol edebilirim. Ancak tty0'dan tty63'e kadar olan dosyalar her zaman bu dizinde bulunduğundan, bu USB olmayan seri bağlantı noktaları için işe yaramıyor.

Benim örnek:

std::string port; 
int fd 
std::vector<std::string>> list; 
for(int i = 0; i < 256; ++i) 
{ 
    port.clear(); 
    port.append("/dev/ttyUSB"); 
    port.append(std::to_string(i)); 
    fd = open(port.c_str(), O_RDWR | O_NOCTTY | O_DELAY); 
    if(fd != -1) 
    { 
     list.push_back(port); 
    } 
} 

teşekkürler!

+0

Seri bağlantı noktaları genellikle 'ttyS0' vb. – Hasturkun

+1

Bu bana bir XY sorusu veriyor, gerçek problemin X olduğu ve çözümün Y olduğunu düşündüğünüz için siz de Y.'yi soruyorsunuz. Sistemdeki seri portlar hakkında niçin bilmek istiyorsunuz? –

+0

Bağlantı noktalarından 1 tanesinde bir zigbee aygıtı bağlanmıştır. Kullanıcı dostu yapmak istediğimden, kullanıcının seçebileceği tüm olasılıkları listelemek istiyorum. Normalde zigbee cihazınızı takarsanız tam olarak size gönderilen bir port numarasını almanız gerekir. @Hasturkun Benim durumumda, seri cihazım USB bağlantısı kullandığı için ttyUSB0 olarak adlandırılıyor. – Silver

cevap

7

Linux'ta aygıtları sıralamak için standart yöntem, /sys dosya sistemine göz atmaktır. Bu durumda, aşağıdaki yapabilirsiniz: /sys/class/tty/foo/devicelstat() kullanarak varsa

  1. Enumerate her dizinde /sys/class/tty/foo için /sys/class/tty
  2. tüm dosyalar, kontrol edildi.
    • Eğer mevcut değilse, bir çeşit sanal aygıtla (sanal konsol bağlantı noktası, ptmx, vb.) Uğraşırsınız ve onu atabilirsiniz.
    • Varsa, foo seri bağlantı noktasını saklayın.

Sen Gerçek seri portlar listesiyle bırakılmalıdır.

+0

Bu mekanizma yoluyla 32 cihaz alırım. 2 geçerli. Gerçekten sadece sürücü – Petesh

+0

olduğunu 'serial8250' işaret değil, kontrol etmek gerekir Benim sistemlerin üzerinde, ben 'aygıtın symlink' serial8250 'işaret eden gerçek geçerli seri portları var ... Ben değilim Eminim neden bu kadar çok geçersiz olana sahipsin. – Celada

+0

, 32 'CONFIG_SERIAL_8250_RUNTIME_UARTS' çekirdek yapılandırma değerinden geliyor, varsayılan 32'den fazla desteklediğini varsayalım (bu bir x64 3.2 çekirdeğidir). – Petesh