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