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)

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 20:16:00.

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