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…


2 Responses to “Python & pyserial + threads”

  1. Diogo Says:

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

  2. Evandro Says:

    Hey acidx, este post é meio antigo, não sei se resolveu o problema ae descrito, mas estou tentando desenvolver algo parecido com o que você fez, estou comunicando com um pic pela porta serial através do pyserial, gostaria de deixar uma thread lendo a porta serial com tempo indeterminado e outra thread pegando a informação recebida e enviando pra um banco de dados, teria como me ajudar em algo, me indicar algo?

    Estou analisando possibilidade de gtk ou wxwidget (estou usando windows no momento, mas gostaria multiplataforma)

    Também gostaria posteriormente de utilizar um esquema ajax push pull, com esta comunicação em python, sabe se seria possivel?

    Se puder entrar em contato ao meu e-mail, agradeço.

Leave a Comment