2011-10-02 11 views
5

Ho una telecamera a infrarossi/tracker con la quale sto comunicando tramite la porta seriale. Al momento sto usando il modulo per fare i pyserial. La fotocamera aggiorna la posizione di un oggetto tracciato alla velocità di 60 Hz. Per ottenere la posizione dell'oggetto tracciato eseguo uno pyserial.write() e poi ascolto una risposta in arrivo con pyserial.read (serialObj.inWaiting()). Una volta che la risposta/posizione è stata ricevuta, il ciclo while è rientrato e così via. La mia domanda ha a che fare con l'affidabilità e la velocità di questo approccio. Ho bisogno che la posizione venga ottenuta dal computer al ritmo di almeno 60Hz (e la posizione verrà quindi inviata tramite UDP a un sistema operativo in tempo reale). È qualcosa di cui Pyserial/Python è capace o dovrei cercare in approcci alternativi basati su C?pyserial/python e acquisizione dati in tempo reale

Grazie, Luca

+1

Come è successo? Che tipo di frequenze di campionamento sei riuscito a ottenere con Python? Ho effettuato alcune semplici acquisizioni di dati su scala Ohaus su RS232, ma sono riuscito a ottenere solo 5hz (avrebbe potuto essere la scala) – Chris

risposta

0

Python dovrebbe continuare, ma la cosa migliore da fare è assicurarsi di monitorare il numero di letture al secondo che si ottiene. Contare quante volte la lettura viene completata ogni secondo e, se questo numero è troppo basso, scrivere in un registro delle prestazioni o simile. Dovresti anche prendere in considerazione il disaccoppiamento della parte I/O dal resto del tuo programma python (se ce n'è uno) mentre le chiamate read di tipo pyserial stanno bloccando.

+1

grazie per tutte le risposte di tutti. Immagino che testerò le prestazioni delle funzioni di lettura/scrittura prima che io consideri di passare a qualcos'altro. ma potresti spiegare le chiamate seriali bloccate e perché potrebbero richiedere il disaccoppiamento del resto del programma (hai ragione, la lettura/scrittura è solo una piccola parte della funzionalità richiesta). – dataman

+0

Per impostazione predefinita, Pyserial bloccherà le chiamate in lettura (è possibile configurarlo in modo che non lo faccia). Ciò significa che quando si chiama 'read', l'intero programma si siede e attende che venga scritto qualcosa, quindi lo legge, quindi il programma può continuare. Ci sono un paio di modi per aggirare questo problema, sia usando chiamate che non bloccano ('read' ritorna immediatamente, ma forse senza niente), framework basati su eventi come twisted (twisted sa che stai aspettando e fa altre cose nel frattempo), o usando processi/threading (sebbene tu abbia lo stesso problema ad ascoltare i messaggi in arrivo dal processo). – jozzas

+1

sì, ho impostato il timeout = 0 e poi ho finito per ottenere un carattere alla volta. cioè, eseguo serial.read (1) all'interno di un ciclo while e controllo '\ r' che indica la fine del comando return e quando viene soddisfatta tale condizione, quindi emetto una nuova richiesta di posizione get. da una breve sperimentazione, non sembra che mi sia sfuggito qualche frame nel sistema di telecamere, il che è ottimo, anche se mi piacerebbe in qualche modo garantire che questo sia sempre il caso. come se apro un browser mentre il programma è in esecuzione, c'è un modo per forzare lo script ad avere la massima priorità? – dataman

1

Questo è più una questione di latenza della velocità.

Python esegue sempre l'allocazione e il rilascio della memoria, ma se i dati vengono riutilizzati, la stessa memoria verrà riutilizzata dalla libreria C. Quindi il sistema operativo (libreria C/stack UDP/IP) avrà un impatto maggiore rispetto a Python stesso.

Penso davvero che dovresti usare una porta seriale sulla tua macchina RTOS e usare il codice C e i buffer pre-allocati.

0

Sospetto che Python manterrà i dati in ordine. Il mio consiglio è di provare, e se Python sembra essere in ritardo, quindi provare PyPy invece - un'implementazione di Python che raccoglie la maggior parte dei vostri cicli interni fino a codice macchina per la velocità vicino in modo che di C.

http://pypy.org/

Problemi correlati