GARANTIR DESCONTO

Fórum TComPort + Delphi 2010 #487092

28/07/2014

0

Boa tarde a todos, estou com um problema com o componente TComPort + Delphi 2010, acontece o seguinte, tenho uma aplicação que lê informações de uma interface USB, o componente faz a leitura perfeitamente, porém faz quebrada. Um exemplo, ao inves de ler em uma linha apenas: 55641000000000000000000088, o componente retorna quebrado este valor: assim: 555410
000000
0000
000000
0010

Preciso de um jeito de unir essas linhas, tornando uma só.. Alguém já trabalhou com este componente e já teve este problema?

Obrigada a todos desde já.
Emily Xavier

Emily Xavier

Responder

Post mais votado

29/07/2014

Bom dia

Veja um exemplo, compara com o seu:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ComPort1.Port:='COM1';
  ComPort1.Baud:=115200;
  ComPort1.DataBits:=8;
  ComPort1.Parity:=ComPort1.StrToParity('0');
  ComPort1.StopBits:=Comport1.StrToStopb('0');
  ComPort1.Open;
  ComPort1.Send('a');
  Comport1.ReceiveMode:=rmRAW;
  [COLOR="Red"]Comport1.ReceiveCallBack:= ComPort1ReceiveCallBack;[/COLOR]
end;

procedure TForm1.ComPort1ReceiveCallBack(Data: String);
begin
  showmessage(data);
end;

Itamar Souza

Itamar Souza
Responder

Gostei + 2

Mais Posts

29/07/2014

Emily Xavier

UP :)
Responder

Gostei + 0

29/07/2014

Itamar Souza

Testa este exemplo também:


procedure TfrmTeste.ComPort1RxChar(Sender: TObject; Count: Integer);
var
 Buffer : AnsiString;
 Contador: Integer;
