Ir al contenido


Foto

error en un ciclo repeat - until


  • Por favor identifícate para responder
8 respuestas en este tema

#1 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 01 diciembre 2008 - 10:17

Siguiendo con problemas,  :D :D :D

tengo esta cadena que se transmite continuamente

<STX>DDDDDDDDUMS<CR><LF><STX>DDDDDDDDUMS<CR><LF><STX>DDDDDDDDUMS<CR><LF><STX>DDDDDDDDUMS<CR><LF>

//<STX> Caracter de inicio
//DDDDDDDD Cadena de Datos
//UMS Señalizadores de 1 caracter c/u
//<CR> Fin de cadena
//<LF> No lo uso para fines practicos


Con un boton quiero capturar esa cadena desde el puerto serie (este ya está abierto y funcionando OK)



delphi
  1. procedure TfrmMain.Button1Click(Sender: TObject);
  2. var
  3.   n: integer;
  4.   num: byte;
  5.   Cad: string;
  6. begin
  7.   // Los datos se repiten y terminan con #13(CR)
  8.   repeat
  9.   repeat
  10.     until FileRead(HandlePuerto,Num,1)=1;
  11.   until Num=13; // Final de cadena anterior
  12.  
  13.   Cad:='I'; //Aqui deberia ser una cadena vacia. [u]El valor es solo por prueba[/u]
  14.  
  15.   //Aqui esperaria a capturar y llenar la variable Cad en este orden <LF><STX>DDDDDDDDUMS 
  16.   for n := 1 to 8 do
  17.     begin
  18.       repeat
  19.         until FileRead(HandlePuerto,Num,1)= 1; //lee un byte
  20.       Cad:=Cad + chr(Num);
  21.     end;
  22.  
  23.   Label1.Caption := Cad; //Muestra la lectura
  24. end;



Bueno, el detalle es que en la label1.caption solo obtengo I + el 7 caracter (p.e. <LF><STX>  104000UMS) = I4
He probado con diferentes valores de n pero no, los resultados on erroneos o simplemente se queda en el bucle. Debe ser una tontera pero no me puedo dar cuenta.
  • 0

#2 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 01 diciembre 2008 - 11:39

¡¡¡Este frio esta alentando mis neuronas!!!!

la cadena capturada empieza con un codigo de control <LF> o Linefeed y yo quiero ver esos datos en una etiqueta que no esta en autosize, pues no veia nada de lo que se capturaba porque la etiqueta iniciaba una segunda linea donde colocaba los datos. Ok ya corregi eso y ahora si funciona.

solo añadi al uses la unidad StrUtils y en la linea 22 coloque esto:



delphi
  1. Cad := MidStr(Cad,3,11); //solo selecciona DDDDDDDDUMS



Que conste en actas que la lucha se le hizo!!! :p
  • 0

#3 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 01 diciembre 2008 - 12:03

Hola
Me alegro que lo auto arreglaras.
Lo estuve viendo pero por supuesto no le llegue.
Saludos
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 01 diciembre 2008 - 12:58

^o| ^o| ^o|

<STX>DDDDDDDDUMS<CR><LF>
<STX>DDDDDDDDUMS<CR><LF>
<STX>DDDDDDDDUMS<CR><LF>
<STX>DDDDDDDDUMS<CR><LF>




delphi
  1. procedure TfrmMain.Button1Click(Sender: TObject);
  2. var
  3.   num: byte;
  4.   Cad: string;
  5. begin
  6.   // Los datos se repiten y terminan con #13(CR)
  7.   repeat
  8.     FileRead(HandlePuerto,Num,1)=1;
  9.     if chr(Num) = #2 then
  10.         Cad := ''
  11.     else begin
  12.               if Num >= 32 then
  13.                 Cad:=Cad + chr(Num);
  14.     end;
  15.   until Num = 13; // Final de cadena anterior
  16.   Label1.Caption := Cad; //Muestra la lectura
  17. end;



Salud OS
  • 0

#5 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 03 diciembre 2008 - 05:56

