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