Comunicação Serial RS232 (MEC295)
Este artigo é o quinto de uma série que faz uso do PC em aplicações mecatrônicas. Conforme dissemos nos anteriores (MEC289 e MEC290, MEC292 e MEC294) ele foi escrito em 2002 quando os computadores ainda tinham portas paralelas e seriais. Se você tem um velho computador com porta serial pode aproveitar os projetos e ensinamentos desta série de artigos.
Neste artigo, iremos sair um pouco da porta paralela do PC e usar a sua porta serial, a famosa comunicação RS-232.
Em nosso último artigo (MEC294) foi sugerida uma alteração no programa do controle de motor, para que o mesmo tivesse uma opção de alternar a direção automaticamente em um período de 2 segundos.No código-fonte 1, mostrado mais adiante, segue a listagem; em relação ao programa original.
Na segunda parte desta sequência de artigos, indicamos, como os dados eram transmitidos paralelamente em um barramento de dados de 8 fios ( D0 a D7), veja figura 2.
Transmissão paralela em barramento de 8 fios.
Vamos supor o cenário de um PC imprimindo em uma impressora paralela no formato texto (figura 3). Imagine- mos também que o PC queira imprimir o texto 123 na impressora.
Impressão de formato texto em impressora paralela.
De antemão,+- sabemos que os caracteres 1, 2 e 3 são bytes (8 bits) e serão transmitidos um de cada vez pelo barramento. Você deve estar se perguntando: em quais códigos eu consigo representar esses caracteres A resposta é através da tabela ASCII (American Standard Code for Information Interchange): uma normalização feita no inicio dos primeiros computadores que padronizou a comunicação entre computadores e periféricos. Observe, mais à frente.
Voltando à nossa impressão, o PC terá que enviar os códigos em hexadecimal 31, 32 e 33, que correspondem na tabela ASCII aos caracteres 1, 2 e 3.
A figura 4 resume a nossa transferência de dados para imprimir 1, 2 e 3.
Transferência de dados para impressão dos caracteres 1, 2 e 3.
Ótimo, aprendemos como enviar dados para uma impressora paralela. Mas, e se nossa impressora fosse serial? Boa pergunta, mas antes de respondê-la vamos discorrer um pouco sobre comunicação serial de um modo simples, sem aprofundar-nos em detalhes.
O objetivo é que você compreenda alguns termos e tenha a ideia básica de como a comunicação serial funciona. Dessa maneira, poderemos utilizá-la em nossos programas LOGO para controlar dispositivos e fazer a comunicação com outros computadores.
As famosas COM1 e COM2 dos PCs são para comunicação serial assíncrona , as quais seguem uma normalização que popularmente conhecemos como RS-232. Essa norma define tanto o aspecto de temporização quanto o elétrico. Diferente da comunicação paralela que utiliza 8 fios para passar dados, a comunicação serial utiliza somente 1 fio para fazer isso.
No PC podemos ter dois tipos de conectores para as portas seriais: o DB9 com nove pinos e o DB25 com 25 pinos (figura 5). Analisando essa figura podemos notar que temos um número razoável de linhas.
Conectores típicos para a porta serial do PC.
Aí vem a pergunta: Para que tantos pinos se só iremos utilizar 1 fio na transmissão de dados? A resposta é para fazer o controle de fluxo de dados , mas não se preocupe em saber agora para que servem e como funcionam todos esses pinos.
Em nossas aplicações iremos utilizar somente 3 pinos (TX, RX e GND) e, se pensarmos na nossa impressora, teremos a conexão em termos de dados (sem considerar as linhas de controle) utilizando apenas uma linha RX dela, que recebe os dados do pino TX do PC (figura 6 ), onde o TX é a linha de transmissão, RX a linha de recepção e o Terra a linha de referência.
Utilização de apenas uma linha da impressoras.
E como iremos transmitir os dados empregando somente um fio ? Para passar um byte (8 bits) temos que passar um bit de cada vez em função do tempo: primeiro o bit correspondente a D0, depois a D1, e assim por diante até chegar ao correspondente a D7 . Observe a figura 7 onde se mostra a transmissão do caractere ASCII "1" (31 em hexadecimal e 0011 0001 em binário) note que além dos dados temos o START BIT e STOP BIT.
Transmissão do caracteres ASCII "1".
Esses bits são necessários para controlar a nossa transmissão para sabermos quando um dado está iniciando a transmissão ou sua finalização . Vale salientar que os níveis de tensão em comparação com os níveis lógicos estão invertidos . Como lembrete, se medirmos uma transmissão de um nível lógico zero teremos +12 volts e para nível lógico 1 teremos -12 volts; portanto, se você for medir diretamente no conector do PC não se esqueça que as tensões estão invertidas em relação aos níveis lógicos.
Chega de teoria e vamos realizar algo prático. Para iniciar, vamos fazer um conector de "loop back", ou seja, ligar o pino de transmissão com o de recepção conforme a figura 8.
Conexão de "loop back".
Com isso conseguiremos fazer o nosso computador se comunicar com ele mesmo, pois estamos ligando a linha de TX com a de RX.
No ambiente LOGO execute o programa mostrado no código-fonte 2, ao lado.
Observe que no terminal da janela de comandos aparece o resultado, indicado abaixo do código-fonte.
Analisando o nosso programa, temos a instrução abraporta "com1 que reserva o recurso da porta serial para o LOGO. Caso ela já esteja aberta, aparecerá uma indicação de erro. Nessa situação use o comando de fecheporta.
A instrução mudemodoporta "com1:9600,n,8,1, configura a porta serial para 9600 bits por segundo, ª sem paridade , 8 bits por caracter e 1 stop bit.
Já as instruções escrevacaractereporta escreveram os caracteres 1, 2 e 3 na porta serial; note que essa instrução retorna um valor O em caso de erro de escrita ou 1 em caso de sucesso. Por isso temos a instrução completa como atribua "y escrevacaractereporta ascii "1 que irá transmitir o caracter 1 em ASCII e atribuirá em y 0 valor do retorno da escrevacaracterporta . Então, até aqui transmitimos os caracteres, depois da instrução espere 60 teremos a instrução leiacaractereporta, que vai ler os caracteres que foram transmitidos e estão armazenados no buffer da porta serial.
Caso não haja nenhum caractere para ser lido no buffer da serial, a função leiacaractereporta retoma -1. Repare que essa instrução está em um loop de 10 e dentro dele temos a instrução de leitura da porta, e caso o retorno não seja -1, o dado lido será escrito no terminal da janela de comandos.
Para finalizar temos o comando fecheporta, que irá fechar as portas que estejam abertas.
Apesar do programa acima funcionar em um único computador com um conector de loop back, idealizamos outro programa (listado no código-fonte 3) que interliga 2 computadores, mas que pode ser executado também em um único PC usando o conector de "loop back".
Executando o programa comando-serial teremos uma janela conforme a figura 10.
Além dos botões de LIGA e DESLIGA temos duas áreas de dados, uma local e outra remota . A local representa o dado recebido do PC Remoto, se o botão de LIGA ou Desliga foi acionado . Analisando o programa, percebemos que ele envia um numero decimal 1 pela serial quando pressionamos o botão LIGA , e nesse momento escreve no estático do Dado Remoto um X.
Para o botão de DESLIGA temos o mesmo procedimento, só que o dado enviado será um 0 (zero) e no estático do Dado Remoto irá escrever um espaço em branco.
O programa comando_serial, portanto, somente envia dados pela serial, mas nele ativamos um temporizador através do comando ativetemporizador 1 2000 [vê_serial]. Note que colocamos um tempo alto de 2000 milissegundos (2 segundos), mas você poderá alterá-lo ao seu gosto, lembrando-se de que, caso haja algum problema com a serial, irá aparecer uma janela de erro a cada chamada da vê_serial , que no nosso exemplo é de 2 segundos. Tempo suficiente para acionar o botão de Fim e desativar o temporizador.
A função de ve_serial é a que lê os dados recebidos quando se recebe um dado, ela vê e se for 1 escreve X no estático de Dado_Local, se for 0 (zero) escreve um espaço em branco.