ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Comunicação - Porta Serial

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
Renato_Vaz
Novato
Novato


Registrado: Sábado, 17 de Dezembro de 2005
Mensagens: 5

MensagemEnviada: Ter Dez 20, 2005 5:54 pm    Assunto: Comunicação - Porta Serial Responder com Citação

Tenho que desenvolver um sistema que, através de uma das Portas Seriais, eu veja um PABX e ele consiga gerar um arquivo TXT. É basicamente um Tarifador Telefônico.
Por favor ajude que puder.

Renato Vaz de Campos Ribeiro
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
HelioMS
Membro Junior
Membro Junior


Registrado: Quinta-Feira, 9 de Dezembro de 2004
Mensagens: 380
Localização: Campo Grande MS

MensagemEnviada: Qua Dez 21, 2005 1:21 am    Assunto: Comunicação - Porta Serial Responder com Citação

eu tirei de um site sobre portas paralelas isto ai da uma visitada la quem sabe vc acha o q procuras o site e [url] www.rogercom.com[/url]

//Funções para leitura e escrita na Porta Paralela usando o DELPHI.
//Por: Antonio Rogério Messias
//Compile no DELPHI.
//www.rogercom.com
//rogercom@rogercom.com
//--------------------------------------------------------
unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;

Const
Base = $378; //Endereço base da porta LPT;
Dados = Base+0; //Endereço para escrita dos dados;
Status = Base+1; //Endereço para leitura dos dados;
Controle = Base+2; //Endereço para escrita;
DadosEPP = Base+4; //ou Base+0, lê e escreve no modo EPP.
BIT0 = $01; // 0000-0001
BIT1 = $02; // 0000-0010
BIT2 = $04; // 0000-0100
BIT3 = $08; // 0000-1000
BIT4 = $10; // 0001-0000
BIT5 = $20; // 0010-0000
BIT6 = $40; // 0100-0000
BIT7 = $80; // 1000-0000
type
TForm1 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
ButtonSair: TButton;
procedure Timer1Timer(Sender: TObject);
procedure ButtonSairClick(Sender: TObject);
private { Private declarations }
public { Public declarations }
end;

type
TPorta = class(TForm)
Function Recebe(PortaLpt:word):Byte; //Recebe byte da P.Paralela.
Procedure Envia(PortaLpt:word; Valor:byte); //Envia byte p/ a P.Paralela.
end;
var Form1: TForm1;
var Lpt: TPorta;
implementation
{$R *.DFM}
//-----------------------------------------------------------
Procedure TPorta.Envia(PortaLpt:word; Valor:byte);
begin
asm
mov dx,PortaLpt
mov al,Valor
out dx,al end;
end;
//-----------------------------------------------------------
Function TPorta.Recebe(PortaLpt:word):Byte;
Var ret:byte;
begin
asm
mov dx, PortaLpt
in al,dx
mov ret,al
end;
Recebe := ret;
end;
//-----------------------------------------------------------
procedure TForm1.Timer1Timer(Sender: TObject);
var Valor:Byte;
begin
Lpt.Envia(Controle,32); //Habilita leitura EPP.
Valor := not Lpt.Recebe(DadosEPP); //Lê o valor.
if (Valor and BIT0) = BIT0 then //Verifica estado do primeiro bit;
begin
Form1.Caption := \'Bit na posição 0 OK!\';
beep();
end
else if (Valor and BIT1) = BIT1 then //Verifica estado do segundo bit;
begin
Form1.Caption := \'Bit na posição 1 OK!\';
beep();
end
else if (Valor and BIT2) = BIT2 then //Verifica estado do terceiro bit;
begin
Form1.Caption := \'Bit na posição 2 OK!\';
beep();
end
else if (Valor and BIT3) = BIT3 then //Verifica estado do quarto bit;
begin
Form1.Caption := \'Bit na posição 3 OK!\';
beep();
end
else if (Valor and BIT4) = BIT4 then //Verifica estado do quinto bit;
begin
Form1.Caption := \'Bit na posição 4 OK!\';
beep();
end
else if (Valor and BIT5) = BIT5 then //Verifica estado do sexto bit;
begin
Form1.Caption := \'Bit na posição 5 OK!\';
beep();
end
else if (Valor and BIT6) = BIT6 then //Verifica estado do sétimo bit;
begin
Form1.Caption := \'Bit na posição 6 OK!\';
beep();
end
else if (Valor and BIT7) = BIT7 then //Verifica estado do oitavo bit;
begin
Form1.Caption := \'Bit na posição 7 OK!\';
beep( );
end;
end;
//-----------------------------------------------------------
procedure TForm1.ButtonSairClick(Sender: TObject);
begin
Lpt.Envia(Controle,0); //Desabilita leitura EPP.
Close; //Finaliza o programa.
end;
end.

