Utilizando utilitários padrão
No Linux, as portas série são representadas como ficheiros, pelo que utilitários comuns como echo e cat podem ser usados para interagir com elas. O comando stty permite alterar configurações da porta. Eis como cada ferramenta funciona.
Com stty, pode definir parâmetros como a taxa de transmissão (baud rate), número de bits de dados, paridade, tipo de handshake (controlo de fluxo), entre outros. Estes parâmetros têm de coincidir com os do dispositivo para que a ligação funcione corretamente.
Para ver as configurações atuais da porta, utilize:
sudo stty -a -F <your port>
Eis um comando de exemplo que define a taxa de transmissão da porta ttyS0 para 9600, 8 bits de dados e ativa o handshake RTS/CTS:
sudo stty -F /dev/ttyS0 9600 cs8 crtscts
Com as configurações definidas, podemos enviar dados para o dispositivo usando echo. É possível enviar texto simples para a porta série:
echo ‘TEXT’ > /dev/ttyS0
Contudo, isto requer sessão de superutilizador, que pode ser iniciada com “su -”.
Alguns dispositivos — como a nossa impressora — necessitam de códigos ASCII especiais como ESC ou Carriage Return. Uma forma de os enviar é usar echo -e com sequências de escape, que começam com \x seguidas de um valor hexadecimal.
Por exemplo, é assim que a palavra “TEXT” pode ser impressa utilizando sequências de escape:
echo -e '\x54\x45\x58\x54'‘
Vamos enviar as seguintes mensagens:
1B 40 | (ESC @, Inicializar) |
1B 6D | (ESC m, Corte Completo) |
4C 49 4E 45 20 31 | ("LINE 1") |
1B 21 80 | (Ativar Sublinhado) |
4C 49 4E 45 20 32 | ("LINE 2") |
0D 0A | (CR FF, Nova Linha) |
1B 40 | (Corte Completo) |
O argumento -e é necessário para que as sequências de escape hexadecimais “\x” sejam interpretadas corretamente. É assim que o comando aparece no terminal e no talão impresso:
Embora o comando echo permita enviar dados através da ligação série, o comando cat pode ser utilizado para os receber. No nosso caso, a impressora responde a pedidos ESC/POS padrão de estado e identificação, pelo que precisamos de capturar essas respostas. Para começar, executamos o cat a escutar o dispositivo ttyS0 e redirecionamos a saída para um ficheiro de texto:
cat /dev/ttyS0 > examplefile
A aplicação deve permanecer em execução para receber os dados, por isso é necessário abrir uma nova janela ou separador do Terminal para enviar comandos ao dispositivo. Usaremos echo para enviar o seguinte:
1D 49 31 |
(Request model ID) |
1D 49 32 |
(Request type ID) |
Como as respostas são fornecidas em formato hexadecimal, o conteúdo gravado pelo cat no ficheiro “examplefile” não será legível diretamente. Assim, iremos processar o ficheiro com o comando hexdump:
A usar o gtkterm
O Linux disponibiliza terminais série como o minicom e o gtkterm, capazes de interagir de forma completa com portas série, gerindo entrada e saída de dados, oferecendo opções avançadas de formatação e simplificando bastante o processo.
Como exemplo, iremos utilizar o gtkterm. Tal como o stty, o gtkterm deve ser iniciado com argumentos na linha de comandos para configurar a ligação, caso as definições padrão não sejam adequadas.
Entre as opções mais úteis encontram-se o local echo (que duplica no ecrã os dados enviados), o registo de comunicação, a visualização em hexadecimal e o envio de dados em formato hex. Repare também nos indicadores no canto inferior direito — mostram o estado das linhas DTR, RTS, CD, DSR e RI, sendo mais uma forma de confirmar que o dispositivo está ligado e pronto a comunicar.