Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Extraer n caracteres de una cadena (https://www.clubdelphi.com/foros/showthread.php?t=75220)

Panasys 05-08-2011 14:51:54

Extraer n caracteres de una cadena
 
Hola amigos, llevo una semana con algo que parece simple a la vista pero no lo es en los resultados :)

Les cuento, tengo una conexion serie con un aparato utilizando un componente ComPort, envio una cadena y el dispositivo me contesta con una cadena como esta: :0103100003006400000000000000000000000086. Hasta aca todo bien, el codigo es el siguiente:

Código Delphi [-]
procedure TFMain.Com_SerieRxChar(Sender: TObject; Count: Integer);
var
  Str           : String;
  SubWord1  : String;
  Word1       : Integer;
begin 
  Com_Serie.ReadStr(Str, Count);
  Str           := copy(Str, 10, 2);
  SubWord1 := '$' + Str;
  Word1      := strtoint(SubWord1 );;
  Memo1.text := Memo1.Text + inttostr(Word1);
End;

Str es la cadena que obtengo del dispositivo, que si la mando directamente al memo aparece correctamente y completa.

Ahora solo necesito esta parte de la cadena :0103100003006400000000000000000000000086, ya que esos dos caracteres representan un numero hexadecimal, por eso en SubWord1 le agrego el $ a la cadena y en Word1 lo paso de Str a Int para que me devuelva el valor, el hex va de 00 a ff por lo tanto voy a ir de 0 a 255 en el entero.

Cual es el problema? Que el copy me devuelve cualquier cosa, por momentos bien por momentos cualquier valor y no solo dos digitos puede darme 2, 4, 6 y hasta 8 digitos, eso hace que cuando lo paso a entero me da cualquier cosa.

El Memo1 solo esta para ver en tiempo real que esta diciendo, la app consulta cada segundo al dispositivo. Ya les digo que cuando muestro la cadena entera en el memo se ver perfecta y la comunicacion es correcta lo que no puedo hacer es extraer correctamente esos dos caracteres.

Un abrazo ! :D y gracias !!!

Muchos datos ? Mucha lata? Mucho Gre Gre para decir Gregorio? No sabia como explicarlo en menos palabras :p

Abrazos

Javier

escafandra 05-08-2011 15:33:17

Revisa si tu cadena tiene la longitud adecuada (mayor o igual a 10)...
Me llama la atención que marques en negrita los caracteres 9 y 10 y la instrucción sea Copy(Str, 10, 2);

¿No debería ser:?

Código Delphi [-]
if Length(Str) >= 10 then 
  SubWord1 := '$' + Copy(Str, 9, 2);

Saludos.

maeyanes 05-08-2011 15:51:52

Cita:

Empezado por escafandra (Mensaje 408621)
Revisa si tu cadena tiene la longitud adecuada (mayor o igual a 10)...
Me llama la atención que marques en negrita los caracteres 9 y 10 y la instrucción sea Copy(Str, 10, 2);

¿No debería ser:?

Código Delphi [-]
if Length(Str) >= 10 then 
  SubWord1 := '$' + Copy(Str, 9, 2);

Saludos.

Si tomas en cuenta el :, los caracteres si son el 10 y 11... :)

Saludos...

escafandra 05-08-2011 16:34:33

Cita:

Empezado por maeyanes (Mensaje 408622)
Si tomas en cuenta el :, los caracteres si son el 10 y 11... :)

Saludos...

Muy cierto maeyanes, la presvicia me jugó una mala pasada. :)

Saludos.

duilioisola 05-08-2011 16:37:57

Prueba enviando cada paso al memo, para ver donde se produce el error:

Código Delphi [-]
procedure TFMain.Com_SerieRxChar(Sender: TObject; Count: Integer);
var
  Str : String;
  SubWord1 : String;
  Word1 : Integer;
begin 
  Memo1.Lines.Clear;
  Memo1.Lines.Add('Inicio');

  Com_Serie.ReadStr(Str, Count);
  Memo1.Lines.Add('Str: '+Str);
  Memo1.Lines.Add('Count: '+IntToStr(Count));

  // Verifico que haya mas de 11 caracteres
  if Length(Str) >= 11 then
     Str := copy(Str, 10, 2)
  else
     Raise Exception.Create('Error al leer COM. No han llegado caracteres suficientes');
  Memo1.Lines.Add('copy(Str,10,2): '+Str);

  SubWord1 := '$' + Str;
  Memo1.Lines.Add('SubWord1: '+SubWord1);

  Word1 := strtoint(SubWord1 );;
  Memo1.Lines.Add('Word1: '+IntToStr(Word1));
end;

Panasys 05-08-2011 20:00:06

Exactamente amigo, el problema es que no me esta llegando la cadena completa que especifique mas arriba en el primer post.

Hace un rato hice lo que planteas y me di cuenta de eso, pero planteare en otro post el problema del ComPort.

Es un problema con el componente.

Y Escafandra tienes razon, era 9,2 la posicion del copy. Pero igual no funciona porque seguramente no estoy utilizando correctamente la libreria del puerto serie.

Muchísimas gracias por la ayuda, igual me sirvio para recorrerme el foro y aprenderme otras cosas !!!

Un abrazo


La franja horaria es GMT +2. Ahora son las 05:18:07.

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