TComPort + Delphi 2010
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á.
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
Curtidas 0
Melhor post
Itamar Souza
29/07/2014
Bom dia
Veja um exemplo, compara com o seu:
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;
GOSTEI 2
Mais Respostas
Emily Xavier
28/07/2014
UP :)
GOSTEI 0
Itamar Souza
28/07/2014
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;
GOSTEI 1
Emily Xavier
28/07/2014
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
GOSTEI 1
Paulo Freire
28/07/2014
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
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
GOSTEI 0
Jose Nascimento
28/07/2014
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.
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.
GOSTEI 0
Paulo Freire
28/07/2014
Dá uma olhada no exemplo.
https://onedrive.live.com/redir?resid=90738b8009a49b94!22467&authkey=!AO8ZKnLCewcZpxA&ithint=file%2crar
https://onedrive.live.com/redir?resid=90738b8009a49b94!22467&authkey=!AO8ZKnLCewcZpxA&ithint=file%2crar
GOSTEI 0