Usando Python para comunicar com a Porta Serial.

E aí galera. Tava meio pobre a categoria sobre python então resolvi trazer uma dica que vale por três (ou não, rsrsr). Hoje vou demonstrar como utilizar a linguagem Python para comunicar com a porta serial. Já é sabido de todos que python é uma das linguagens de mais fácil utilização e que prove alto nível, logo o que será mostrado abaixo poderá ser entendido por todos aqueles que conheçam alguma linguagem de programação e sua lógica.

Existe um modulo rico em documentação, chamado PySerial escrito para ser usada na comunicação de programas python com dispositivos que usam portas seriais. Haaaa mas então posso utilizar isso para comunicar com o Arduino??? Sim, você pode. E tem mais, vou fazer um tutorial especialmente para demonstrar isso.

Para ver a documentação sobre o modulo CLIQUE AQUI.

Bem, vamos ao que interessa. Primeiramente precisamos instala-lo, acesse um terminal e digite:  apt-get install python-serial
Se tudo ocorrer bem deverá ser instalado. Vamos ver os métodos básicos para manipulação das portas:

Antes de mais nada devemos dar um import serial para podermos usar os métodos básicos como open(), write(), read() e close(). Logo após devemos criar um objeto para manipularmos os métodos. No exemplo acima o objeto é chamado de ser. O objeto ser é criado e recebe o retorno de serial.Serial() nesse método devemos passar os argumento como: nome da porta e baudrate etc… Podemos usar ainda o método portstr para listar as portas existentes na maquina e as que realmente estão sendo usadas. Para escrevermos algo na porta usamos o método write(), mas lembre-se de que ele deve ser acessado pelo objeto ser. Nesse caso foi escrita a string “hello”. E finalmente precisamos fechar a porta com o método close().

Essa figura demonstra melhor a passagem de parâmetros para o método serial.Serial(). Repare que o método read() foi usado e o retorno deste foi armazenado em uma variável de nome x. Esse método le apenas 1 byte da porta. Para podermos ler linhas usamos o metodo readline(). Na figura acima o método foi usado e o retorno foi armazenado em uma variável chamada line. E então novamente a porta foi fechada.

Agora que já sabemos um pouco sobre os métodos básicos, vejamos um exemplo em código: Obs (O código foi testado no Linux).

# Autor: Fernando Krein Pinheiro
# Data: 07/09/2011
# Linguagem: Python

# ========= IMPORTANTE ===========
# O codigo esta livre para usar,
# citar e compartilhar desde que
# mantida sua fonte e seu autor.
# Obrigado.

#! /usr/bin/env python

import serial
porta = '/dev/ttyUSB0'
baud_rate = 9600

###################### FUNCAO PARA VERIFICAR PORTAS ATIVAS ###############
def verifica_portas():

    portas_ativas = []
    for numero in range(10):

        try:
            objeto_verifica = serial.Serial(numero)
            portas_ativas.append((numero, objeto_verifica.portstr))
            objeto_verifica.close()

        except serial.SerialException:
            pass
    return portas_ativas

################    FUNCAO PARA ESCREVER NA PORTA ####################
def escrever_porta():

   try:

       valor = (raw_input("Digite o valor a ser enviado: "))
       Obj_porta = serial.Serial(porta, baud_rate)
       Obj_porta.write(valor)
       Obj_porta.close()

   except serial.SerialException:
       print"ERRO: Verifique se ha algum dispositivo conectado na porta!"

   return valor

########################## FUNCAO PARA LER A PORTA #######################
def ler_porta():

   try:

       Obj_porta = serial.Serial(porta, baud_rate)
       valor = Obj_porta.read()
       print"Valor lido da Serial: ",valor
       Obj_porta.close()

   except serial.SerialException:
       print"ERRO: Verifique se ha algum dispositivo conectado na porta!"

################################ MAIN ####################################
if __name__=='__main__':

    print"==========================================="
    print"===== 1 - Verificar Portas Existentes ====="
    print"===== 2 - Ler Valor da Porta Serial   ====="
    print"===== 3 - Escrever Valor na Porta Serial =="
    print"==========================================="
    opcao = int (raw_input("Digite a Opcao: "))

    if opcao == 1:
        print"Numero da porta | Nome da Porta"
        for numero,portas_ativas in verifica_portas():
            print"      %d         |    %s" % (numero,portas_ativas)

    elif opcao == 2:
        ler_porta()

    elif opcao == 3:
        escrever_porta()

    else:
       print"Entrada Invalida!!"

O código funciona da seguinte maneira:
Possui uma função chamada de verifica_portas() a qual usa o método portstr() para listar as portas da maquina. Uma outra função chamada ler_porta() que usa o método read() para ler os dados, lembre-se esse método le apenas 1 byte. E outra função chamada escrever_porta que faz o uso do método write() para enviarmos um valor inteiro digitado pelo usuário.

Então temos uma main() onde são chamadas essas funções. Simples não?!!

Bem é isso aí, qualquer coisa é só perguntar ou seguir a documentação da PySerial!!!

Anúncios
por ferpinheiro Postado em Python

14 comentários em “Usando Python para comunicar com a Porta Serial.

  1. Pingback: Python e Arduino, uma boa combinação. « Compartilhar é preciso.

  2. Oi Marcelo, nunca trabalhei com CLP mas acredito que exista como, pois se esse seu dispositivo usa a SERIAL ele deve ser tratado da mesma forma que o arduino foi com esse codigo ou com outro usando o modulo PySerial!!

    Desculpe em não poder te ajudar mais….

  3. Olá meu caro, Faz um tempo que postei a pergunta acima, mas seu exemplo de comunicação esta muito bom, e só p/ ficar registrado conseguir fazer a comunicação, entre software e hardwarer. he he Hoje consigo ligar desligar a maquina através do meu programa, digo apenas quantas peças quero e a maquina inicia e para sozinha.

    • Que bom Marcelo! Fico feliz em poder ajudar de alguma forma, se possível gostaria que me enviasse seu projeto para poder aprender algo sobre CLP e quem sabe postar aqui no blog com sua autorização e é claro com sua autoria!!!

      Abraço!

  4. Gostei deste post amigo. Parabéns. Consegui comunicar com o PIC16f877A pela porta serial. funcionou redondinho.
    Olá pessoal sou novo por aqui, e estou tentando fazer uma comunicação serial com a minha Raspberry PI. Como o OS dela é LINUX, e sei quase nada de LINUX procuro ajuda.

    Alguém tem um exemplo de comunicação serial em PYTHON no modo gráfico (Qt Designer)

    Obrigado pessoal.

    Ailton de Oliveira – ailtongyn10@hotmail.com

  5. Boa tarde,
    Estou tentando comunicar com o Arduino, porém não estou conseguindo. Estou escrevendo na serial com o Arduino mas no programa não recebe.

  6. Eu não consigo invocar o método Serial() porque não tenho permissão para acessar essas portas no Linux. A seguinte mensagem de erro é levantada:

    >>> ser = serial.Serial(0)

    serial.serialutil.SerialException: could not open port 0: [Errno 13] Permission denied: ‘/dev/ttyS0’

  7. Caríssimo. Ja usei algumas placas para para sensoreamento e hoje conheci a arduino. Estou abismado com o que ela faz. Gostaria de saber se para programar de forma geral, para todas as funções da familia arduino. Uso 100% linux e preciso do arduino para uns projetos novos. Mas estou entre usar py ou C/C++ para programar para arduino. Qual seria a melhor opção ?

  8. Sugestão, ser for copiar o programa acima do Fernando Krein Pinheiro, não chame esse programa de serial.py. Qualquer outra coisa funciona.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s