Foros Club Delphi

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

JoseFco 23-02-2008 00:29:29

Serial Port
 
Hola Amigos.

Tengo el siguiente codigo.


Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
Comport1.Connected:=true;
Comport1.WriteStr('0200');
Comport1.Connected:=False;
end;
end.


Me explico. Yo quiero mandar dos hex 02 y 00 al puerto serial.Pero al correr este programita me da en el monitor que tengo de serial port eso mismo pero en ascii 30 32 30 30 y yo quiero que me de solo hex 02 00 .

La pregunta. Que estoy haciendo mal?

Gracias y un Saludo.

egostar 23-02-2008 00:33:46

Cita:

Empezado por JoseFco (Mensaje 268022)
Hola Amigos.

Tengo el siguiente codigo.


Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
Comport1.Connected:=true;
Comport1.WriteStr('0200');
Comport1.Connected:=False;
end;
end.


Me explico. Yo quiero mandar dos hex 02 y 00 al puerto serial.Pero al correr este programita me da en el monitor que tengo de serial port eso mismo pero en ascii 30 32 30 30 y yo quiero que me de solo hex 02 00 .

La pregunta. Que estoy haciendo mal?

Gracias y un Saludo.

Y si mandas esto

Código Delphi [-]
Comport1.WriteStr(#2#0);

Salud OS

JoseFco 23-02-2008 00:40:12

Un Saludo Egostar.

No pues el monitor dice que eso es exactamente lo que le hacia falta al codigo.

Un millon de gracias Carnal.:)

egostar 23-02-2008 00:48:42

Cita:

Empezado por JoseFco (Mensaje 268028)
Un Saludo Egostar.

No pues el monitor dice que eso es exactamente lo que le hacia falta al codigo.

Un millon de gracias Carnal.:)

Ah pues que bien que te sirvio, la cuestion es que en realidad estabas mandando 4 caracteres 0 2 0 0, pero cuando envias caracteres de control como son 00 (NULL), 02 (STX), 03 (ETX), 05 (ENQ), 06 (ACK), 21 (NAK), que son las mas comunes, es necesario enviarlos como te indique.

Salud OS

canvilem 23-02-2008 05:25:11

WriteStr
 
No utilices WriteStr porque lo que envías es un String. Seguro que tienes otra función para enviar tus Hex.

JoseFco 24-02-2008 01:02:25

Hola Canvilem.

La verdad estoy estudiando el comportamiento de un programita que me gustaria emular.Solo puedo leer la parte que corresponde a un micro que lo acompaña.La parte de la aplicacion esta escrita dice que en GUI para windows.Yo quiero hacer algo parecido pero en Delphi y es donde entra la tareita que me he puesto para comenzar con mi primer programita Delphi.(jajajaja nada facil pero esos retos me encantan).Para esto tengo algunas herramientas y todo el tiempo del mundo,(no me apura).La herramienta mas importante para esta primera etapa es esta.Serial con este programita puedo ver el protocolo entre el (target y su esclavo)Los hex esos 02 00 son los que manda el pc al micro OnCreate y espera que el micro le mande 48 69 2D 4C 4F 47 49 43 la aplicacion los compara y si son igual a lo que espera termina de habrir la aplicacion de lo contrario te daria un error " no establecio la comunicacion" algo asi.

Tengo que seguir estudiando el tema y espero, ir superando las etapas una por una.

Un Saludo.

JoseFco 24-02-2008 15:51:34

Hola Amigos.

Estoy tratando de recivir por el serial port una data y llevarla a un edit.Pero no lo logro.
Código Delphi [-]
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, CPort, StdCtrls;
type
  TForm1 = class(TForm)
    ComPort1: TComPort;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure ComPort1ReceiveCallBack(Data: String);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Comport1.Connected:=true;
