Python & pyserial + threads

Como parte das minhas tarefas na Iniciação Científica que estou fazendo, precisei, junto com um colega, fazer engenharia reversa no protocolo de comunicação serial de um kit de robótica educacional. Implementamos depois uma biblioteca, em Python, usando a pyserial, para controlar o robô.

Depois disso fiz uma interface em PyGTK, que mostra o valor dos sensores, permite verificar a carga das baterias e atuar os motores; além disso, possui um pequeno shell Python, onde é possível controlar o robô como se fosse um “Logo”. Ficou bem legal e funcionou perfeitamente bem no Linux.

O problema é que o negócio tem que ser multiplataforma. Tem que funcionar pelo menos em sistemas POSIX-like e em Win32. A interface funciona perfeitamente bem, como já havia testado com outros programas: não há necessidade de alterar uma linha de código dela. A biblioteca de comunicação com o robô também funciona a contento. O problema aparece quando tento usar threads.

A primeira versão da interface fazia tudo no main loop da GTK+, mas isso comia um tempo razoável. Fiz então uma thread que fica fazendo polling dos sensores (a única maneira, pensei em usar select(), mas do jeito que as coisas funcionam do lado de lá é inviável).

No Linux funciona muito bem: a thread fica fazendo o polling dos dados dos sensores, armazena num dicionário, e depois disso verifica uma fila de comandos (como por exemplo atuar motor, etc), que são enviados de acordo com a necessidade do usuário.

No Windows, entretanto, há um lag absurdo quando se usa threads e a pyserial em conjunto. Consegui melhorar um pouco a situação mas mesmo assim, a leitura dos sensores estão demorando 5x mais que o necessário. Os comandos da fila de execução ficam atrasados demais… :/

Alguém tem alguma idéia do que pode estar acontecendo, e do que pode ser feito para arrumar? Posso liberar o código sem problema algum. Já criei o projeto na Berlios, estou esperando a aprovação para mandar o que está pronto para o repositório SVN…


One Response to “Python & pyserial + threads”

  1. Diogo Says:

    Onde posso encontrar o código para dar uma olhadinha?

Leave a Comment