Desenvolvimento

9 nov, 2017

Acessando a porta serial

Publicidade

Algumas formas que uso para acessar a porta serial

No canal Test After Deploy tivemos uma ótima explicação do funcionamento do tmux.

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 é feita 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. 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 é 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 sequência control + A, seguido de key.

screen /dev/tty.usbmodemFA131 

Minicom

O Minicom tem uma ponta de saudosismo para mim, era a minha principal forma de acesso à 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 próprio 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