Foros Club Delphi

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

egostar 02-04-2008 02:31:57

Cita:

Empezado por JoseFco (Mensaje 276893)
Estoy cambiando para lo ultimo que mandastes y me da el siguiente error.
Undeclare identifier:'Buffer"

jajajajajajaja esta declarado o no?

Un Saludo.

Si esta declarado pero como una variable local, sacala de este procedimiento y colocala como variable general.

Código Delphi [-]
procedure TForm1.Button3Click(Sender: TObject);
var
  i,j: Integer;
  Str: String;
  Buffer: TBuffer; //Sacala de aquí y ponla como general
begin
.....
end;

Salud OS

JoseFco 02-04-2008 03:02:21

Asi esta el codigo:

Código Delphi [-]
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, CPort, StdCtrls, ComCtrls;
type
  TForm1 = class(TForm)
    ComPort: TComPort;
    Button1: TButton;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    ProgressBar1: TProgressBar;
    Button2: TButton;
    Button3: TButton;
    Label1: TLabel;
    OpenDialog1: TOpenDialog;
    Memo1: TMemo;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure ComPortRxChar(Sender: TObject; Count: Integer);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  Cuantos, CuentaB : Integer;
  Contador  : Integer;
  LineaMemo  :  String;
  Count :   Integer;
  Buffer: TBuffer;
implementation
{$R *.dfm}
type
 TBuffer = array[$0000..$FFFF] of Byte;
function Insertar(Str: String; var Buffer: TBuffer): String;
var
  i,j,k: Integer;
begin
  Result:= EmptyStr;
  Str:= Trim(Str);
  if Copy(Str,1,1) = ':' then
    if TryStrToInt('$' + Copy(Str,2,2),i) then
      if Length(Str) = ((2*i) + 11) then
        if TryStrToInt('$' + Copy(Str,4,4),j) then
          if TryStrToInt('$' + Copy(Str,8,2),k) then
            if k = 0 then
            begin
              Str:= Copy(Str,10,2*i);
              for k:= j to (j + i - 1) do
              begin
                Buffer[k]:= StrToInt('$' + Copy(Str,1,2));
                Delete(Str,1,2);
              end;
            end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
