Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ComPort Hex (https://www.clubdelphi.com/foros/showthread.php?t=93793)

ramonibk 06-03-2019 10:45:10

ComPort Hex
 
Buenos días señores/as.

tengo un problema que seguro que para los eruditos de este foro sera nimia. pero para mi me esta costando horrores.

estoy intentando comunicar con un tele-indicador. el cual hay que mandarle los datos en Hex. en formato

Código Delphi [-]
ComPort1.WriteStr(chr($61)+chr($62).....)

bueno hasta aquí todo bien.

el problema me viene cuando intento mandar el testo de un Edit. he intentado varios métodos pero no consigo que el formato adecuado.

Código Delphi [-]
function StringToHex(S: String): string;
var
 I: Integer;
begin
  Result:= '';
  for I := 1 to length (S) do
    Result:= Result + IntToHex(ord(S[i]),2);
end;


procedure TForm1.Button5Click(Sender: TObject);
Var
 Buffer : String;
begin
 Buffer := chr($0F)+chr($21)+chr($0E)+chr($01)+chr($5C); // Inicio del Paquete Fijo
 Buffer := Buffer + StringToHex(Edit1.Text);  // Texto a enviar.
 Buffer := Buffer + chr($20)+chr($20)+chr($03)+chr($08); // Fin del paquete Fijo
 ComPort1.WriteStr(Buffer);


end;
lo único que me pinta son los números correspondientes a cada carácter. y si en el Result le fuerso a pintar chr($. me lo pinta literalmente.
hay algún método para hacerlo.

un saludo.

Casimiro Notevi 06-03-2019 11:23:59

No he entendido bien el problema.
Si envías 'H'+'o'+'l'+'a' ¿qué muestra?

ramonibk 06-03-2019 11:36:38

Si envió
Código Delphi [-]
 Buffer := chr($0F)+chr($21)+chr($0E)+chr($01)+chr($5C); // Inicio del Paquete Fijo
 Buffer := Buffer +chr($54)+chr($65)+chr($78)+chr($74)+chr($6F);  // Texto a enviar.
 Buffer := Buffer + chr($20)+chr($20)+chr($03)+chr($08); // Fin del paquete Fijo
 ComPort1.WriteStr(Buffer);

El teneindicador me pinta "Texto"

Pero si lo hago

Código Delphi [-]
 Buffer := chr($0F)+chr($21)+chr($0E)+chr($01)+chr($5C)+chr($30)+chr($30)+chr($39)+chr($30)+chr($31)+chr($3A)+c  hr($20);
 Buffer := Buffer + StringToHex (Edit1.Text);
 Buffer := Buffer + chr($20)+chr($20)+chr($03)+chr($08)+ chr($AA)+chr($AA)+chr($09);

Siendo Edit1.Text := 'Texto'
lo que pinta es '546578746f' como decía literal.

y al forzar el Result

Código Delphi [-]
Result:= Result +'+chr($'+ IntToHex(ord(S[i]),2)+')';

me pinta

"+chr($54)+chr($65)+chr($78)+chr($74)+chr($6F)"

Casimiro Notevi 06-03-2019 12:00:33

No tengo un delphi a mano ahora mismo, pero creo que debes modificar tu función StringToHex.
Result:= Result + IntToHex(ord(S[i]),2);
Ahi devuelve: 546578746f
Tendría que devolver cada uno por separado, $54$65$78$74$6f

ramonibk 06-03-2019 12:33:25

ese es mi dilema.

como modificar
Código Delphi [-]
function StringToHex(S: String): string;
var
 I: Integer;
begin
  Result:= '';
  for I := 1 to length (S) do
    Result:= Result + IntToHex(ord(S[i]),2);
end;

ramonibk 06-03-2019 13:08:43

Resuelto
 
No se si es la forma mas ortodoxa pero lo he echo de esta manera

Código Delphi [-]
Var
 Buffer : String;
 Str : String;
 I : Integer;
 N : Integer;
begin
 Str := '';
 Buffer := chr($0F)+chr($21)+chr($0E)+chr($01)+chr($5C); // Inicio del Paquete Fijo
   for I := 1 to length (Edit3.Text) do
    Begin
      N := ord(Edit3.Text[i]);
      Buffer := Buffer + Chr($+N);
   End;
 Buffer := Buffer + chr($20)+chr($20)+chr($03)+chr($08); // Fin del paquete Fijo
 ComPort1.WriteStr(Buffer);

Un saludo.

bucanero 06-03-2019 19:15:56

Hola ramonibk

Según tu código esta parte solo te devuelve dentro de buffer exactamente la misma cadena que ya tienes en Edit3.text, sin ningún tipo de modificación
Cita:

Empezado por ramonibk (Mensaje 530949)

Código Delphi [-]
   for I := 1 to length (Edit3.Text) do
    Begin
      N := ord(Edit3.Text[i]);
      Buffer := Buffer + Chr($+N);
   End;

por lo que si te funciona con ese código, entonces te debería también de funcionar de esta otra forma:

Código Delphi [-]
 Buffer := chr($0F)+chr($21)+chr($0E)+chr($01)+chr($5C); // Inicio del Paquete Fijo
 Buffer := Edit3.text+ chr($20)+chr($20)+chr($03)+chr($08);

y aquí el código un poco mas optimizado:

Código Delphi [-]
const
  PckIni: string = #$0F#$21#$0E#$01#$5C;
  PckEnd: string = #$20#$20#$03#$08;

procedure enviar(const value: string)
begin
  ComPort1.WriteStr(PckIni + value + PckEnd);
end;

Un saludo


La franja horaria es GMT +2. Ahora son las 07:19:53.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi