Muitas vezes precisamos comunicar com outros dispositivos e periféricos. Pra quem já tem alguma intimidade com o Arduino ou outra plataforma embarcada conhece bem o monitor serial, que é a forma mais fácil e básica de conversarmos com nosso Arduino, porém nem sempre o monitor é suficiente para atender nossas necessidades.
Desenvolver a comunicação traz muita flexibilidade para o programador, como a vantagem de poder desenvolver o próprio sistema de supervisão ou dar um tratamento mais sofisticado para os dados adquiridos. Por Python nos trazer uma linguagem de fácil prototipação, tenho usado cada vez nos projetos e hoje vou falar um pouco sobre a popular biblioteca multiplataforma de comunicação serial, a pySerial.
Eu tive muito sucesso com ela em sistemas operacionais Linux, já em Windows a performance dela ficou bem precária para comunicação em alta velocidade.
Overview
a pySerial fornece um módulo chamado serial
, que encapsula o acesso à porta serial. O módulo automaticamente seleciona a implementação nativa de acordo com o ambiente à ser utilizado.
Instalação
A instalação do módulo pode ser feita através do pip
, de maneira muito fácil:
pip install pyserial
Primeiros passos
A utilização da porta serial consiste em algus passos simples:
- Configurar a porta;
- Abrir a porta;
- E está pronta para usar.
Não esquecendo de fechar a porta após o uso.
Abrindo a porta
Há várias maneiras de fazer os primeiros passos, e deixarei o detalhamento para a documentação oficial.
Minha preferencia é sempre por configurar e abrir diretamente no construtor, assim:
import serial
ser = serial.Serial('COM3', 9600) #Configurando e abrindo a porta
ser.write(b'hello')
s = ser.read()
ser.close()
utilizando o laço with
, não precisamos nos preocupar com o fechamento da porta (Python 3):
import serial
with serial.Serial('COM3', 9600) as porta:
porta.write(b'hello')
linha = porta.readline()
Utilizando a porta:
Uma das funções que eu considero mais bacanas, principalmente na leitura é a função readline
da classe Serial
. Ela permite bloquear (ou não) a tarefa que esta realizando a leitura até receber o caracter de quebra de linha.
linha = ser.readline()
linha_str = linha.decode('utf-8') # Converte o array de bytes recebido para String
É possível ler byte a byte com a função read
, retornando um objeto do tipo bytes.
Podemos checar se tem algo no buffer de entrada ou saída com a propriedade in_waiting
ou out_waiting
.
if ser.in_waiting > 0:
c = ser.read()
Para enviar algo, podemos usar a função write
, passando como parâmetro uma instância de bytes ou bytearray. Para converter um String para bytes, podemos usar a função encode
, algo como:
ser.write("Ola mundo".encode('utf-8'))
Have fun!
Anexo: Comandos úteis:
Mini terminal pySerial:
python -m serial.tools.miniterm <port_name>
Lista de portas seriais disponíveis:
python -m serial.tools.list_ports