if not ComPort.Connected then
ComPort.Open;
comport.WriteStr(#2#0);
end;
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
Str: String;
begin
 ComPort.ReadStr(Str, Count);
 if length(Str)>= 8 then
 ShowMessage('OK')
 else if Str = #1 then  begin
   case Cuantos of
   1: begin     //poner el chip en prog..
ComPort.WriteStr(#2#2);
   Cuantos := 2;
 end;
   2: begin //comando para borrar.
     ComPort.WriteStr(#2#3);
       Cuantos := 3;
   end;
    3: begin //Modo Borrar
    showmessage('Chip Borrado.. OK!')
 end;
    4: begin //poner el chip en prog..
         ComPort.WriteStr(#2#2);
          Cuantos := 5;
      end;
    5: begin // Comando para escribir el chip(06 04 00 00 10 00)
         ComPort.WriteStr(#6#4#0#0#16#0);
            sleep(100);
             ComPort.Write(Buffer[1],1);
               Contador := 2;
      end;
     end;
     end
         else if Str = #2 then begin
         end
           else if Str = #83 then begin
               if contador <= 4096 then begin
                 ComPort.Write(Buffer[Contador],1);
                Inc(Contador);
     end;
     end;
     end;
 //Aqui comienza el procedimiento para borrar el chip
procedure TForm1.Button1Click(Sender: TObject);
begin
 if not ComPort.Connected then
  ComPort.Open;
 comport.WriteStr(#4#1#0#1);
   Cuantos := 1;
    end;
 //Aqui comienza el procedimiento para escribir el chip
procedure TForm1.Button2Click(Sender: TObject);
begin
 if not ComPort.Connected then
  ComPort.Open;
 comport.WriteStr(#4#1#0#1);
  Cuantos := 4;
end;
procedure TForm1.Button3Click(Sender: TObject);
  var
  i,j: Integer;
  Str: String;
begin
 if OpenDialog1.Execute then
Label1.caption:=OpenDialog1.FileName;
  Memo1.Clear;
  with TStringList.Create do
  try
    LoadFromFile(Label1.Caption);
    FillChar(Buffer,Sizeof(Buffer),#0);
    for i:= 0 to Count - 1 do
      Insertar(Strings[i],Buffer);
     j:= StrToInt(Label2.caption);
     Str:= EmptyStr;
       for i:= 0 to j -1 do
      begin
   Str:= Str + #32 + IntToHex(Buffer[i],2);
      if ((i+1) mod 16 = 0) then
    begin
        Memo1.Lines.Add(Str);
        Str:= EmptyStr;
      end;
    end;
     if Str <> EmptyStr then
      Memo1.Lines.Add(Str);
  finally
    Free;
  end;
end;
end.

Ya la declare general y me dice que esta indefinida?

jajajajajajaja

JoseFco 02-04-2008 03:24:21

La quite del general y la declare en donde estaba y donde comienza el procedimiento de escribir el chip.
Esta trabajando y programando.Pero el buffer esta lleno de 00 es todo lo que manda.

Como la vez?

Un Saludo.

JoseFco 03-04-2008 00:34:53

Hola Amigos.

Asunto Resuelto

Como el chip master (el del programador) era un AT89C2051 con solo 2 Kbytes de memoria y estaba ocupada al 100% pues cambie a un AT89C4051 con 4 Kbytes.Lo que no puede enderezar en Delphi lo compuse en el uC.
Estaba solo mandando caracteres ascii incluyendo los "20" espacios.Pues estos los elimina una rutina en mi uC (master) y los caracteres restantes como 30 (0) 30 (0) pues de ellos compongo mi hex 00.etc.
Que pasa cuando tengo un 20 que no es espacio y forma parte de mi data? jejejejeje mi rutina tiene eso en cuenta y comienza con un espacio luego dos caracteres y otro espacio.Si a continuacion de un espacio se repite el 20 mmm pues eso lo interpreta como data.

En delphi soy novato y me domina...a los uC los domino yo.:D:D:D

Asi que resuelto el problema de programar y borrar.Me falta leer pero eso es tema de otro hilo si es que hace falta.;)

Un Saludo.

JoseFco 19-04-2008 20:52:45

Cita:

Empezado por egostar (Mensaje 276887)
Y si intentas con esto amigo Jose


Código Delphi [-]
5: begin // Comando para escribir el chip(06 04 00 00 10 00)
ComPort.WriteStr(#6#4#0#0#16#0);
sleep(100);
ComPort.Write(Buffer[1],1);
Contador := 2;
end;
end;

else if Str = #83 then begin
if contador <= 4096 then begin
ComPort.Write(Buffer[Contador],1);
Inc(Contador);
end;
end;
end;





Salud OS

Esta ultima con algunas modificaciones esta trabajando bien.

Gracias y un Saludo.

jpiedra 09-07-2013 04:59:33

Acerca de lectura de ComPortRxChar
 
Hola a todos

Tengo un problema: tengo que leer un modem GSM Wavecon, se conecta vía USB y estoy tratando de usar el componente TComPort.

Puedo enviar mensajes al puerto con instrucciones tipo AT que son para controlar el modem, al parecer si puedo escribir sin problemas, pero no puedo leer la respuesta en el evento RxChar, de hecho no lo puedo leer de ninguna forma, con todas las formas que he intentado leer el puerto siempre me regresa una cadena vacía

Lo he intentado de estas dos formas :

procedure TfrmMain.Button3Click(Sender: TObject);
var
toSend : string;
lst : TStringList;
X: integeR;
readBuf : string;
OtroPuerto : CPort.TComPort;
Continuar : boolean;
begin
Continuar := false;
OtroPuerto := CPort.TComPort.Create(nil);
OtroPuerto.Port := 'COM' + tbPortNumber.Text;
OtroPuerto.Events := [];
OtroPuerto.FlowControl.ControlDTR := dtrEnable;
OtroPuerto.FlowControl.ControlRTS := rtsEnable;
OtroPuerto.Open; // open port

mmRead.Lines.Clear;
lst := TStringList.Create;
try
lst.Add('AT+CPMS="SM"');
lst.Add('AT+CMGF=1');
lst.Add('AT+CMGR=1');

for x:=0 to lst.Count-1 Do
begin
toSend := lst.Strings[x] + #13;
Application.ProcessMessages;
mmRead.Lines.Add(' Mensaje : ' + toSend);
OtroPuerto.WriteStr(toSend);
Sleep(1000);
readBuf := '';
otroPuerto.ReadStr(readBuf, otroPuerto.InputCount);
mmRead.Lines.Add(' Lectura : ' + readBuf);
end;
finally
FreeAndNil(lst);
//OtroPuerto.Free;
end;
end;


y la otra implementando el metodo

procedure TfrmMain.OtroPuertoRxChar(Sender: TObject; Count: Integer);
var
Str: String;
begin
OtroPuerto.ReadStr(Str, Count);
mmRead.lines.Add(Str);
end;

Sin embargo en ninguna de las dos he logrado conocer la respuesta del modem, solo cadenas vacías.

Si alguien me puede ayudar les agradezco de antemano

Saludos y gracias a todos

Casimiro Noteví 09-07-2013 10:31:09

Cita:

Empezado por jpiedra (Mensaje 463475)
Hola a todos

Crea un tema nuevo, eso no tiene nada que ver con dar solución al que inició este hilo.

Te recuerdo nuestra guía de estilo, gracias por tu colaboración :)

Y recuerda poner los tags al código fuente, ejemplo:



Gracias :)


La franja horaria es GMT +2. Ahora son las 11:56:18.

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