Fórum TComPort + Delphi 2010 #487092
28/07/2014
0
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
Curtir tópico
+ 0Post mais votado
29/07/2014
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
Gostei + 2
Mais Posts
29/07/2014
Emily Xavier
Gostei + 0
29/07/2014
Itamar Souza
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
29/07/2014
Emily Xavier
Gostei + 1
29/07/2014
Paulo Freire
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
15/04/2015
Jose Nascimento
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
27/04/2015
Paulo Freire
https://onedrive.live.com/redir?resid=90738b8009a49b94!22467&authkey=!AO8ZKnLCewcZpxA&ithint=file%2crar
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)