Comport1.WriteStr(#2#0);
end;
 procedure TForm1.ComPort1ReceiveCallBack(Data: String);
begin
Edit1.Text:=(Data);
end;
 
end.

Que esta mal aqui?

Un Saludo.

egostar 24-02-2008 16:11:01

Cita:

Empezado por JoseFco (Mensaje 268261)
Hola Amigos.

Estoy tratando de recivir por el serial port una data y llevarla a un edit.Pero no lo logro.

Que esta mal aqui?

Un Saludo.

Bueno, tal vez no está mal, pero lo que creo que te falta es identificar en que momento recibes toda la cadena (desde principio a fin) desconozco ese componente que usas y no se su formato yo uso dos uno que se llama WSC (de pago) y el APro (Libre) y eso que requieres lo hace sin dificultades.

Salud OS

egostar 24-02-2008 16:20:57

Leyendo un hilo en ASM donde muestras una página con el ejemplo de un code delphi vi esto que me parecio particularmente curioso

Código Delphi [-]
Temperatura:=Ord(Data[1]);

Te recomiendo que hagas un trace de tu codigo y ver que es lo que tiene el String Data.

Salud OS

JoseFco 24-02-2008 16:24:47

Hola Egostar.

Creo entender la naturaleza del problema y a mi modo de entender.Es un problema de tiempo de ejecucion.Debo darle un tiempo entre el 02 y el 00 que mando al micro.
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
Comport1.Connected:=true;
Comport1.WriteStr(#2#0);
end;

En la aplicacion original se maneja un timer (12 mhz).
Existe alguna forma de frenar el tiempo de ejecucion de una aplicacion Delphi sin importar la velocidad del PC?
Se puede crear un edit donde se pueda crear el tiempo de ejecucion de una aplicacion?

Rodando este programita puedo ver que el micro no responde, esto lo veo en el monitor de serial port que utilizo.Y creo que al no tener un tiempo de retardo entre el 02 y el 00 el micro interpreta 0200 y el tiene que comparar primero 02 ejecutar una rutina luego 00 y determina que hacer en ese caso.( mandar 8 hex de retorno al serial port)

Un Saludo.

egostar 24-02-2008 16:26:51

Cita:

Empezado por JoseFco (Mensaje 268264)
Hola Egostar.

Creo entender la naturaleza del problema y a mi modo de entender.Es un problema de tiempo de ejecucion.Debo darle un tiempo entre el 02 y el 00 que mando al micro.
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
Comport1.Connected:=true;
Comport1.WriteStr(#2#0);
end;

En la aplicacion original se maneja un timer (12 mhz).
Existe alguna forma de frenar el tiempo de ejecucion de una aplicacion Delphi sin importar la velocidad del PC?
Se puede crear un edit donde se pueda crear el tiempo de ejecucion de una aplicacion?

Rodando este programita puedo ver que el micro no responde, esto lo veo en el monitor de serial port que utilizo.Y creo que al no tener un tiempo de retardo entre el 02 y el 00 el micro interpreta 0200 y el tiene que comparar primero 02 ejecutar una rutina luego 00 y determina que hacer en ese caso.( mandar 8 hex de retorno al serial port)

Un Saludo.

Puedes hacer esto

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
   Comport1.Connected:=true;
   Comport1.WriteStr(#2);
   Sleep(12);
   Comport1.WriteStr(#0);
end;

Salud OS

JoseFco 24-02-2008 17:58:37

Esto es lo que me da el monitor de serial port:

Com1 Opened
Baud Rate=56000
RTS Signal=False
DTR Signal=False
Line Control Change: None- 8- 1

Write 1 Bytes:
02
Write 1 Bytes:
00
Read 8 Bytes:
48 69 2D 4C 4F 47 49 43
Com1 Closed.

Eso es lo que me da el monitor al espiar entre el programa y el micro original.

El programita del micro esta configurado a interrumpir cualquier funcion y hacerle caso al serial port al recibir algo el lo compara y sigue una rutina en este caso al recibir 02 y luego de un tiempo (x) recibir el 00 el pasa a una rutina que manda al serial port de regreso esa cadena de 8 hex (que yo las puedo cambiar, todo lo que esta en el micro, lo puedo cambiar sin problemas, solo que despues de entender bien el funcionamiento de la aplicacion, cambiare algunas cosas del mismo.
En el programa original del pc utilizan como decia un "Target Clock" esto en un edit para poder alterarlo. En realidad el clock del micro no se lo pueden alterar por sofware, entonces entiendo que estan frenando por asi decirlo al pc y que los hex 02 y 00 entren en un tiempo de separacion que le de tiempo al micro de manipularlos, compararlos y tomar decicion de que hacer.

Un Saludo.

egostar 24-02-2008 18:08:40

Para hacer pausas entre cada envio se usa la función Sleep(), puedes ir jugando con los valores, tal vez tambien necesites hacer alguna pausa antes de leer el puerto.

Yo haría una pausa mas larga, por ejemplo 120 ms entre envio y envio y una pausa de 256 ms antes de leer el puerto.

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
   Comport1.Connected:=true;
   Comport1.WriteStr(#2);
   Sleep(120);
   Comport1.WriteStr(#0);
   Sleep(256);
end;

Salud OS

JoseFco 24-02-2008 19:01:52

Buano ya cambie el tiempo de Sleep a diferentes parametros y nada.Yo espero que el micro mande los 8 hex y puede que los este mandando.Lo que uso para monitoriar el serial port es un programa 100% software (no usa cables para nada.Solo monitorea las actividades del serial port y no que pasa en su pin de entrada.El micro no espera que el programa lo quiera recibir o no,el solo necesita recibir dos hex 02 y 00 entonces manda al serial port los 8 hex antes mencionados.Si el programa los espera los leeara sino se los pierde,pero el micro no entiende eso.La rutina del micro para mandar algo al puerto serial no esta en dependencia de si el pc los quiere leer o no.(yo entendiendo esto esperaba leerlos en el monitor)Pero si este fuera con cables y estubiera en otra pc los estaria mirando.Ahora si quiero ver si el micro los manda y como el monitor que tengo para ello solo me dira que es lo que el serial port esta recibiendo tendre que estar en la aplicacion al final de esos dos hex 02 y 00 que la aplicacion entre a leer el serial port.
Puede que siga confundido.

Un Saludo.

egostar 24-02-2008 19:16:35

Cita:

Empezado por JoseFco (Mensaje 268292)
Buano ya cambie el tiempo de Sleep a diferentes parametros y nada.Yo espero que el micro mande los 8 hex y puede que los este mandando.Lo que uso para monitoriar el serial port es un programa 100% software (no usa cables para nada.Solo monitorea las actividades del serial port y no que pasa en su pin de entrada.El micro no espera que el programa lo quiera recibir o no,el solo necesita recibir dos hex 02 y 00 entonces manda al serial port los 8 hex antes mencionados.Si el programa los espera los leeara sino se los pierde,pero el micro no entiende eso.La rutina del micro para mandar algo al puerto serial no esta en dependencia de si el pc los quiere leer o no.(yo entendiendo esto esperaba leerlos en el monitor)Pero si este fuera con cables y estubiera en otra pc los estaria mirando.Ahora si quiero ver si el micro los manda y como el monitor que tengo para ello solo me dira que es lo que el serial port esta recibiendo tendre que estar en la aplicacion al final de esos dos hex 02 y 00 que la aplicacion entre a leer el serial port.
Puede que siga confundido.

Un Saludo.

Vamos a hacer una prueba digamos "manual":

Abre hiperterminal, configura los parametros de comunicacion, envia el archivo que adjunto (Menú Transferir, Enviar Archivo de texto) y ve lo que regresa el dispositivo.

El primer hexa, contiene los dos caracteres 02 y 00, los otros son por separado.

Salud OS

egostar 24-02-2008 19:26:45

Una pregunta, veo que estas tratando de usar una velocidad de Baud Rate=56,000, pero.... acaso no será Baud Rate=57,600

Salud OS

JoseFco 24-02-2008 19:33:44

Yo nunca he usado hiperterminal, no tengo idea ni como hacerlo.Ahora bien tengo un RealTerm:Serial Capture Program y acabo de configurarlo a los parametros del micro, le puce los hex 02 00 seguidos y me dio la respuesta del micro con su cadena de 8 hex.luego los mande por separado manual en dos botones primero el 02 y luego el 00 y me dio la misma respuesta.El micro esta funcionando bien, al parecer es que el programa que uso de monitor como es por software si no mira actividad en el serial port no me lee nada.

Tengo que en la aplicacion delphi despues de mandarle esos hex estar recibiendo el serial port.

Creo que por eso no miro nada en el otro monitor.

JoseFco 24-02-2008 19:51:16

Ya cambie la velocidad tambien.

Cita:

Empezado por egostar (Mensaje 268301)
Una pregunta, veo que estas tratando de usar una velocidad de Baud Rate=56,000, pero.... acaso no será Baud Rate=57,600

Salud OS

El programita espia al rodar la aplicacion original con el micro me dice que es a 56,000 y puedo leer los 8 hex que retorna el micro.

egostar 24-02-2008 20:19:54

Hice un pequeño programa para capturar lo que se recibe en el puerto, ademas le he puesto las señales del puerto serial para ver cuando se envia y cuando se reciben caracteres y el estado de otras señales importantes.

Espero que esto funcione.

Salud OS

JoseFco 24-02-2008 20:30:11

Eso esta perfecto.

Cuando lo ruedo con el micro me da los 8 hex, las luces solo son TX and RX.

Dime algo que configuracion tiene el serial port en ese programita?

Un Saludo.

egostar 24-02-2008 20:47:54

Cita:

Empezado por JoseFco (Mensaje 268310)
Eso esta perfecto.

Cuando lo ruedo con el micro me da los 8 hex, las luces solo son TX and RX.

Dime algo que configuracion tiene el serial port en ese programita?

Un Saludo.

Pues la configuracion es la que tu das excepto la velocidad que es 57,600.

Estoy usando los componentes Apro, este es el código que estoy usando en el programa

Código Delphi [-]
procedure TForm1.FormShow(Sender: TObject);
begin
  ApdSLController1.Monitoring := True;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ApdComport1.Open := False;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  ApdComPort1.PutString(#2#0);
end;

Salud OS

PD. Te paso el fuente, pero requieres de los componentes que te menciono.

JoseFco 24-02-2008 21:22:43

Tengo que aprenderme ese componente Apro.

A este:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);beginComport1.Connected:=true;Comport1.WriteStr(#2#0);end;
Le falta dejar el serial port reciviendo, que es lo que no logro hacer.Me da error. Un Saludo.

kurono 25-02-2008 05:43:45

hola egostar puedes mostrar el codigo fuente de ese programa que hiciste

egostar 25-02-2008 18:21:30

Cita:

Empezado por JoseFco (Mensaje 268326)
Tengo que aprenderme ese componente Apro.

A este:
Código Delphi [-]
procedure TForm1.FormCreate(Sender:TObject);
begin
  Comport1.Connected:=true;
  Comport1.WriteStr(#2#0);
end;

Le falta dejar el serial port reciviendo, que es lo que no logro hacer.Me da error.

Un Saludo.

Seria bueno que nos mencionaras que error te da. si me dices donde bajo ese componente que usas podría hacer algunas pruebas para ver que es lo que te hace falta.

Cita:

Empezado por kurono (Mensaje 268375)
hola egostar puedes mostrar el codigo fuente de ese programa que hiciste

Todo está en el archivo adjunto que coloque.

Salud OS

JoseFco 25-02-2008 22:24:05

Hola Egostar.

Si el ComPort Library version 3.10 de Dejan Crnila es el que uso y lo encontre en un hilo de aqui del foro.
Yo entro a Google y aqui en en el foro a ver hilos y referencias sobre el comport.Tomo algunos codigos y trato de rodarlos, pero ya te digo me da errores algunas veces tres y tratando de repararlos cuando vengo a ver tengo 10 jajajajajajaja.Algun dia lo entendere mejor o al menos me dejara jugar con el.

Un Saludo.

egostar 25-02-2008 23:19:11

Pues ya he visto tu componente, pero no veo por ningun lado el evento

Código Delphi [-]
procedure TForm1.ComPort1ReceiveCallBack(Data: String);
begin
  Edit1.Text:=(Data);
end;

Sin embargo, hice un programita y si funciona.

Salud OS

PD: Lo hice con Turbo Delphi, espero puedas abrir el fuente. :)

JoseFco 26-02-2008 02:23:18

Hola Egostar.

Si el problema es que tengo dos ComPort en mi PC y esa fue la conficion.Estaba con un comport usando procedimientos de que no tenia.

Código Delphi [-]
 
 procedure TForm1.ComPortRxChar(Sender: TObject; Count:Integer);
 var
   Str: String;
 begin
   
   ComPort.ReadStr(Str, Count);
   Memo.Text := Memo.Text + Str;
 end;

Es que existen dos comport con el mismo nombre y diferentes componentes( yo en mi pc los llamo diferentes el otro es "PuertoCom" en mi pc.Pero si miro Google encuentras codigos y hay que tener cuidado al menos yo que estoy comenzando en esto y puedo cometer el error de usar un componente que no existe en un comport aunque se llame comport.

Deja correr ese programita que me mandaste a ver que hace y estudiar el codigo.


PD: En ese linck que mirastes ayer del hilo asm ese es otro comport y no el comport de Dejan Crnila por ejemplo.

Un Saludo.

JoseFco 26-02-2008 03:01:50

Bueno ya estoy recibiendo los 8 hex de retorno del micro y una de las cosas que necesitaba era poder combertir a hex.Con este codigo ya esta superado.
Código Delphi [-]
procedure AddHexString(S : String; Lines : TStrings );
var AddS, HexS, CopyS : String;
    i : Integer;
const SLen = 8;
begin
  while Length(S) > 0 do
    begin
      AddS := Copy(S,1,SLen);
      HexS := '';
      Delete(S,1,SLen);
      for i := 1 to SLen do
        begin
          CopyS := Copy(AddS,i,1);
          if CopyS <> '' then
            HexS := HexS + ' ' + Format('%2.2x',[Byte(CopyS[1])]) //
          else
            HexS := HexS + '   ';
        end;
       while Length(AddS) < SLen do
         AddS := AddS + ' ';
       for i := 1 to SLen do
         case AddS[i] of
           #0..#31 : AddS[i] := '.';
           #127    : AddS[i] := '.';
         end;
       Lines.Add(HexS+' : '+AddS);
    end;
end;

Un Saludo.

JoseFco 26-02-2008 03:19:55

Esta parte del codigo la cambie.
Código Delphi [-]
 procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
  Str: String;
begin
 ComPort.ReadStr(Str, Count);
 AddHexString(Str,Memo.Lines);
end;

Para que lo recibido fuera combertido a hex.

Un Saludo.

egostar 26-02-2008 03:55:32

Pues que bien que ya estes recibiendo la información, ahora como decimos por aca, a coser y cantar. :D:D:D

Salud OS

JoseFco 26-02-2008 04:08:53

Hola Egostar.

Cita:

=egostar;268598]Pues que bien que ya estes recibiendo la información, ahora como decimos por aca, a coser y cantar. :D:D:D

Salud OS
jajajajaja me falta un camino largo todavia por recorrer.
Tengo que jugar mas con esos hex y poderlos manipular.El otro paso es poder contarlos, o compararlos y si es= continuar el programa de lo contrario habrir una ventana donde me diga que no establece comunicacion ( algo asi)
estoy estudiando un componente de ese mismo comport "timer".Yo en asm para micros es tarea facil el compara una data y si es = hacer algo y sino es = hacer lo otro, pero en Delphi estoy ciego y a tientas como dicen en tu tierra." Bien norteado" jajajaja pero un dia con otro las cosas saldran.:)

Un millon de gracias carnal de verdad que tu ayuda a sido super importante.
Sin ella estaria mas perdido que un raton en una ferreteria.:D:D:D

Un Saludo.

egostar 26-02-2008 04:17:00

Cita:

Empezado por JoseFco (Mensaje 268601)
jajajajaja me falta un camino largo todavia por recorrer.
Tengo que jugar mas con esos hex y poderlos manipular.El otro paso es poder contarlos, o compararlos y si es= continuar el programa de lo contrario habrir una ventana donde me diga que no establece comunicacion ( algo asi)
estoy estudiando un componente de ese mismo comport "timer".Yo en asm para micros es tarea facil el compara una data y si es = hacer algo y sino es = hacer lo otro, pero en Delphi estoy ciego y a tientas como dicen en tu tierra." Bien norteado" jajajaja pero un dia con otro las cosas saldran.:)

Pues como te digo, ya tienes la parte digamos dificil, comparar las cadenas no tiene tanto problema, incluso sin cambiar a hexadecimal porque puedes comparar directamente la frase Hi-LOGIC.

Código Delphi [-]
 
If PalabraMagica = 'Hi-LOGIC' then
   ShowMessage('Ya estamos conectados')
else ShowMessage('Ya nos la pellizcamos');

Salud OS

JoseFco 26-02-2008 04:39:50

En ese caso si funcionaria sin pasarlo a hex, pero en algunos casos el micro retornara hex 00 01 02 el ascii en esos casos es ;. iguales en los tres casos.
Por ejemplo rodando el original y con el espia en el serial port si el micro me manda un 01 el programa SwowMessage ( Communication Failure:Reception Error!
Dentro del micro son 8 bits hex, ascii, decimal, binarios, como los quieras llamar pero en un final son 8 bit que estaran 1 o 0, pero ya dentro del Delphi es otra la historia y es la que me cuesta trabajo entender.( recuerda que en esto estoy a gatas todavia)

Una Saludo.

PD: haciendo pruebas lo mismo funciona en 56000 que en 57600 almenos en datas cortas, no se que pasaria en datas largas.pero es 56000 eso esta confirmado por la configuracion del puerto en el micro.

egostar 26-02-2008 04:57:23

Para efectos de los caracteres de control lo que yo hago es lo siguiente:

Código Delphi [-]
 
Const
    Nulo = #0; 
    SOH = #1;
    // Estas son laas señales que yo utilizo con mas frecuencia.
    STX = #2;
    EXT = #3;
    EOT = #4;
    ENQ = #5;
    ACK = #6;
    NAK = #21;

En realidad la forma en que se reciben los datos de cualquier dispositivo serial son valores de la tabla ASCII, pero los programas son los que "muestran" la informacìón como mas les place, Hexadecimal, Decimal o Binario, pero al final son caracteres.

Salud OS

ayazgz 26-02-2008 11:49:09

Por que a mi...
 
Me baje el cport-3.10.zip e hice todo lo que dice... pero a la hora de compilar me da errores por un tubo... uso delphi 5 y necesito recibir y mandar caracteres por puerto serie, no se que mas intentar... solo me falta eso para acabar mi programa...:(:(

GRACIAS!!!!!:):)

JoseFco 27-02-2008 00:00:29

Hola Egostar.
Este codigo copila bien, no me da error alguno pero no corre del todo bien, me manda los hex 02 00 pero el micro no manda los 8 hex.

Código Delphi [-]
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, CPort, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    ComPort1: TComPort;
    procedure Button1Click(Sender: TObject);
    procedure ComPortRxChar(Sender: TObject; Count: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure AddHexString(S : String; Lines : TStrings );
var AddS, HexS, CopyS : String;
    i : Integer;
const SLen = 8;
begin
  while Length(S) > 0 do
    begin
      AddS := Copy(S,1,SLen);
      HexS := '';
      Delete(S,1,SLen);
      for i := 1 to SLen do
        begin
          CopyS := Copy(AddS,i,1);
          if CopyS <> '' then
            HexS := HexS + ' ' + Format('%2.2x',[Byte(CopyS[1])]) //
          else
            HexS := HexS + '   ';
        end;
       while Length(AddS) < SLen do
         AddS := AddS + ' ';
       for i := 1 to SLen do
         case AddS[i] of
           #0..#31 : AddS[i] := '.';
           #127    : AddS[i] := '.';
         end;
       Lines.Add(HexS+' : '+AddS);
    end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 Comport1.Connected:=true;
  Comport1.WriteStr(#2#0);
end;
 procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
  Str: String;
begin
 ComPort1.ReadStr(Str, Count);
   If Str= 'Hi-LOGIC' then
   ShowMessage('Ya estamos conectados')
else ShowMessage('Ya nos la pellizcamos');
end;
end.

Un Saludo.

FGarcia 27-02-2008 00:37:47

PepePancho no te va a funcionar asi porque el RxChar es un caracter a la vez por eso debes de agruparlo en alguna variable y al terminar de capturar debes de efectuar la comparacion.

Código Delphi [-]
var Cadena: string;
ComPort.ReadStr(Str,Count);
Cadena := Cadena + Str;

algo asi. Lo estoy haciendo de memoria.

JoseFco 27-02-2008 00:53:33

Hola socio.


Cita:

=FGarcia;268851]PepePancho no te va a funcionar asi porque el RxChar es un caracter a la vez por eso debes de agruparlo en alguna variable y al terminar de capturar debes de efectuar la comparacion.


Código Delphi [-]var Cadena: string;
ComPort.ReadStr(Str,Count);
Cadena := Cadena + Str;




algo asi. Lo estoy haciendo de memoria.
Debe decirle a la cadena cuantos caracteres estoy esperando para que ella sepa cuando es tiempo de comparar?

Un Saludo.

egostar 27-02-2008 01:14:21

Cita:

Empezado por JoseFco (Mensaje 268855)
Debe decirle a la cadena cuantos caracteres estoy esperando para que ella sepa cuando es tiempo de comparar?

Cuando estas esperando una cadena fija (como es el caso) lo puedes hacer como lo comenta FGarcía y comparando la cadena.

Código Delphi [-]
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
begin
  ComPort1.ReadStr(Str,Count);
  Cadena := Cadena + Str;
  if Cadena = 'Hi-LOGIC' then begin
     ShowMessage('Ya estamos conectados');
     Cadena := ''; 
  end;
end;

Salud OS

JoseFco 27-02-2008 22:44:01

Hola Egostar.

Ya lo de comparar los hex que manda el micro quedo resuelto de esta manera.

Código Delphi [-]
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
  Str: String;
begin
     ComPort.ReadStr(Str, Count);
       AddHexString(Str,Memo.Lines);
     if length(Str)>= 8 then
    if Str = 'Hi-LOGIC' then
      showmessage('¡OK! ¡ES ORIGINAL!')
    else
      showmessage('¡HORROR!, ¡ES PIRATA!');
end;

Aqui contamos la cadena y esperamos que sean 8 los caracteres, luego comparamos que sean los deceados lo cual nos dara una respuesta y de no ser iguales pues el resultado adecuado.

Ya el serial port y el comport los estoy entendiendo un poco mejor gracias a tu ayuda y la del amigo FGarcia.

Un Saludo.


La franja horaria es GMT +2. Ahora son las 15:57:38.

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