Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Mi primer programita en Delphi (https://www.clubdelphi.com/foros/showthread.php?t=51793)

JoseFco 29-12-2007 17:07:31

Mi primer programita en Delphi
 
Hola amigos.

Estoy tratando de copilar este programita y me da tres errores.

Código Delphi [-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Edit1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
data,status:byte;
const
base = $3f8;{base address port serial}
lcr = 3; {line control register}
dll = 0; {divisor lacht low byte}
dlh = 1; {divisor lacht high byte}
lsr = 5; {line status register}
implementation
{$R *.dfm}
Procedure Initserial;
begin
asm
mov dx,base+lcr; {address line control register}
mov al,$80 ; {10000000b = access bit divisor lacht}
out dx,al;
mov dx,base+dll; {address divisor lacht low byte}
mov al,$30 ; {DLLB = 30h}
out dx,al;
mov dx,base+dlh; {address divisor lacht high byte}
mov al,$00 ; {DLLH = 00h}
out dx,al;
{In this case Port Serial have};
{ baud rate = 2400 bps}
mov dx,base+lcr;{address line control register}
mov al,$03 ; {00000011b =}
out dx,al ; {bit 7=0, access to Rx buffer & Tx;
{bit 6=0, set break disable;
{bit 5-4-3=000, no parity;
{bit 2=0, one stop bit;
{bit 1-0=11,data lenght 8 bit}
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
initserial;
timer1.enabled:=true;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Repeat
asm
mov dx,base+lsr; { address line status register }
in al,dx
and al,$01 ; {LSR = 00000001b, deteksi bit 0}
mov status,al ; {bit 0 = data ready}
end;
until status = $01 ;{ jika bit 0 = 1 then data ready}
Receive_Data_Serial;
edit1.text:=inttostr(data);
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
edit1.text:=inttostr(data);
end;
end.


Creo que tengo algunas cosas fuera de lugar.Cuales son?

Gracias por la ayuda.

egostar 29-12-2007 17:16:57

Hola amigo [JoseFco], bienvenido al foro abierto, como acostumbramos te invito a que leas nuestra guia de estilo, por otro lado, necesitamos mas datos para una respuesta adecuada, por ejemplo, que errores te muestra al compilar el programa.

Otra de las cosas que te sugiero es que uses las etiquetas delphi para que el código se vea mejor.

Código Delphi [-]
 
unit Unit1;
 
interface
 
uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, ExtCtrls, StdCtrls;
 
type
  TForm1 = class(TForm)
     Button1: TButton;
     Timer1: TTimer;
     Edit1: TEdit;
     procedure Button1Click(Sender: TObject);
     procedure Timer1Timer(Sender: TObject);
     procedure Edit1Change(Sender: TObject);
     private
     { Private declarations }
       public
     { Public declarations }
  end;
 
var
  Form1: TForm1;
  data,status:byte;
 
const
  base = $3f8;{base address port serial}
  lcr = 3; {line control register}
  dll = 0; {divisor lacht low byte}
  dlh = 1; {divisor lacht high byte}
  lsr = 5; {line status register}
 
implementation
 
{$R *.dfm}
 
Procedure Initserial;
begin
  asm
    mov dx,base+lcr; {address line control register}
    mov al,$80 ; {10000000b = access bit divisor lacht}
    out dx,al;
    mov dx,base+dll; {address divisor lacht low byte}
    mov al,$30 ; {DLLB = 30h}
    out dx,al;
    mov dx,base+dlh; {address divisor lacht high byte}
    mov al,$00 ; {DLLH = 00h}
    out dx,al;
    {In this case Port Serial have};
    { baud rate = 2400 bps}
    mov dx,base+lcr;{address line control register}
    mov al,$03 ; {00000011b =}
    out dx,al ; {bit 7=0, access to Rx buffer & Tx;
    {bit 6=0, set break disable;
    {bit 5-4-3=000, no parity;
    {bit 2=0, one stop bit;
    {bit 1-0=11,data lenght 8 bit}
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  initserial;
  timer1.enabled:=true;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Repeat
    asm
      mov dx,base+lsr; { address line status register }
      in al,dx
      and al,$01 ; {LSR = 00000001b, deteksi bit 0}
      mov status,al ; {bit 0 = data ready}
    end;
  until status = $01 ;{ jika bit 0 = 1 then data ready}
  Receive_Data_Serial;
  edit1.text:=inttostr(data);
end;
 
procedure TForm1.Edit1Change(Sender: TObject);
begin
  edit1.text:=inttostr(data);
end;
 
end.

Salud OS

egostar 29-12-2007 17:19:53

Mirando el código, veo una pequeña omisión, te falta un end en el procedimiento InitSerial, es por eso la importancia de poner las etiquetas.

Salud OS

Caral 29-12-2007 19:00:46

Hola
De estas cosas no se pero por curiosidad lo he copiado a ver que hace.
Bueno, los errores que daba se eran mas que nada de escritura, pero quedo uno, el programa compila y corre, pero inmediatamente se detiene y da este error:
Cita:

exception class EPrivilige with message 'Privileged instuction' Process stopped.
Aqui esta el codigo:
Código Delphi [-]
unit Unit1;

interface

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  data,status: byte;

const
  base = $3f8;{base address port serial}
  lcr = 3; {line control register}
  dll = 0; {divisor lacht low byte}
  dlh = 1; {divisor lacht high byte}
  lsr = 5; {line status register}

implementation

{$R *.dfm}

Procedure Initserial;
begin
  asm
    mov dx,base+lcr; {address line control register}
    mov al,$80 ; {10000000b = access bit divisor lacht}
    out dx,al;
    mov dx,base+dll; {address divisor lacht low byte}
    mov al,$30 ; {DLLB = 30h}
    out dx,al;
    mov dx,base+dlh; {address divisor lacht high byte}
    mov al,$00 ; {DLLH = 00h}
    out dx,al;
    {In this case Port Serial have};
    { baud rate = 2400 bps}
    mov dx,base+lcr;{address line control register}
    mov al,$03 ; {00000011b =}
    out dx,al ; {bit 7=0, access to Rx buffer & Tx;
    {bit 6=0, set break disable;
    {bit 5-4-3=000, no parity;
    {bit 2=0, one stop bit;
    {bit 1-0=11,data lenght 8 bit}
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   initserial;
  timer1.enabled:=true;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
   edit1.text:=inttostr(data);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
    Repeat
    asm
      mov dx,base+lsr; { address line status register }
      in al,dx
      and al,$01 ; {LSR = 00000001b, deteksi bit 0}
      mov status,al ; {bit 0 = data ready}
    end;
  until status = $01 ;{ jika bit 0 = 1 then data ready}
 // Receive_Data_Serial;
  edit1.text:=inttostr(data);
end;

end.
Saludos

JoseFco 29-12-2007 21:03:59

Gracias egostar, Caral y al amigo LGarcia.

Ya copile el programita siguiendo las instruciones del amigo LGarcia y lo que el codigo que me facilito Caral.
Esta rodando bien, por el momento no me da error alguno.Lo rodare con el microcontrolador y su respectivo programita a ver que pasa.

Les dejo saber como fue la cosa y que es lo que hace, el resto de este proyecto de estudio.


Saludos y mil gracias.

JoseFco 30-12-2007 05:14:09

Mi abuela decia que lo que no funciona se tira a la basura y eso es lo que hare con este programita;)

Instale el Package de CPortLib y me hace falta una ayudadita.
Quiero usar dos componentes TComled uno que trabajara cuando el puerto este abierto y el otro cuando no encuentre respuestas del microcontrolador,quiero que me de un error.Se puede hacer esto?



Saludos.

JoseFco 02-01-2008 01:51:01

Hola amigos.

Que tiene este codigo mal?





Código Delphi [-]
procedure TForm1.FormCreate( Sender: TObject );
begin
EnumPorts( cbPorts.Items );
if cbPorts.Items.Count > 0 then
cbPorts.ItemIndex := 0; // show first available port

end;
Un Saludo y Feliz Año 2008.

egostar 02-01-2008 04:32:23

Cita:

Empezado por JoseFco (Mensaje 255140)
Mi abuela decia que lo que no funciona se tira a la basura y eso es lo que hare con este programita;)

Instale el Package de CPortLib y me hace falta una ayudadita.
Quiero usar dos componentes TComled uno que trabajara cuando el puerto este abierto y el otro cuando no encuentre respuestas del microcontrolador,quiero que me de un error.Se puede hacer esto?

Bueno, si vas a usar un componente para leer el puerto serial yo te recomiendo el Async Pro.

Para verificar el estado de las comunicaciones, podriamos "jugar" con las señales DTR y DSR en los TComLed para verificar si el estado de la señal está lista para aceptar datos.

Cita:

Empezado por JoseFco (Mensaje 255434)
Hola amigos.

Que tiene este codigo mal?

No se si EnumPorts sea una función del mismo componente CPortLib, si es así creo que deberia ser de esta forma:

Código Delphi [-]
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  EnumComPorts(cbPorts.Items);
  if cbPorts.Items.Count > 0 then
     cbPorts.ItemIndex := 0; // show first available port
end;

Te sugiero que trates de comentarnos el error que te muestra para poder ayudarte mejor.

Salud OS

JoseFco 04-01-2008 23:19:33

Saludos egostar.

Creo que EnumPorts es un API.No creo que sea parte de TComPort.
El codigo es asi como lo pucistes, lo he mirado en tres diferentes programas y esta exactamente asi escrito.Tengo que estudiar el EnumPorts un poco mas profundo.Por el momento solo se que su funcionamiento es chequear los puertos disponibles y ponerlos en un formulario.
Tengo una preguntica. Cuando ponemos.
Código Delphi [-]
uses
Windows,Messages,SysUtils,Classes.ComPort;

Yo no tengo ComPort, solo me deja poner en ese lugar CPorTLib.de lo contrario me da un error al copilar algo.Yo tengo Delphi 7, es esto normal o al instalar esta libreria lo configure mal?

Gracias.

FGarcia 04-01-2008 23:26:56

Cuando tu colocas un componente de tipo ComPort automaticamente te aparece CPort en la Uses de tu Unit. Si lo haces todo por codigo debes añadirla "a mano"

Código Delphi [-]
uses
  SysUtils, Classes, CPort, IniFiles, ActnList, Dialogs, StrUtils;

egostar 04-01-2008 23:47:39

Cita:

Empezado por JoseFco (Mensaje 256088)
Saludos egostar.

Creo que EnumPorts es un API.No creo que sea parte de TComPort.
El codigo es asi como lo pucistes, lo he mirado en tres diferentes programas y esta exactamente asi escrito.Tengo que estudiar el EnumPorts un poco mas profundo.Por el momento solo se que su funcionamiento es chequear los puertos disponibles y ponerlos en un formulario.

Yo uso Delphi4 y TurboDelphi for win32 y no encuentro ninguna referencia a esa función EnumPorts, investigando en internet encontré que esta función forma parte de cWindows.pas de la unidad Delphi Fundamentals la cual se encuentra disponible en sourceforge.net.

Puede ser que me equivoque y en ese caso que alguien me corrija por favor.

Como te comentaba yo uso los componentes de Apro y me han funcionado de maravilla, de hecho el sector donde yo me manejo es en la de crear interfaces seriales para comunicarme con PBX (centrales telefonicas, conmutadores) y a otros dispositivos a través de puertos seriales y los uso frecuentemente.

Salud OS

FGarcia 05-01-2008 01:40:10

Solo por no dejar el hilo inconcluso existe otros componentes llamados TComPort uno de ellos esta aqui y es freeware tambien.

JoseFco 05-01-2008 01:44:02

Hola egostar.
El famoso EnumPorts es un componente de otro TComPort, diferente al que tenia yo instalado. El de Dejan Crnila no trae este componente.Encontramos otro TComPort, que si tiene el EnumPorts.

Este es el url.

http://users.pandora.be/dirk.claessens2/software.htm

Tiene otras cosas mas que no tiene el de Dejan Crnila. Por ejemplo:
procedure ComPort1ReceiveCallBack(Data:String);

Es cosa de seguir investigando.
PD: Se llaman igual los dos. (TComPort)


La franja horaria es GMT +2. Ahora son las 00:01:49.

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