Dev (Back & Front)ARTIGO

Acessando a porta serial

Neste artigo, o autor lista algumas formas para acessar o portal serial e dá algumas dicas de como fazê-lo com eficiência.

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

Cesar GimenesAutor

Trabalha com tecnologia desde a década de 90. Já atuou na área de educação e participou de projetos de mobilidade de grande volume para laboratórios farmacêuticos. Criou games tanto para PC, como para iOS. Hoje está direcionando seus esforços em plataformas de Sistemas Embarcados, IoT, microservices e cloud computing. É um entusiasta de tecnologias como Golang e Docker.

Ver perfil