Delhpi 7 só envia e recebe na serial em modo TRACE (F7)
bom dia a todos. Estou com o seguinte cenário:
tenho que enviar uma mensagem para um microcontrolador ("enviar") e quando recebe a mensagem envia de volta uma sequência de caracteres (seria o meu protocolo).
o problema é que isso só funciona quando eu rodo o programa no modo TRACE. daí eu verifico que ele envia corretamente, o outro lado responde, ele recebe a sequencia de caracteres sem problema nenhum.
agora eu utilizo API, porém o mesmo acontece com o componente TComPort.
segue abaixo o código que estou utilizando pra ver se alguém já passou por isso e me dá uma luz.
procedure TFmPrincipal.Button9Click(Sender: TObject);
var
H : THandle;
vI : integer;
vS : String;
BytesEscritos : DWORD;
TamaString : integer;
BufferEnvia : AnsiString;
begin
H := AbrePorta('COM7');
if H > 0 then
try
BufferEnvia := 'enviar';
TamaString := Length(BufferEnvia);
WriteFile(H,PChar(BufferEnvia)^,TamaString,BytesEscritos,nil);
vI := 0;
SetLength(vS, 300);
while vI < 300 do
begin
if FileRead(H, vS[vI+1], 1) = 1 then
Inc(vI)
else Break;
end;
SetLength(vS, vI);
ShowMessage(vS);
finally
FileClose(H);
end;
end;
function TFmPrincipal.AbrePorta(Porta: Pchar): THANDLE;
var
dcbPar : TDCB;
Timeouts : TCOMMTIMEOUTS;
begin
Result := CreateFile(Porta, GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);
if Result = INVALID_HANDLE_VALUE then
Result := 0;
if Result = 0 then
Exit;
try
if not GetCommState(Result, dcbPar) then
Abort;
dcbPar.BaudRate := CBR_9600;
dcbPar.ByteSize := 8;
dcbPar.Parity := NOPARITY;
dcbPar.StopBits := ONESTOPBIT;
if not SetCommState(Result, dcbPar) then
Abort;
if not GetCommTimeouts(Result, Timeouts) then
Abort;
Timeouts.ReadIntervalTimeout := 2;
if not SetCommTimeouts(Result, Timeouts) then
Abort;
except
FileClose(Result);
Result := 0;
end;
end;
tenho que enviar uma mensagem para um microcontrolador ("enviar") e quando recebe a mensagem envia de volta uma sequência de caracteres (seria o meu protocolo).
o problema é que isso só funciona quando eu rodo o programa no modo TRACE. daí eu verifico que ele envia corretamente, o outro lado responde, ele recebe a sequencia de caracteres sem problema nenhum.
agora eu utilizo API, porém o mesmo acontece com o componente TComPort.
segue abaixo o código que estou utilizando pra ver se alguém já passou por isso e me dá uma luz.
procedure TFmPrincipal.Button9Click(Sender: TObject);
var
H : THandle;
vI : integer;
vS : String;
BytesEscritos : DWORD;
TamaString : integer;
BufferEnvia : AnsiString;
begin
H := AbrePorta('COM7');
if H > 0 then
try
BufferEnvia := 'enviar';
TamaString := Length(BufferEnvia);
WriteFile(H,PChar(BufferEnvia)^,TamaString,BytesEscritos,nil);
vI := 0;
SetLength(vS, 300);
while vI < 300 do
begin
if FileRead(H, vS[vI+1], 1) = 1 then
Inc(vI)
else Break;
end;
SetLength(vS, vI);
ShowMessage(vS);
finally
FileClose(H);
end;
end;
function TFmPrincipal.AbrePorta(Porta: Pchar): THANDLE;
var
dcbPar : TDCB;
Timeouts : TCOMMTIMEOUTS;
begin
Result := CreateFile(Porta, GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);
if Result = INVALID_HANDLE_VALUE then
Result := 0;
if Result = 0 then
Exit;
try
if not GetCommState(Result, dcbPar) then
Abort;
dcbPar.BaudRate := CBR_9600;
dcbPar.ByteSize := 8;
dcbPar.Parity := NOPARITY;
dcbPar.StopBits := ONESTOPBIT;
if not SetCommState(Result, dcbPar) then
Abort;
if not GetCommTimeouts(Result, Timeouts) then
Abort;
Timeouts.ReadIntervalTimeout := 2;
if not SetCommTimeouts(Result, Timeouts) then
Abort;
except
FileClose(Result);
Result := 0;
end;
end;
Walter
Curtidas 0