2011-10-02 50 views
5

Seri bağlantı noktası üzerinden iletişim kurduğum bir kızılötesi kamera/izleyici var. Bunu yapmak için psikiyatrik modülü kullanıyorum. Kamera, izlenen bir nesnenin konumunu 60 Hz hızında günceller. İzlenen nesnenin konumunu elde etmek için bir pyserial.write() çalıştırıyorum ve sonra pyserial.read (serialObj.inWaiting()) ile gelen bir cevabı dinliyorum. Cevap/konum alındıktan sonra while döngüsü yeniden girilir ve böyle devam eder. Benim sorum bu yaklaşımın güvenilirliği ve hızı ile ilgilidir. En az 60 Hz hızında bilgisayar tarafından alınacak pozisyona ihtiyacım var (ve pozisyon UDP üzerinden gerçek zamanlı bir OS'ye gönderilecektir). Pyserial/Python'un alternatif C-tabanlı yaklaşımlara bakabileceği ya da bakmalı mıyım?pyserial/python ve gerçek zamanlı veri toplama

sayesinde Luke

+1

Bu nasıl oldu? Python ile ne tür örnekleme oranları elde edebildiniz? Ben RS232 üzerinden bir ohaus ölçek kapalı bazı basit veri toplama yaptım, ama herkesin tüm cevapları için sadece 5hz (ölçek olabilir) – Chris

cevap

0

Python iyi durumda olmalıdır, ancak yapmanız gereken en iyi şey, saniyede kaç okuma aldığınızdan emin olmanızdır. Okumanın her saniyede kaç kez tamamlandığını ve bu sayı çok düşükse, bir performans günlüğüne veya benzerine yazın. Ayrıca, Pyserial okuma çağrıları engellendikçe, I/O parçasını python programınızın geri kalanından (eğer varsa) ayırmayı da düşünmelisiniz.

+1

elde etmek mümkün oldu. Sanırım başka bir şeye geçmeyi düşünmeden önce okuma/yazma psikiyatrik fonksiyonlarının performansını test edeceğim. fakat engellenen seri çağrıları ve neden programın geri kalanını neden ayırmayı gerektirdiğini açıklayabilir misiniz (haklısınız, okuma/yazma işlemi gereken işlevin sadece küçük bir kısmıdır). – dataman

+0

Pyserial, varsayılan olarak okuma çağrılarını engeller (bunu yapmamak için yapılandırabilirsiniz). Bunun anlamı, 'read' dediğinizde, bütün program oturur ve bir şeyler yazılmasını bekler, sonra okur, sonra programınız devam edebilir. Engelleyici olmayan çağrıları kullanarak ('read' hemen geri döner, ama belki hiçbir şey olmadan), twisted gibi olay odaklı çerçeveler (bu arada beklediğinizi biliyor ve diğer şeyleri yapıyor) kullanarak, bu konuda birkaç yol var. veya işlemleri/iş parçacığı kullanarak (aynı soruna sahip olduğunuzdan, gelen iletilerden dinlemeyi sorun). – jozzas

+1

Evet, timeout = 0'ı ayarladıktan sonra her seferinde bir karakter aldım. Yani, bir while döngüsünde serial.read (1) gerçekleştiririm ve dönüş komutunun sonunu belirten '\ r' olup olmadığını kontrol edin ve bu koşul karşılandığında yeni bir get pozisyon talebi yayınlayın. Bazı kısa deneylerden, kamera sisteminde herhangi bir kareyi kaçırmış gibi görünmüyor, ki bu harika, her nasılsa bu her zaman böyle olmasını sağlamak isterim. Program çalışırken bir tarayıcı açsam gibi, komut dosyasının en yüksek önceliğe sahip olmasını zorlamanın bir yolu var mı? – dataman

1

Bu hızdan daha gecikme daha meselesidir.

Python her zaman bellek ayırma işlemini gerçekleştirir ve serbest bırakır, ancak veriler yeniden kullanılırsa, aynı bellek C kütüphanesi tarafından yeniden kullanılır. Böylece OS (C kütüphanesi/UDP/IP yığını) Python'un kendisinden daha fazla etkiye sahip olacaktır.

Gerçekten, RTOS makinenizde bir seri bağlantı noktası kullanmanız ve C kodu ve önceden ayrılmış arabellek kullanmanız gerektiğini düşünüyorum.

0

Python'un verileri iyi takip edeceğinden şüpheleniyorum. Benim tavsiyem bunu denemek olacak ve Python kalmış gibi görünür, sonra yerine PYPY denemek istiyorum - çok yakın hız için makine koduna aşağı

http://pypy.org/

C

o iç döngü en derler Python bir uygulama