Visual Basic 6 e a Comunicação Paralela e Serial


Antes de começar quero deixar claro que eu não sou um profundo conhecedor do assunto Comunicação serial. Como nunca precisei fazer nada relacionado ao assunto confesso que não me sinto muito a vontade. Afinal eu não nasci sabendo e tenho muito o que aprender (graças a Deus...) por isso meu objetivo principal neste artigo e lançar as bases e os conceitos envolvidos na comunicação serial , indicando ferramentas e referências onde você vai encontrar muito material de ótima qualidade.

A comunicação paralela e a serial são muito usadas como forma de controlar uma grande variedade de equipamentos eletromecânicos e eletrônicos e você pode acreditar que não precisa conhecer C ou C++ para criar uma interface que lhe possibilite interagir com estes equipamentos ; você pode fazer isto usando o Visual Basic ( e até mesmo o Basic...)

Existem algumas limitações que VB possui e que você vai ter que aprender a contornar. O Visual Basic não pode acessar diretamente o hardware em um sistema . Toda requisição feita a um hardware precisa passar pelo sistema operacional , no nosso caso o Windows. Por causa disto o mais perto que você vai conseguir chegar quando tentar realizar uma comunicação serial é em um componente do VB que faz a interface com o Sistema Operacional. (Uma forma de contornar isto é usar as chamadas a API diretamente no seu programa VB.)

Um computador geralmente vem equipado com duas portas seriais e uma porta paralela para comunicação externa. A porta serial envia e recebe dados bit a bit enquanto que a porta paralela faz este serviço usando uma transmissões de múltiplos bits. Uma porta serial pode ser vista então uma interface entre um equipamento que exibe dados (Ex:Monitor ) e um equipamento que transmite dados (Ex:modem). 

A princípio uma porta serial era usada primariamente para exibir dados em um terminal que eram entrados via teclado , mas com o avanço da tecnologia a utilização da porta serial foi sendo usada nas mais variadas aplicações. (Ex: transferência de dados entre Handhelds como o Palm). Nos tempos do bom e velho DOS (lembra dele) tínhamos a interface da linha de comando que foi substituida por uma interface mais amigável com o advento do Windows e do Visual Basic.

O Visual Basic utiliza o componente - Microsoft Common Control : MSComm (MSCOMM32.OCX) para realizar a interface serial. Vamos então começar logo com um exemplo ( se bem que não muito prático):

- Objetivo :  Exibir o texto digitado em um terminal conectado na porta serial do computador. (Naturalmente a parte do código referente ao terminal deverá ser implementada para receber e exibir os caracteres)

  1. Inicie um novo projeto do tipo Standard EXE
  2. No formulário padrão - form1 - insira os seguintes controles :  Label , dois CommandButton , uma caixa de texto , um frame e dois botões de opção . Conforme figura abaixo a esquerda:

O formulário principal da aplicação As propriedades do controle Mscomm

O código da aplicação é exibido a seguir :

Private Sub cmdEntra_Click()

   'Envia o texto para a porta COMM
 
 MSComm1.Output = txtEntra.Text + Chr(13)
End Sub


Private Sub OptHabilita_Click()
'Habilita a porta
MSComm1.PortOpen = True

'Configura Port como saida
MSComm1.Output = "CPA00000000" + Chr(13)
End Sub


Private Sub OptDesabilita_Click()

  ' Desabilita a porta serial
  MSComm1.PortOpen = False
End Sub


Private Sub cmdSair_Click()
End
End Sub
 

- O código ao lado é muito simples:

Após clicar no botão para habilitar a porta com ( que deve estar configurada conforme figura acima)

O usuário digita o texto na caixa de texto do formulário e toda a vez que pressionar a tecla ENTER os caracteres digitados serão enviados para a porta serial.

Você poderia ter configurado o controle MSComm via código. Abaixo um exemplo de configuração inserido no evento Load do formulário: (O nome do controle usado é MSComm1 )

Private Sub Form_Load()

   MSComm1.CommPort = 1

   MSComm1.Settings = "19200,n,8,1"

   MSComm1.PortOpen = True

   MSComm1.InputLen = 0

End Sub

Obs: Ao programar para estas interfaces lembre-se sempre de fazer um tratamento de erro em seu código e de usar o DoEvents no seu código.Ex:

Private Function PortaSerial()

Dim timer1

timer1 = Timer

Do While ( timer1 - Timer) > 0 And MSComm1.inBufferCount = 0

   DoEvents

Loop

If MSComm1.InBufferCount =0 then

   msgbox = "porta COM - tempo esgotado"

Endif

PortaSerial = MSComm1.input

End Function

O objetivo do código é apenas mostrar como é simples enviar dados para a porta serial.

Eu sei , eu sei , você ficou decepcionado , esperava mais , algo realmente prático , mas as aplicações práticas envolvendo  a porta serial interagem geralmente com um hardware que deve ser preparado para receber os comandos . Então eu vou dar alguns links onde existem aplicações práticas envolvendo as portas seriais , veja abaixo:

  1. Enviando dados para um Microcontrole - http://www.rentron.com/sending_data/htm
  2. Recebendo dados de um Microcontrole - http://www.rentron.com/receiving_data.htm

Vamos falar agora da porta paralela. A porta paralela é formada por três secções diferentes:

  1. linhas de dados - Existem 8 linhas de dados e elas são usadas para obter informação da porta.
  2. linhas de controle - A linhas de dados possuem 4 saidas e fornecem o controle de sinais para a impressora ( alimentação de papel ,etc..)
  3. linhas de status. - Há 5 saídas nas linhas de status e elas são padrão e só recebem informações. Permitem a comunicação da impressora com o computador informando erros.

Cada sessão é acessada pelo seu próprio endereço e atua de forma independente. O endereços são :

  1. Linhas de dados       -    888    378h
  2. LInhas de controle    -    890    37Ah
  3. Linhas de status      -     889   379h

Um resumo mais detalhado da porta paralela é dado abaixo:

36 pins 25 pins Nome Endereço Direção

2
3
4
5
6
7
8
9

32
13
12
10
11

1
14
31
36

 

2
3
4
5
6
7
8
9

15
13
12
10
11

1
14
16
17

 

Data line 0
Data line 1
Data line 2
Data line 3
Data line 4
Data line 5
Data line 6
Data line 7

Error
Select
PE
Ack
Busy

Strobe
Auto Feed
Init
SLCT IN

 

Basic Address , Bit 0
Basic Address , Bit 1
Basic Address , Bit 2
Basic Address , Bit 3
Basic Address , Bit 4
Basic Address , Bit 5
Basic Address , Bit 6
Basic Address , Bit 7

Basic Address +1 , Bit 3
Basic Address +1 , Bit 4
Basic Address +1 , Bit 5
Basic Address +1 , Bit 6
Basic Address +1 , Bit 7

Basic Address +2 , Bit 0
Basic Address +2 , Bit 1
Basic Address +2 , Bit 2
Basic Address +2 , Bit 3

 

Out
Out
Out
Out
Out
Out
Out
Out

In
In
In
In
In, Inverted

In / Out , Inverted
In / Out , Inverted
In / Out
In / Out , Inverted

 

E o que eu faço com isto , você pode estar perguntando ???  Ora bolas , você não quer usar a porta paralela ???

Para fazer isto você precisa saber o endereço da porta que você quer usar , o comando para acessar a porta e o número que você quer atribuir na porta. As portas trabalham com números que podem ser expressos em decimais , binários ou hexadecimais. Nos exemplos vou usar a forma decimal , ok !. Você opera a porta enviando um número que representa o padrão binário da saída física na porta. Por exemplo para definir as oito linhas de dados para 11111111 você vai enviar o número 255. Para definí-las para 00000000 será enviado 0. Note que os números são binários de oito dígitos e temos oito saídas.

Resumindo: Os dados que você obtêm e envia para a porta paralelas ( LPT )  são sempre binários :

Dec        Binário
 1  =  0000 0001  Linha de dados
 2  =  0000 0010  Linha de dados
 3  =  0000 0011  Linha de dados
 4  =  0000 0100  Linha de dados

E qual controle você usa para fazer isto ? Não tem !! é... , não tem . Você vai ter que usar algo que alguém desenvolveu para fazer isto. Felizmente existem gente boa por ai . Abaixo temos dois arquivos que você pode usar :(Eu não testei nenhum deles)

  1. VBASML.DLL - para VB 16 bits ( VB3 , VB4 -16)
  2. WIN95IO.DLL - para VB 32 bits ( VB5 , VB6)

Antes de pode usar qualquer uma das funções contidas nos arquivos DLL você deve declará-las ( lembra...). Você pode fazer isto em um módulo bas do seu programa VB.Assim:

Para 16bit VB (VBASM.DLL), use:

Declare Function vbInp Lib "VBASM.DLL" (ByVal nPort As Integer) As Integer
Declare Sub vbOut Lib "VBASM.DLL" (ByVal nPort As Integer, ByVal nData As Integer)

Para 32bit VB (WIN95IO.DLL), use:

Declare Sub vbOut Lib "WIN95IO.DLL" (ByVal nPort As Integer, ByVal nData As Integer)
Declare Sub vbOutw Lib "WIN95IO.DLL" (ByVal nPort As Integer, ByVal nData As Integer)
Declare Function vbInp Lib "WIN95IO.DLL" (ByVal nPort As Integer) As Integer
Declare Function vbInpw Lib "WIN95IO.DLL" (ByVal nPort As Integer) As Integer

Após fazer a declaração você terá acesso a dois comandos :

Mais detalhes ??? veja em :

  1. http://213.10.73.60/majosoft/vb/body_lpt_port.html
  2. http://www.aaroncake.net/eletronics/vblpt.htm

Espero que esta pequena introdução básica lhe mostre a luz no fim do túnel.

Nota: Se quiser algo relacionado para o VB.NET - veja o link : http://www.codeworks.it/net/VBNetRs232.htm

Até breve...

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti