Acessando a porta serial

Veja o vídeo desse arquivo aqui.

E para mim uma das coisas mais interessantes é que os desenvolvedores preferiram deixar de fora algumas coisas que tem no screen, como o suporte a telnet e a portas seriais, eles fizeram isso porque acreditam na filosofia UNIX de faça apenas uma coisa e faça bem feito. E na minha opinião eles estão muito certos.

Vamos ver algumas formas de acessar a serial

A única coisa que você tem que se lembrar não importa o modo que escolha para abrir a porta serial é que ela é feira para ser acessada apenas por um programa por vez, e para que outro programa consiga usar a mesma porta é necessário que o primeiro programa feche ela. Isso acontece muito por exemplo quando se esquece uma sessão do terminal serial do Arduino aberto.

Via Arduino

A maneira mais simples de todas é usar o próprio terminal serial do Arduino, embora funcione eu acho a IDE do Arduino básica demais.

Via emulador de terminal serial

Usar um emulador serial é interessante se você precisa garantir suporte a VT102 o meu favorito é o Serial, o preço é um pouco salgado então só vale a pena se você usa muito esse tipo de interface.

Usando o screen

Usar o screen para a abrir um terminal serial é bem comum principalmente porque o screen esta é omnipresente em todos os UNIX. A única coisa importante é lembrar de fechar corretamente o terminal para não deixar a porta “presa” para isso use a sequencia control + a seguido de k e y.

screen /dev/tty.usbmodemFA131

Minicom

Minicom tem uma ponta de saudosismo para mim, era a minha principal forma de acesso a BBS, o interessante do minicom é que ele é extremamente completo inclusive com os antigos protocolos zmodem e xmodem, bem interessantes para fazer download de arquivos via serial.

minicom -o console --color=on --attrib=on --device /dev/tty.usbmodemFA131 --baudrate 115200 -7

Criando seu proprio programa

Qualquer linguagem de programação que se prese vai conseguir acessar a porta serial sem nenhum problema, no exemplo usei Golang que é a minha linguagem favorita.

package main

import (
    "fmt"
    "log"
    "os"
    "os/signal"

    "github.com/crgimenes/goconfig"
    "github.com/tarm/serial"
)

type config struct {
    Port string
    Baud int `cfgDefault:"115200"`
}

func main() {

    cfg := &config{}

    err := goconfig.Parse(cfg)
    if err != nil {
        log.Fatal(err)
    }

    if cfg.Port == "" {
        fmt.Println("Porta não definida.")
    }

    c := &serial.Config{Name: cfg.Port, Baud: cfg.Baud}
    s, err := serial.OpenPort(c)
    if err != nil {
        log.Fatal(err)
    }

    go func() {
        sc := make(chan os.Signal, 1)
        signal.Notify(sc, os.Interrupt)
        // espera pelo sinal
        <-sc

        fmt.Printf("\r\nliberando recursos...\r\n")
        err = s.Close()
        if err != nil {
            log.Fatal(err)
        }
        fmt.Printf("have a nice day!\r\n")
        os.Exit(0)
    }()

    for {
        buf := make([]byte, 128)
        n, err := s.Read(buf)
        if err != nil {
            log.Fatal(err)
        }
        fmt.Print(string(buf[:n]))
    }
}

Mais exemplos em Go

Mais alguns exemplos em Golang estão aqui no repositório do Grupo de estudos de Go

Cesar Gimenes

Última modificação