begin
  // Define o valor do Time Out
  Sleep(500);
  // Confere o número total de bytes dentro do pacote enviado
  Contador := ComPort1.InputCount;
  // Lê o pacote enviado e armazena no Buffer
  ComPort1.ReadStr(Buffer, Contador);
  // Alimenta um campo Memo com os dados recebidos
  Memo1.Lines.Add((Buffer);
end;

Responder

Gostei + 1

29/07/2014

Emily Xavier

O meu código é assim, exatamente assim, porém a leitura vem separada, fiz, dentro da rotina ComPortRxChar uma junção do que o componente lê até atingir o tamanho da minha String, depois disso coloco no memo, porém ficou bem gambi, queria algo "Certo", vou testar teu primeiro exemplo. Obrigada
Responder

Gostei + 1

29/07/2014

Paulo Freire

Olá Emily eu estou usando APi do Windows. tive alguns problemas com componentes de terceiros, eu leio TAGs RFID de cartão, de brincos para gado aquele tipo gota. Estou tendo bons resultados, vu deixar o código caso queira testar.

Declaro essas funções depois do implementaion/uses

{
Objetivo: Abrir comunicação com a porta serial
Paramentros:
NomePorta = COM1,COM2,etc
ConfigPorta=2400,o,7,1 ou 9600,n,8,2 etc
Retorno:
True ou false
}
Function OpenComm(NomePorta, ConfigPorta: String):Boolean;
var BarDCB: DCB;
LastError: Cardinal;
CTimeOut: COMMTIMEOUTS;
begin
hComm:=CreateFile(PChar(NomePorta),GENERIC_READ+GENERIC_WRITE,
0, //not shared
nil, //no security
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, //+FILE_FLAG_OVERLAPPED
0 );
If hComm = INVALID_HANDLE_VALUE Then begin
ShowMessage('Porta Serial ' + NomePorta + ' não disponível. configure os paramentros da porta serial');
Result:=False;
Exit;
End;
// Configurar os Time Outs para a Porta
CtimeOut.ReadIntervalTimeout:=20;
CtimeOut.ReadTotalTimeoutConstant:=1;
CtimeOut.ReadTotalTimeoutMultiplier:=1;
CtimeOut.WriteTotalTimeoutConstant:=20;
CtimeOut.WriteTotalTimeoutMultiplier:=1;
iRet:=SetCommTimeouts(hComm, CTimeOut);
If Ord(iRet)= -1 Then begin
LastError:=GetLastError();
ShowMessage('Não é permitido configurar os Timeouts para esta porta ' + NomePorta + ' Erro: ' + Inttostr(LastError));
CloseHandle(hComm);
Result:=False;
Exit;
End;
iRet:=BuildCommDCB(PChar(NomePorta+':'+ConfigPorta), BarDCB);
If Ord(iRet)=-1 Then begin
LastError:= GetLastError();
ShowMessage('Não é permitido montar os parametros da Porta' + ConfigPorta + ' Erro: ' + Inttostr(LastError));
CloseHandle(hComm);
Result:=False;
Exit;
End;
iRet:=SetCommState(hComm, BarDCB);
If Ord(iRet)= -1 Then begin
LastError:= GetLastError();
ShowMessage('Não é permitido configurar os parametros da Porta' + ConfigPorta + ' Erro: ' + Inttostr(LastError));
CloseHandle(hComm);
Result:=False;
Exit;
End;
Result:=True;
End;
{
Objetivo: Fechar comunicação com a porta serial
Retorno:
True ou false
}
Function CloseComm: Boolean;
begin
Result:=CloseHandle(hComm);
End;

{
Objetivo: Ler dados na Porta serial
Retorno:
String
}
Function ReadComm: String;
var BytesLidos: DWord;
i: Integer;
ReadStr: String;
begin
iRet:=ReadFile(hComm, bRead[0], 255, BytesLidos, nil);
if ord(iRet)=-1 then exit;
ReadStr:='';
//IF bytesLidos > 0 then ShowMessage(inttostr(BytesLidos));
If BytesLidos > 0 Then
For I:=0 To BytesLidos - 1 do
ReadStr:=ReadStr + chr(bRead[i])
Else
FlushComm;
Result:=ReadStr;
End;


No meu FormShow:

if OpenComm('COM4','9600,n,8,2') then
begin
StatusBar1.Panels[1].Text := ' Lendo comunição serial na porta COM4/9600/N/8/2 !';
Timer1.Enabled:=True;
end else
begin
StatusBar1.Panels[1].Text := ' Não foi aberta a comunicação !';
Timer1.Enabled:=False;
end;


No Timer faço alguns tratamentos, tipo gravar log, abrir cancela, sei qualquer coisa.

var
strLida: String;


begin
strLida := ReadComm;
if length(StrLida)>0 then label1.Caption := strLida;

Edit1.Text := strLida;

Edit2.Text := StringToHex(strLida);

Edit3.Text := IntToStr(BinToInt(Edit2.Text));

Edit4.Text := Edit2.Text;

//GravaLog;
// CriaLog;
// Abre CancelaSerial01
// TocaSirene01
Responder

Gostei + 0

15/04/2015

Jose Nascimento

Olá Paulo Freire, tentei utilizar esse seu exemplo, porém não encontrei o que é a VAR "bRead" se puder ajudar me informando.

Outra dúvida que tive, será que funciona para qualquer windows ? Estou usando o winXP com Delphi 7 , provavelmente será o ambiente dos clientes que irão utilizar essas rotinas.

Desde já grato pela sua ajuda.

abs.




unit UCOMPortAPIWin;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;

type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
Edit1: TEdit;
procedure FormShow(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

//----------------------------------------------------------------------------
// Objetivo: Abrir comunicação com a porta serial
// Paramentros: NomePorta = COM1,COM2,etc
// ConfigPorta=2400,o,7,1 ou 9600,n,8,2 etc
// Retorno: True ou false
Function OpenComm(NomePorta, ConfigPorta: String):Boolean;
//----------------------------------------------------------------------------
// Objetivo: Fechar comunicação com a porta serial
// Retorno:True ou false
Function CloseComm: Boolean;
//----------------------------------------------------------------------------


var
Form1: TForm1;
hComm : Cardinal;

implementation

{$R *.dfm}

{ Objetivo: Abrir comunicação com a porta serial
Paramentros: NomePorta = COM1,COM2,etc
ConfigPorta=2400,o,7,1 ou 9600,n,8,2 etc
Retorno: True ou false }
Function OpenComm(NomePorta, ConfigPorta: String):Boolean;
var
BarDCB: DCB;
LastError: Cardinal;
CTimeOut: COMMTIMEOUTS;
iRet : LongBool;
begin
hComm := CreateFile(PChar(NomePorta),
GENERIC_READ+GENERIC_WRITE,
0, //not shared
nil, //no security
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, //+FILE_FLAG_OVERLAPPED
0 );

If hComm = INVALID_HANDLE_VALUE Then
begin
ShowMessage('Porta Serial ' + NomePorta + ' não disponível. configure os paramentros da porta serial');
Result:=False;
Exit;
End;

// Configurar os Time Outs para a Porta
CtimeOut.ReadIntervalTimeout :=20;
CtimeOut.ReadTotalTimeoutConstant :=1;
CtimeOut.ReadTotalTimeoutMultiplier :=1;
CtimeOut.WriteTotalTimeoutConstant :=20;
CtimeOut.WriteTotalTimeoutMultiplier :=1;

iRet := SetCommTimeouts(hComm, CTimeOut);

If Ord(iRet)= -1 Then
begin
LastError:=GetLastError();
ShowMessage('Não é permitido configurar os Timeouts para esta porta ' + NomePorta + ' Erro: ' + Inttostr(LastError));
CloseHandle(hComm);
Result:=False;
Exit;
End;

iRet:=BuildCommDCB(PChar(NomePorta+':'+ConfigPorta), BarDCB);

If Ord(iRet)=-1 Then
begin
LastError:= GetLastError();
ShowMessage('Não é permitido montar os parametros da Porta' + ConfigPorta + ' Erro: ' + Inttostr(LastError));
CloseHandle(hComm);
Result:=False;
Exit;
End;

iRet:=SetCommState(hComm, BarDCB);

If Ord(iRet)= -1 Then
begin
LastError:= GetLastError();
ShowMessage('Não é permitido configurar os parametros da Porta' + ConfigPorta + ' Erro: ' + Inttostr(LastError));
CloseHandle(hComm);
Result:=False;
Exit;
End;
Result:=True;
End;


{Objetivo: Fechar comunicação com a porta serial
Retorno:True ou false}
Function CloseComm: Boolean;
begin
Result:=CloseHandle(hComm);
End;

{Objetivo: Ler dados na Porta serial
Retorno:String}
Function ReadComm: String;
var
BytesLidos: DWord;
i: Integer;
ReadStr: String;
iRet : LongBool;
bRead : Variant;
begin
iRet:=ReadFile(hComm, bRead[0], 255, BytesLidos, nil);

if ord(iRet)=-1 then
exit;

ReadStr:='';

//IF bytesLidos > 0 then ShowMessage(inttostr(BytesLidos));
If BytesLidos > 0 Then
begin
For I:=0 To BytesLidos - 1 do
ReadStr:=ReadStr + chr(bRead[i])
end
else
FlushComm;

Result:=ReadStr;
End;

procedure TForm1.FormShow(Sender: TObject);
begin
if OpenComm('COM4','9600,n,8,2') then
begin
StatusBar1.Panels[1].Text := ' Lendo comunição serial na porta COM4/9600/N/8/2 !';
Timer1.Enabled:=True;
end
else
begin
StatusBar1.Panels[1].Text := ' Não foi aberta a comunicação !';
Timer1.Enabled:=False;
end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
strLida: String;
begin
// strLida := ReadComm;

Edit1.Text := ReadComm;
// if length(StrLida)>0 then
// label1.Caption := strLida;
//
// Edit1.Text := strLida;
//
// Edit2.Text := StringToHex(strLida);
//
// Edit3.Text := IntToStr(BinToInt(Edit2.Text));
//
// Edit4.Text := Edit2.Text;

//GravaLog;
// CriaLog;
// Abre CancelaSerial01
// TocaSirene01
end;

end.

Responder

Gostei + 0

27/04/2015

Paulo Freire

Dá uma olhada no exemplo.

https://onedrive.live.com/redir?resid=90738b8009a49b94!22467&authkey=!AO8ZKnLCewcZpxA&ithint=file%2crar
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar