2009-08-25 28 views
12

He creado una secuencia de comandos para supervisar la salida de un puerto serie que recibe 3-4 líneas de datos cada media hora: la secuencia de comandos funciona bien y toma todo lo que sale del puerto que en el el final del día es lo que importa ...Python/PySerial y uso de CPU

Lo que me molesta, sin embargo, es que el uso de la CPU parece bastante alto para un programa que solo está monitoreando un solo puerto serial, 1 núcleo siempre estará al 100% de uso mientras script se está ejecutando.

Soy básicamente que ejecuta una versión modificada del código en esta pregunta: pyserial - How to Read Last Line Sent from Serial Device

la función inWaiting() a intervalos regulares He tratado de votación y tener que dormir cuando inWaiting() es 0 - I' He intentado intervalos de 1 segundo a 0.001 segundos (básicamente, siempre que puedo sin aumentar el uso de la CPU): esto logrará tomar la primera línea, pero parece que omite el resto de los datos.

Ajustar el tiempo de espera del puerto serie no parece tener ningún efecto en el uso de la CPU, ni colocar la función de escucha en su propio hilo (no es que realmente esperara una diferencia, pero valía la pena intentarlo).

  • ¿Debería python/pyserial usar esta cantidad de CPU? (Esto parece exagerado)
  • ¿Estoy perdiendo el tiempo en esta misión/Debería solo morder la viñeta y programar el guión para dormir durante los períodos que sé que no se recibirán datos?

Respuesta

13

Quizás podría emitir una llamada de bloqueo read(1), y cuando tenga éxito use read(inWaiting()) para obtener el número correcto de bytes restantes.

+0

¡Impresionante! Está ronroneando como un gatito ahora, al lado del uso nulo de la CPU y atrapa todo lo que le echo. He estado usando read (inWaiting()) bajo la impresión de que funcionaría del mismo modo que read (1): obviamente este no es el caso. Gracias por aclarar eso para mí. –

+0

Genial, y gracias por hacerme descubrir pyserial, lo consideraré la próxima vez que juegue con puertos seriales :) – tonfa

+0

Es excelente, fácil de configurar y usar, esto fue lo único con lo que tuve problemas y ** I ** fue el problema –

0

¿Sería mejor una solución de sistema? Cree el script de Python y hágalo ejecutar a través de Cron/Tarea programada?

pySerial no debería estar usando tanta CPU, pero si solo está ahí sentado durante una hora, puedo ver cómo puede suceder. Dormir puede ser una mejor opción junto con el despertar periódico y las encuestas.

+2

Si ejecuta desde cron o sleep, perderá el resultado serial. El programa debe ejecutarse como un daemon o proceso activo. – jmanning2k

+0

Agradezco la sugerencia de TheLobster, pero jmanning2k tiene el derecho, este es un proceso tipo daemon. Obtendremos datos cada media hora, pero eso es casi tan preciso como será. Un enfoque cron/de tarea programada tendría que ser * insanamente * preciso en el momento de trabajar y el malestar más pequeño daría como resultado la pérdida de datos. Eso simplemente no servirá. –