Jeje No habia visto tu respuesta, disculpas.

La estoy probando pero me da errores

1.  FileRead(HandlePuerto,Num,1) = 1; //espera un := y encontro =

2.  lo modifique asi:



delphi
  1. procedure TfrmMain.Button1Click(Sender: TObject);
  2. var  num: byte;  Cad: string;
  3. begin 
  4. // Los datos se repiten y terminan con #13(CR) 
  5. repeat   
  6.   repeat
  7.       until FileRead(HandlePuerto,Num,1)=1;
  8.   if chr(Num) = #2 then       
  9.     Cad := ''
  10.   else
  11.     begin             
  12.         if Num >= 32 then
  13.           Cad:=Cad + chr(Num);
  14.     end; 
  15. until Num = 13; // Final de cadena anterior 
  16. Label1.Caption := Cad; //Muestra la lectura
  17. end;



pero aqui se queda bloqueado el programa, no sale del ciclo. Esta comprobado que la cadena recibida cumple lo que se espera.
  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 03 diciembre 2008 - 08:02

Veamos amigo

la cadena viene asi

<STX>DDDDDDDDUMS<CR><LF>


Es lo mismo que

#2DDDDDDDDUMS#13#10


Pero aun no entiendo para que estas haciendo esto....



delphi
  1.   repeat
  2.   until FileRead(HandlePuerto,Num,1)=1;



Me imagino que lo que quieres es leer lo que te llega del puerto, me imagino que estas utilizando el componente ComPort, entonces porque no usas el evento OnRXChar de tu componente y te quitas de problemas.



delphi
  1. procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
  2. var
  3.   Cad: string;
  4. begin
  5.   Comport1.Readstr(Cad,Count);
  6.   Cad := StringReplace(Cad,#2,'',[rfReplaceAll]);
  7.   Cad := StringReplace(Cad,#10,'',[rfReplaceAll]);
  8.   Cad := StringReplace(Cad,#13,'',[rfReplaceAll]);
  9.   Label1.Caption := Cad; //Muestra la lectura
  10. end;



Salud OS



  • 0

#7 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 04 diciembre 2008 - 09:40

jajajaja no!, no estoy usando ComPort (ahi es mas facil usar el ComPacket que el RxChar para cadenas de estructura fija), estoy usando una estructura DCB que permite a windows accesar al puerto serie.

El porque de usar nuevamente un ciclo Repeat Until es por la razon que menciono en el primer punto del mensaje anterior



delphi
  1. FileRead(HandlePuerto,Num,1) = 1; //espera un := y encontro =



si lo coloco en un repeat until desaparece el error, pero  se queda bloqueada la ejecucion del programa.

La razon de esto es conocer una forma mas de leer el puerto serie y como mencione en un post anterior quiero incluir ese acceso a una dll.

disculpa las molestias.
  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 04 diciembre 2008 - 11:59

y si mejor haces esto amigo



delphi
  1. procedure TfrmMain.Button1Click(Sender: TObject);
  2. var
  3.    S: string;
  4.   Cad: array[1..80] of Char;
  5.   BytesRead: integer;
  6. begin
  7.   if ReadFile (HandlePuerto, Cad, sizeof(Cad), BytesRead, Nil) then begin
  8.      s := '';
  9.      for i := 1 to BytesRead do begin
  10.          if ord(Cad[I]) > 32  then
  11.             s := s + Cad[I];
  12.      end;
  13.      Label1.Caption := Cad; //Muestra la lectura
  14.   end;
  15. end;



Salud OS
  • 0

#9 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 04 diciembre 2008 - 01:42

Pues no, sigue el error, ahora al intentar compilar me aparece:

[Error] UfrmMain.pas(171): Types of actual and formal var parameters must be identical


y se pone en rojo la linea de ReadFile y el cursor se posiciona antes de Nil

Estoy leyendo el http://msdn.microsof...467(VS.85).aspx pero no encuentro razon para ese error.


  • 0




IP.Board spam blocked by CleanTalk.