_________________
Helio Carrilho Modesto Junior
Desenvolvedor Delphi/Flash
MSN: helio_consultor@hotmail.com
mailto: junior_jdt2003@yahoo.com.br
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
Renato_Vaz
Novato
Novato


Registrado: Sábado, 17 de Dezembro de 2005
Mensagens: 5

MensagemEnviada: Qua Dez 21, 2005 7:53 am    Assunto: Comunicação - Porta Serial Responder com Citação

Valeu HelioMS, pela dica. Já conhecia o Site do Roger, só não tinha pesquisado a fundo.
Vou testar a rotina que vc me enviou. Manterei contanto. Valeu mesmo. Very Happy
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
ricars01
Colaborador
Colaborador


Registrado: Quarta-Feira, 25 de Agosto de 2004
Mensagens: 1879
Localização: Itu/SP

MensagemEnviada: Qua Dez 21, 2005 8:43 am    Assunto: Comunicação - Porta Serial Responder com Citação

Não sei se vc reparou, mas a rotina que vc passou é para comunicação usando a porta PARALELA. Pra serial o discurso muda bastante


___________________________________________________
:yltype: [i] \"Programar também é uma expressão artística.\" [/i] :yltype:

_________________
<b>Nova assinatura em elaboração... ainda!! Esta é a versão "alfa"</b>
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário MSN Messenger
Renato_Vaz
Novato
Novato


Registrado: Sábado, 17 de Dezembro de 2005
Mensagens: 5

MensagemEnviada: Qua Dez 21, 2005 9:39 am    Assunto: Comunicação - Porta Serial Responder com Citação

Amigo RicarS01, realmente a dica que o amigo me enviou e para saida paralela. No site que me indicou ñ tem muito material sobre saida serial. Vc tem alguma informação q possa me auxiliar. Se tiver e puder me enviar ficarei muito agradecido.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
ianegitz
Aprendiz
Aprendiz


Registrado: Quarta-Feira, 14 de Setembro de 2005
Mensagens: 186

MensagemEnviada: Qua Dez 21, 2005 10:58 pm    Assunto: Comunicação - Porta Serial Responder com Citação

de uma olhada nesse site ali tem alguma coisa sobre porta serial

http://www.veloso.adm.br/download.asp
_________________
<marquee onmouseover="this.stop();" onmouseout="this.start();" direction="left" height="100" scrollAmount="2" scrollDelay="2"><font size = 1 face= "Verdana">Em Busca de Conhecimento<br><br>www.google.com.br
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
HelioMS
Membro Junior
Membro Junior


Registrado: Quinta-Feira, 9 de Dezembro de 2004
Mensagens: 380
Localização: Campo Grande MS

MensagemEnviada: Qui Dez 22, 2005 2:32 am    Assunto: Comunicação - Porta Serial Responder com Citação

Relamente eu postei errado mas naum seja por isso vai a certa
tem algumas rotinas pra [b] Portas Seriais[/b]


Código exemplo em Delphi para separar os comandos da string de controle:

