Informações sobre o curso.
RComAccess v1.0
Controle de Acesso
Por: Antônio Rogério Messias
Página 4 de 5   Ir para a página 3.  Home  Índice  Ir para a página 5.
CONECTANDO 8 TECLADOS NA PORTA SERIAL ATRAVÉS DE UM MICROCONTROLADOR PIC 16F877 PARA CONTROLE DE ACESSOS.
Para uso particular ou educacional.
Copyright(c) 1999-2006 ROGERCOM.COM
Todos os direitos reservados.


PROGRAMA (para testar o circuito)


       Para acessar a Porta Serial iremos utilizar algumas funções da API do Windows que tornam nossos programas compatíveis com as versões 95/98/Me/NT/2000 e XP. Serão mostrados códigos escritos em Delphi e C++.
       Para aqueles que não desejam programar em nível de API, podem fazer download do componente Tcomport para Delphi versões 4 e 5, escrito por Dirk Claessens. Esse componente torna bastante fácil a programação da Porta Serial, tanto para receber e enviar dados, como também para controlar sinais RTS, CTS, DTR e outros.
       O programa exibido na figura abaixo não é um gerenciador de acessos, mas sim, um programa com o objetivo de testar toda a funcionalidade do circuito. Ele disponibiliza todas as funções necessárias para que qualquer Analista/Programador possa desenvolver um software aplicativo robusto, tanto em Delphi como em C++. Todos os códigos fonte estão disponíveis para download no final desta página.

Figura 32 - Tela do programa para testar o projeto RComAccess

       Na janela de edição (TX) do programa acima, pode-se digitar quantas strings de comandos desejar, desde que sejam separadas por uma nova linha (pressionando Enter no final de cada string).



Algumas das funções da API do Windows usadas nos programas aqui apresentados, com o objetivo de acessar a Porta Serial:


CreateFile()
Utilizada para abrir a Porta Serial.

CloseHandle()
Utilizada para fechar a Porta Serial.

ReadFile() e WriteFile()
Utilizadas para lê e enviar dados através da Porta Serial.

GetCommState()
e SetCommState()
Utilizadas para obter e alterar as configurações da Porta Serial, como velocidade, bit de dados, paridade etc.

BuildCommDCB()
Utilizada para preencher os campos da estrutura DCB com valores especificados numa string de controle de dispositivos.

GetCommTimeouts() e SetCommTimeouts()
Utilizadas para obter e alterar os parâmetros atuais de Timeouts associados às funções WriteFile() e ReadFile();

Exemplo 1 - Uso da função CreateFile() da API do windows
 
   HANDLE  hCom; // Handle para a Porta Serial (identificador).
   char *NomePorta = "COM1";  //COM1, COM2...COM9 ou portas virtuais "\\.\COMx".

   hCom = CreateFile(
                                  NomePorta,   //Nome da porta.
                                  GENERIC_READ | GENERIC_WRITE,   //Para leitura e escrita.
                                  0,       //(Zero) Nenhuma outra abertura será permitida.
                                  NULL,  //Atributos de segurança. (NULL) padrão.
                                  OPEN_EXISTING,  //Criação ou abertura.
                                  0,         //Entrada e saída sem overlapped.
                                  NULL     //Atributos e Flags. Deve ser NULL para COM.
                               );

   if(hCom == INVALID_HANDLE_VALUE)
      return false;   //Erro ao tentar abrir a porta especificada.

       A função CreateFile() da API do windows é responsável pela abertura da Porta Serial. Ela aceita vários parâmetros, sendo que o primeiro é o nome da porta "COM1", "COM2", etc. O segundo especifica o tipo de acesso: leitura (GENERIC_READ), escrita (GENERIC_WRITE) ou leitura e escrita (GENERIC_READ | GENERIC_WRITE), o caracter "|" representa o operador (OR) e sua função no Exemplo 1 é combinar as duas constantes formando um novo valor. O terceiro parâmetro especifica o compartilhamento, se for definido como 0 (zero), a Porta não será compartilhada, ou seja, enquanto seu programa estiver usando a Porta Serial nenhum outro poderá abri-la. Os outros parâmetros serão usados como padrão.
       hCom é uma variável do tipo HANDLE (identificador) que armazenará todas as informações necessárias sobre o dispositivo aberto, no nosso caso, a Porta Serial. Essa variável será utilizada como parâmetro para as funções que irão configurar, alterar, lê e escrever a Porta Serial.
       Se houver algum tipo de erro na abertura da Porta Serial, a função CreateFile() retornará um valor do tipo
INVALID_HANDLE_VALUE para a variável hCom.  Portanto, é imprescindível que o programa teste a variável hCom para checar se houve erro, antes de usar as demais funções de acesso a Porta Serial.


Exemplo 2 - Uso das funções GetCommState() e SteCommState()
  DCB dcb//Estrutura DCB é utilizada para definir todos os parâmetros da comunicação.

  if!GetCommState(hCom, &dcb))
     return false;  //// Erro na leitura de DCB.

   dcb.BaudRate = CBR_19200;
   dcb.ByteSize = 8;
   dcb.Parity = NOPARITY;
   dcb.StopBits = ONESTOPBIT;


   //Define novo estado.
   if( SetCommState(hCom, &dcb) == 0 )
      return false;   //Erro.

       As funções GetCommState() e SetCommState() trabalham juntas e têem como objetivos obter as configurações atuais da Porta Serial depositadas na estrutura DCB, como também alterar seus atributos.
       Para mudar as configurações atuais da Porta Serial pode-se usar o código do Exemplo 2, ou mesmo o código do Exemplo 3, sendo este mais simples.

Exemplo 3 - Uso das funções GetCommState(), SetCommState() e BuildCommDCB()

  DCB dcb//Estrutura DCB é utilizada para definir todos os parâmetros da comunicação.

  if!GetCommState(hCom, &dcb))
     return false;  //// Erro na leitura de DCB.


  BuildCommDCB("19200,N,8,1", &dcb); //Atribui os valores a estrutura dcb.

   //Define novo estado.
  if( SetCommState(hCom, &dcb) == 0 )
      return false;   //Erro.

       No exemplo acima, a função BuildCommDCB() atribuir a string "19200,N,8,1" a membros específicos da estrutura DCB.

Tabela 4 - Constantes e valores da API do Windows (TM) utilizadas para configurar a Porta Serial
BaudRate
Velocidade
ByteSize
Tamanho dos dados
Parity
Paridade
StopBits
Bits de parada
CBR_110
CBR_38400
5
EVENPARITY  (par)
ONESTOPBIT   (1)
CBR_300
CBR_56000
6
MARKPARITY (marca)
ONE5STOPBITS   (1.5)
CBR_600
CBR_57600
7
NOPARITY  (nenhuma)
TWOSTOPBITS   (2)
CBR_1200
CBR_115200
8
ODDPARITY  (ímpar)
CBR_2400
CBR_128000
CBR_4800
CBR_256000
CBR_9600
CBR_14400
CBR_19200


Exemplo 4
- Uso da função GetCommTimeouts() e GetCommTimeouts()

   COMMTIMEOUTS CommTimeouts;

   if( GetCommTimeouts(hCom, &CommTimeouts) == 0 )
       return false;   //Erro.

    //Define novos valores.
   CommTimeouts.ReadIntervalTimeout = 2;
   CommTimeouts.ReadTotalTimeoutMultiplier = 0;
   CommTimeouts.ReadTotalTimeoutConstant = 2;
   CommTimeouts.WriteTotalTimeoutMultiplier = 5;
   CommTimeouts.WriteTotalTimeoutConstant = 5;

   if( SetCommTimeouts(hCom, &CommTimeouts) == 0 )
      return false;   //Erro.

       As funções GetCommTimeouts() e SetCommTimeouts() trabalham juntas e têem como objetivos obter e modificar as configurações atuais dos timeouts da Porta Serial. Quaisquer mudanças nos valores dos atributos da estrutura COMMTIMEOUTS afetarão consideravelmente os tempos de leitura e escrita na Porta Serial. Os valores de tempos definidos no Exemplo 4 foram os mais adequados para ler a placa controladora de acessos. Outros valores podem ser testados.

Exemplo 5 - Uso da função ReadFile()
   #define LEN_BUFFER  100; //Define o tamanho do buffer.

   DWORD BytesLidos = 0;
   char BufferRecebe[LEN_BUFFER];
  //Para armazenar a string a ser lida.

   ReadFile( hCom, BufferRecebe, LEN_BUFFER, &BytesLidos, NULL );

       É através da função ReadFile() que é feita a leitura dos dados que chegam na Porta Serial. Esta função aceita 5 parâmetros, sendo o primeiro (hCom) o identificador da Porta Serial retornado na abertura da mesma através da função CreateFile(). O segundo é um buffer, ou seja, é um local temporário na memória onde os dados lidos da Porta Serial serão armazenados. O terceito informa à função ReadFile(), qual o tamanho do buffer de dados (BufferRecebe). O quarto é uma variável do tipo ponteiro inteiro longo, onde a função ReadFile() armazenará a quantidade exata de bytes lidos. O quinto e último é um ponteiro para uma estrutura "overlapped", no nosso caso não será utilizada, portanto definimos este parâmetro com (NULL).
       A cada chamada à função
ReadFile(), os dados lidos da Porta Serial são armazenados na variável BufferRecebe, e a quantidade total de bytes são armazenados na variável BytesLidos.

Exemplo 6 - Uso da função WriteFile()
   #define LEN_BUFFER  100; //Define o tamanho do buffer.

    DWORD BytesEscritos = 0;
   int TamaString;    //Para armazenar o tamanho da String.
   char BufferEnvia[LEN_BUFFER];    //Para armazenar a string a ser enviada.
   strcpy(BufferEnvia, "CMD05#1#025\r\n");  //Prepara a string a ser enviada.
   TamaString = strlen(BufferEnvia); //Calcula o tamanho da string a ser enviada.

   WriteFile( hCom, BufferEnvia, TamaString, &BytesEscritos, NULL );

       É através da função WriteFile() que nossos programas enviam dados pela Porta Serial. Esta função aceita 5 parâmetros, sendo o primeiro (hCom) o identificador da Porta Serial retornado na abertura da mesma através da função CreateFile(). O segundo é um buffer, ou seja, é um local na memória onde deverá está depositados os dados a serem enviados para a Porta Serial. O terceiro informa à função WriteFile() qual o tamanho do buffer de dados (BufferEnvia). O quarto é uma variável do tipo ponteiro inteiro longo, onde a função WriteFile() armazena a quantidade exata de bytes escritos. O quinto e último é um ponteiro para uma estrutura "overlapped", no nosso caso não será utilizada, portanto definimos este parâmetro com (NULL).
       A cada chamada à função
WriteFile(), os dados armazenados no buffer (BufferEnvia) serão enviados para Porta Serial.

Exemplo 7 - Uso da função CloseHandle()
   CloseHandle( hCom );  //Fecha a porta aberta anteriormente por CreateFile().

       A função CloseHandle() fecha a Porta Serial aberta pela função CreateFile(), disponibilizando-a para que outros programas possam acessá-la normalmente.



 Obs.: As funções ReadFile() e WriteFile() devem ser chamadas a partir de Threads (linhas de execução ou processos que rodam paralelo ao programa). Assim obtém-se uma boa performance de programas que trabalham com a Porta Serial.


DETECTANDO AS PORTAS SERIAS INSTALADAS NO WINDOWS E ADICIONANDO-AS NUM "ComboBox"

       O programa abaixo acessa os registros do windows para descobrir quais os nomes das portas seriais estão instaladas no sistema. Os nomes das portas estão armazenadas na chave:

       HKEY_LOCAL_MACHINE> HARDWARE\\DEVICEMAP\\SERIALCOMM

Fonte 1 - Programa que detecta as portas seriais instaladas no sistema windows
 #include <vcl\registry.hpp> //É necessário incluir esse arquivo para disponibilizar TRegistry.

 //---------------------------------------------------------------------------------------------------------------
 void __fastcall TForm1::FormCreate(TObject *Sender)
 {
     TRegistry *Registro = new TRegistry; //Cria e aloca espaço na memória para o objeto.
     TStringList *Lista = new TStringList; //Cria e aloca espaço na memória para o objeto.

     Registro->RootKey = HKEY_LOCAL_MACHINE; //Define chave raiz.
     Registro->OpenKey("HARDWARE\\DEVICEMAP\\SERIALCOMM", false); //Abre a chave.
     //Obtém uma string contendo todos os nomes de valores associados com a chave atual.
     Registro->GetValueNames(Lista);

     //Count é a quantidade de portas instaladas no sistema.
     for(int indice=0; indice <= Lista->Count-1; indice++)
         //Pega nos nomes das portas e ediciona-as no ComboBox1.
         Form1->ComboBoxPorta->Items->Add(Registro->ReadString( Lista->Strings[indice] ) );

     if( Form1->ComboBoxPorta->Items->Count > 0)  //Se há ítens.
         Form1->ComboBoxPorta->ItemIndex = 0; //Exibir o primeiro nome da porta no ComboBox.
     Lista->Free();    //Libera memória.
     Registro->CloseKey();    //Fecha a chave.
     Registro->Free();    //Libera memória.
}

Figura 33 - Exemplo do programa que detecta portas instaladas no sistema

 

Downloads dos arquivos fonte e programas apresentados neste artigo:

Download do RComAccess. Programa executável (RComAccess.exe).

Download . Código fonte do programa RComAccess escrito em C++ com funções da API do windows para testar o circuito.

Download. Código fonte do programa RComAccess escrito em DELPHI com funções da API do windows para testar o circuito.

Download. Código fonte do programa RComAccess escrito em DELPHI usando o componente TComport para testar o circuito.



Componente TComport para acessar a Porta Serial no Delphi 4 ou 5:

Escrito por: Dirk Claessens
Emails: dirk.claessens16@yucom.be
            dirk.claessens.dc@belgium.agfa.com

Para acessar o site e fazer download do componente, clique no link abaixo:

Download do componente TComport para Delphi. http://users.pandora.be/dirk.claessens2/software.htm

========================================================================================
Instalando o componente TComport no Delphi 4:
========================================================================================
Abra o compilador Delphi:

1) Clique no Menu Component  > Install Packages e depois no botão Add;
2) Selecione o arquivo compack.bpl e depois clique no botão OK;

Pronto, o componente TComport foi instalado na Aba Samples da palheta de componentes do Delphi.
Feche o Delphi sem salvar nada.

Para testar o componente, carregue o arquivo exemplo ExampUnit que veio junto quando você fez o download.

========================================================================================
Instalando o componente TComport no Delphi 5:
========================================================================================

Abra o compilador Delphi:

1) Clique no Menu Component  > Install Component... e depois clique na Aba Into New Package;
2) No campo "Unit file name:" clique no botão Browse e localize o arquivo comport.pas; clique no botão OK;
3) No campo "Package File name:" digite "ComPort"; depois clique no botão Browse e no botão "Abrir" ou OK;
4) Clique no botão Yes ou OK quantas vezes for necessário para finalizar a instalação;

Pronto, o componente TComport foi instalado na Aba Samples da palheta de componentes do Delphi.
Feche o Delphi sem salvar nada.

Para testar o componente, carregue o arquivo exemplo ExampUnit que veio junto quando você fez o download.
========================================================================================

Alguns sites interessantes para pesquisas sobre Comunicação/Porta Serial:

http://www.developers.demon.co.uk/serial.html
http://www.traverse.com/people/poinsett/bcbcomm.html
http://www.cpcug.org/user/clemenzi/technical/Languages/SerialIO.htm#references
http://www.camiresearch.com/Data_Com_Basics/RS232_standard.html
http://www.sc-systems.com/products/serialport/serialport.htm  (Java)
http://www.jcontrol.org/cgi-bin/makeframes.pl?http://www.jcontrol.org/tutorials/de/rs232.html  (Java)
http://www.codeguru.com/Cpp/I-N/network/serialcommunications/article.php/c2483 (Visual C++)
http://www.ontrak.net/linux.htm (C / LINUX)
http://msdn.microsoft.com/msdnmag/issues/02/10/netserialcomm/ (C#)
http://www.macoratti.net/vbserial.htm (Visual Basic)
http://www.codeworks.it/net/VBNetRs232.htm (VB.NET)
http://www.arcelect.com/rs232.htm
http://www.beyondlogic.org/serial/serial.htm
http://www.camiresearch.com/Data_Com_Basics/RS232_standard.html
http://www.poli.org/LDP-PT/HOWTO/Serial-HOWTO/Serial-HOWTO.html#toc14
http://venus.rdc.puc-rio.br/rmano/interfac.html
http://support.microsoft.com/default.aspx?scid=kb;en-us;823179&Product=vb6

 


Volta à página principal.
Página anterior. Próxima página.

Índice dos artigos.
http://www.rogercom.com
© Copyright, 1999-2006 ROGERCOM - Antonio Rogério Messias - rogercom@rogercom.com
Todos os Direitos Reservados - All Rights Reserved.