Var
StrComandos : String;
InicioStr : String;
Teclado7 : String;
HaTeclaPress : String;
Sensores : String;
TecConectado: String;
FimStr : String;
StrValida : String;
IntSensores : Integer;
IntTecConectado : Integer;
Begin

StrComandos := "T08######9#1064001:"; //Armazena numa variável a string capturada pela Porta Serial.

InicioStr := Copy(StrComandos, 1, 3); //Obtém os 3 caracteres "T08" da string.
Teclado7 := Copy(StrComandos, 10, 1); //Obtém a tecla pressionada no teclado 7.
HaTeclaPress := Copy(StrComandos, 12, 1); //Pega info. se há tecla pressionada (1 ou 0).
Sensores := Copy(StrComandos, 13, 3); //Pega info. sobre os sensores.
TecConectado := Copy(StrComandos, 16, 3); //Pega info. sobre teclados conectados.
FimStr := Copy(StrComandos, 19, 1); //Obtém o caracter \':\' na posição 19.

StrValida := InicioStr + FimStr; //Concatena as strings formando "T08:"
IntSensores := StrToInt(Sensores); //Converte string para número.
IntTecConectado := StrToInt(TecConectado); //Converte string para número.
End;

Obs.: A função copy() extrai uma substring de uma string. A função StrToInt() converte uma string de caracteres númericos em um número inteiro.


Código exemplo em C++Builder para separar os comandos da string de controle:

String StrComandos;
unsigned int IntSensores;
unsigned int IntTecConectado;

StrComandos = "T08######9#1064001:"; //Armazena numa variável a string capturada pela Porta Serial.

String InicioStr = StrComandos.SubString(1, 3); //Obtém os 3 caracteres "T08" da string.
String Teclado7 = StrComandos.SubString(10, 1); //Obtém a tecla pressionada no teclado 7.
String HaTeclaPress = StrComandos.SubString(12, 1); //Pega info. se há tecla pressionada (1 ou 0).
String Sensores = StrComandos.SubString(13, 3); //Pega info. sobre os sensores.
String TecConectado = StrComandos.SubString(16, 3); //Pega info. sobre teclados conectados.
String FimStr = StrComandos.SubString(19, 1); //Obtém o caracter \':\' na posição 19.

String StrValida = InicioStr + FimStr; //Concatena as strings formando "T08:"
IntSensores = StrToInt(Sensores); //Converte string para número.
IntTecConectado = StrToInt(TecConectado); //Converte string para número.


Obs.: A função SubString() extrai uma substring de uma string. A função StrToInt() converte uma
string de caracteres númericos em um número inteiro.

Os exemplos abaixo testam se um determinado sensor está ligado ou não. Ou seja, se uma porta está aberta ou fechada.


Em DELPHI:

if (IntSensores AND 128) = 128 then //Verifica se o sensor 8 está ligado.
Label1.Caption := \'Sensor 8 ligado\' //Porta fechada.
else
Label1.Caption := \'Sensor 8 dsligado\' //Porta aberta.

if (IntSensores AND 32) = 32 then //Verifica se o sensor 6 está ligado.
Label1.Caption := \'Sensor 6 ligado\' //Porta fechada.
else
Label1.Caption := \'Sensor 6 dsligado\' //Porta aberta.


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 (ímpar) 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 (par)
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.





a tem um exemplo com fontes usando as API que eu te passei
Algumas das funções da API do Windows usadas nos programas aqui apresentados, com o objetivo de acessar a Porta Serial:


http://www.rogercom.com/PortaSerial/ControleAcesso/DELPHI-RComAccessAPI.zip


outro usando um componente de acesso


http://www.rogercom.com/PortaSerial/ControleAcesso/DELPHI-RComAccessComponente.zip


tudo isso ai no site do Rogercom ein....
mas espero ter ajudado
flw
_________________
Helio Carrilho Modesto Junior
Desenvolvedor Delphi/Flash
MSN: helio_consultor@hotmail.com
mailto: junior_jdt2003@yahoo.com.br
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB