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)

JoseFco 27-03-2008 02:08:29

Cuantos ComPortRxChar?
 
Hola amigos.

Tengo una preguntica:
Código Delphi [-]
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);

Se pueden hacer mas de un procedure como este en un mismo programa?

Un Saludo.

egostar 27-03-2008 02:22:13

Cita:

Empezado por JoseFco (Mensaje 275533)
Hola amigos.

Tengo una preguntica:
Código Delphi [-]
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);

Se pueden hacer mas de un procedure como este en un mismo programa?

Un Saludo.

Podrias comentarnos que es lo que quieres hacer, porque me imagino que lo necesitas para actuar en consecuencia en base a las cadenas que te llegan, ¿si?......:rolleyes:

Salud OS

JoseFco 27-03-2008 02:56:02

Hola egostar.

La cosa es que ya tengo ese procedure en mi programita y trabaja bien.Cuando recibo una cadena de bytes y la comparo.Pero la estoy tratando de usar en otro boton, que hace otra cosa y se me complico el asunto.
Me explico. Yo tengo un boton donde mando al serial port unos bytes(4) para ser mas claro y tengo que esperar un byte de retorno,compararlo y si es = al que espero , entonces mandar otros dos bytes y esperar otro bytes de regreso.El problema es que ese byte es un 01 y se repite tres veces en ese procedure del boton.
A todo lo largo de mi programita estare empleando ComPort.ReadStr(Str, Count); puedo llenar de "else" el procedure pero el problema es que cuando tengo tres como en este caso.No en todos los 01 que espero tomare la misma decision, depende de cuando y porque me lo estan mandando.

Un Saludo.

Caral 27-03-2008 03:33:22

Hola
Lo mas seguro es que me equivoque pero pienso en voz alta.
Por que no crear un procedimiento aislado al que se le llame desde este procedimiento y que contenga una variable que guarde ese valor.
No conozco el ComPortRxChar, supongo que vendra de los chart o de algun componente determinado, pero si es necesario que envie el resultado con un dato string y otro integer, cual seria el problema de hacerlo con otro procedimiento o funcion?, asi no se necesitaría duplicar el procedimiento.
Bueno, solo opino, ya sabéis, así aprendo.:)
Saludos

FGarcia 27-03-2008 06:18:00

No puedes usar mas de un OnRxChar puesto que solo tienes un punto de entrada al puerto serie. On RxChar revisa caracter a caracter lo que entra al puerto. Si necesitas que tu programa reaccione a un caracter o caracteres especiales deberas de programar una rutina para tratar cada uno de ellos.

Código Delphi [-]
procedure TForm1.ComPortRxChar(Sender: TObject; count:integer);
begin
   {AQUI EL COMPONENTE LEE LO QUE RECIBE POR EL PUERTO COM}
  ComPort.ReadStr(Str, Count);
 
   if Str = 'DELPHI' then
      ShowMessage('Bienvenido')
   else if Str = 01 then
      ShowMessage('OK')
   else if Str = 2 then
      UnProcedimiento
   else if Str = 3 then
      OtroProcedimiento
   else
      LoQueSea;
end;

Ahora bien si necesitas capturar alguna conjunto de caracteres o "paquetes" bien definidos entonces es mejor usar el ComDataPacket el cual te permitira colocar tantos como necesites para un solo puerto.

Código Delphi [-]
//Suponemos que necesitamos recibir una cadena que al final cierra con CR
 
//declaramos una constante
const Terminador = #13  //ASCII 13 o CR
 
//En la creacion del formulario declaramos
procedure TForm1.Create(Sender: TObject);
begin
   ComDataPacket.StopString := Terminador;
end;
 
//Este procedimiento se ejecutaria cada vez que aparezca CR
procedure TForm1.ComPortDataPacket(str: string; count: integer);
begin
   ShowMessage('Cadena Recibida: ' + Str);
end;

Si necesitas recibir el caracter 01 varias veces y bajo diversas circunstancias tal vez la mejor manera de tratarlo seria usando OnRxChar y llamar a un procedimiento que procese acorde a la circunstancia en que lo esperas. Esto es una sugerencia tal vez hay mejor manera; crear un Type por ejemplo llamado Modo y que tenga declarados los diversos modos que tu necesitas por ejemplo:

Código Delphi [-]
Type Modo = (Leer, Escribir, Borrar);
 
//Redeclarando el evento OnRxChar
procedure TForm1.ComPortRxChar(Sender: TObject; count:integer);
begin
   {AQUI EL COMPONENTE LEE LO QUE RECIBE POR EL PUERTO COM}
  ComPort.ReadStr(Str, Count);
 
   if Str = 'DELPHI' then
      ShowMessage('Bienvenido')
   else if Str = 01 then
      if Modo = Leer then
         ShowMessage('OK')
      else if Modo = Escribir then
          ProcedimientoEscribir
      else
          ProcedimientoBorrar
   else if Str = 2 then
      UnProcedimiento
   else if Str = 3 then
      OtroProcedimiento
   else
      LoQueSea;
end;

egostar 27-03-2008 17:19:30

Mas claro ni el agua, :)

Salud OS

JoseFco 27-03-2008 22:30:45

Código Delphi [-]
procedure TForm1.ComPortRxChar(Sender: TObject; count:integer);
begin      
ComPort.ReadStr(Str, Count);    
if Str = 'DELPHI' then      
ShowMessage('Bienvenido')   
else if Str = 01 then   // <---aqui no esta comparando.   
  comport.WriteStr(#2#2) 
  else if Str = 2 then     
 UnProcedimiento   
else if Str = 3 then     
 OtroProcedimiento   
else    
  LoQueSea;
end;
Todo funciona bien hasta donde lo tengo comentado.
Me da un error si el 01 no lo pongo asi '01'
Un Saludo.

egostar 27-03-2008 22:40:41

Cita:

Empezado por JoseFco (Mensaje 275789)
Código Delphi [-]
procedure TForm1.ComPortRxChar(Sender: TObject; count:integer);
begin      
ComPort.ReadStr(Str, Count);    
if Str = 'DELPHI' then      
ShowMessage('Bienvenido')   
else if Str = 01 then   // <---aqui no esta comparando.   
  comport.WriteStr(#2#2) 
  else if Str = 2 then     
 UnProcedimiento   
else if Str = 3 then     
 OtroProcedimiento   
else    
  LoQueSea;
end;
Todo funciona bien hasta donde lo tengo comentado.
Me da un error si el 01 no lo pongo asi '01'
Un Saludo.


Sera porque Str es un char y no un entero?

Trata con esto:

Código Delphi [-]
else if Str = #1 then   // <---aqui no esta comparando.   
  comport.WriteStr(#2#2) 
  else if Str = #2 then     
 UnProcedimiento   
else if Str = #3 then     
 OtroProcedimiento

o así si es un String:

Código Delphi [-]
else if Str = '01' then   // <---aqui no esta comparando.   
  comport.WriteStr(#2#2) 
  else if Str = '02' then     
 UnProcedimiento   
else if Str = '03' then     
 OtroProcedimiento

Salud OS

JoseFco 27-03-2008 22:57:51

Hola egostar.
Este es el codigo en realidad.

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 if Str = '01' then
Comport.WriteStr(#2#2)
 else
showmessage('¡HORROR!, ¡ES PIRATA!');
end;




Creo que aqui esta el problema.Yo tengo esa rutina que al comenzar recibe
algo que me envia el chip y si es = continua el programa.Creo que aqui esta la cosa.
Dejame estudiar eso ultimo que mandastes.
Un Saludo.

JoseFco 28-03-2008 00:37:40

Tengo medio resuelto el problema.
Código Delphi [-]
Type Modo = (Leer, Escribir, Borrar);
 //Redeclarando el evento OnRxChar
procedure TForm1.ComPortRxChar(Sender: TObject; count:integer);
begin   {AQUI EL COMPONENTE LEE LO QUE RECIBE POR EL PUERTO COM}  
ComPort.ReadStr(Str, Count);   
 if Str = 'DELPHI' then    
  ShowMessage('Bienvenido')   
else if Str = 01 then      
if Modo = Leer then     
    ShowMessage('OK')     
 else if Modo = Escribir then      
   ProcedimientoEscribir     
else          ProcedimientoBorrar
   else if Str = 2 then  
    UnProcedimiento   
else if Str = 3 then     
 OtroProcedimiento  
 else     
 LoQueSea;
end;
Cambie mi codigo y ya puedo comparar el primer #1el problema es que tendre en esta rutina tres veces el retornodel uC con el byte (01) y es donde tendre que hacer uso de larutina que escribio FGarcia.Pero tengo una duda, como le digo alReadStr que Modo quiero que compare? Yo tengo un boton y manda al serial port (#4#1#0#1)recibo un #1 compara si es = entonces mando al serial port (#2#2)hasta aqui trabaja bien mi programita.El relajo entra cuando recibo [/color]el segundo #1 y no diferencia del primero mandandome otra vez los(#2#2) sindo que yo no quiero mandar eso despues de recibir el primer #1. No se si me explico? Un Saludo.

JoseFco 28-03-2008 00:48:13

Esto es lo que tengo hecho.
Código Delphi [-]
var
  Form1: TForm1;
implementation
{$R *.dfm}
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
 ComPort.WriteStr(#2#2)
 else
 ShowMessage('No puede comunicar');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 if not ComPort.Connected then
  ComPort.Open;
 comport.WriteStr(#4#1#0#1);
end;
end.

Todo esta bien hasta que tengo que comparar otra vez el #1.

Un Saludo.

egostar 28-03-2008 01:05:23

A ver si entendi lo que necesitas

Código Delphi [-]
var
  Form1: TForm1;
  Cuantos : Integer;

.......

procedure TForm1.ComPortRxChar(Sender: TObject; count:integer);
var
  Str: String;
begin
  ComPort.ReadStr(Str, Count);
  AddHexString(Str,Memo.Lines);
  if Str = 'Hi-LOGIC' then
     showmessage('¡OK! ¡ES ORIGINAL!')
  else begin
         if Str = '01' then begin
            case Cuantos of
                1: begin //Modo Leer;
                     Comport.WriteStr(#2#2)
                     //ProcedimientoLeer
                     Cuantos := 2;
                end
                2: begin //Modo Escribir
                     //ProcedimientoEscribir
                     Cuantos := 3;
                end
                3: begin //Modo Borrar
                     //ProcedimientoBorrar
                end;
             end;
         end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   if not ComPort.Connected then
      ComPort.Open;
   comport.WriteStr(#4#1#0#1);
   Cuantos := 1;
end;

Salud OS

JoseFco 28-03-2008 01:54:50

Hola egostar.

Bueno asi esta la cosa, despues de algunos errores al final copilo.
Código Delphi [-]
var
  Form1: TForm1;
  Cuantos : Integer;
implementation
{$R *.dfm}
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
ComPort.WriteStr(#2#2);
   Cuantos := 2;
 end;
   2: begin //Modo Escribir
     ComPort.WriteStr(#2#3);
                     //ProcedimientoEscribir
                     Cuantos := 3;
   end;
    3: begin //Modo Borrar
                     //ProcedimientoBorrar
    showmessage('Chip Borrado.. OK!')
 end;
 end;
 end;
 end;
 

procedure TForm1.Button1Click(Sender: TObject);
begin
 if not ComPort.Connected then
  ComPort.Open;
 comport.WriteStr(#4#1#0#1);
   Cuantos := 1;
end;
end.

Asi esta copilando sin errores y haciendo el trabajo que esperaba, esta es la
rutina para borrar la memoria de un AT89S51 y esta trabajando de maravillas.
Ya borre un chip que estaba programado y chequeado en otro programador que esta borrado.:D:D:D
Un paso mas en el proyecto.
100 puntos para el maestro egostar.

egostar 28-03-2008 02:15:10

Cita:

Empezado por JoseFco (Mensaje 275869)
100 puntos para el maestro egostar.

:D:D:D ya te pareces a Caral

Salud OS

JoseFco 28-03-2008 02:15:22

Aqui la prueba del delito:

:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
:10008000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80
:10009000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF70
:1000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60
:1000B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
:1000C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40
:1000D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF30
:1000E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF20
:1000F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10
:10010000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
:10011000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF
:10012000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF
:10013000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF
:10014000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF
:10015000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF
:10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
:10017000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F
:10018000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F
:10019000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F
:1001A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5F
:1001B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F
:1001C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3F
:1001D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2F
:1001E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1F
:1001F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0F
:10020000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE
:10021000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE
:10022000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDE
:10023000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCE
:10024000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBE
:10025000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAE
:10026000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9E
:10027000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8E
:10028000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7E
:10029000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6E
:1002A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5E
:1002B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4E
:1002C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3E
:1002D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2E
:1002E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1E
:1002F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0E
:10030000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD
:10031000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED
:10032000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDD
:10033000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCD
:10034000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBD
:10035000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAD
:10036000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9D
:10037000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8D
:10038000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7D
:10039000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6D
:1003A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D
:1003B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4D
:1003C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3D
:1003D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2D
:1003E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1D
:1003F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0D
:10040000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC
:10041000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC
:10042000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDC
:10043000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCC
:10044000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBC
:10045000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC
:10046000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C
:10047000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8C
:10048000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C
:10049000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C
:1004A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C
:1004B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4C
:1004C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C
:1004D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2C
:1004E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C
:1004F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C
:10050000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB
:10051000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB
:10052000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDB
:10053000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCB
:10054000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBB
:10055000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAB
:10056000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9B
:10057000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8B
:10058000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7B
:10059000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6B
:1005A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5B
:1005B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4B
:1005C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3B
:1005D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2B
:1005E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1B
:1005F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0B
:10060000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA
:10061000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEA
:10062000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDA
:10063000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCA
:10064000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBA
:10065000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAA
:10066000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9A
:10067000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8A
:10068000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A
:10069000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6A
:1006A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5A
:1006B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4A
:1006C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3A
:1006D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2A
:1006E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1A
:1006F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A
:10070000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9
:10071000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9
:10072000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD9
:10073000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC9
:10074000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB9
:10075000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA9
:10076000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF99
:10077000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89
:10078000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF79
:10079000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF69
:1007A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF59
:1007B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49
:1007C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF39
:1007D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF29
:1007E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF19
:1007F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF09
:10080000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8
:10081000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8
:10082000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8
:10083000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8
:10084000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB8
:10085000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8
:10086000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98
:10087000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88
:10088000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78
:10089000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF68
:1008A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF58
:1008B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF48
:1008C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF38
:1008D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF28
:1008E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF18
:1008F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08
:10090000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7
:10091000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7
:10092000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7
:10093000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7
:10094000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB7
:10095000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA7
:10096000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97
:10097000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF87
:10098000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77
:10099000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67
:1009A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57
:1009B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF47
:1009C000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF37
:1009D000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF27
:1009E000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF17
:1009F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF07
:100A0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6
:100A1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE6
:100A2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD6
:100A3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC6
:100A4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB6
:100A5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA6
:100A6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF96
:100A7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF86
:100A8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF76
:100A9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF66
:100AA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56
:100AB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF46
:100AC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF36
:100AD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF26
:100AE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF16
:100AF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF06
:100B0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5
:100B1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5
:100B2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD5
:100B3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC5
:100B4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB5
:100B5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA5
:100B6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF95
:100B7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF85
:100B8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75
:100B9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF65
:100BA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF55
:100BB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF45
:100BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF35
:100BD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25
:100BE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF15
:100BF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF05
:100C0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4
:100C1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE4
:100C2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD4
:100C3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC4
:100C4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB4
:100C5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4
:100C6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF94
:100C7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF84
:100C8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF74
:100C9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF64
:100CA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF54
:100CB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF44
:100CC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF34
:100CD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF24
:100CE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF14
:100CF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF04
:100D0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3
:100D1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE3
:100D2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD3
:100D3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3
:100D4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB3
:100D5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA3
:100D6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF93
:100D7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83
:100D8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF73
:100D9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF63
:100DA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF53
:100DB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43
:100DC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF33
:100DD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23
:100DE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF13
:100DF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03
:100E0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2
:100E1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2
:100E2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD2
:100E3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC2
:100E4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB2
:100E5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA2
:100E6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92
:100E7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF82
:100E8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF72
:100E9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62
:100EA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52
:100EB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF42
:100EC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF32
:100ED000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF22
:100EE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF12
:100EF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF02
:100F0000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1
:100F1000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1
:100F2000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD1
:100F3000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1
:100F4000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB1
:100F5000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA1
:100F6000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF91
:100F7000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81
:100F8000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF71
:100F9000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61
:100FA000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF51
:100FB000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF41
:100FC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF31
:100FD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF21
:100FE000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11
:100FF000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF01
:00000001FF

Exito total!!

FGarcia 28-03-2008 04:10:54

Cita:

Empezado por egostar (Mensaje 275877)
:D:D:D ya te pareces a Caral

Salud OS

JAJAJAJAJAJAJA

¡Solo falta que diga que tambien es novato!

Habra que recordarle que Novato es marca registrada de Caral Enterprises Inc. y que le pueden reclamar regalias por derechos de uso.:D:D:D

JoseFco 28-03-2008 04:32:45

Cita:

Empezado por FGarcia (Mensaje 275904)
JAJAJAJAJAJAJA

¡Solo falta que diga que tambien es novato!

Habra que recordarle que Novato es marca registrada de Caral Enterprises Inc. y que le pueden reclamar regalias por derechos de uso.:D:D:D

Caral es todo un maestro ya, es hora que suelte la corona de novato y nos la deje a las nuevas generaciones.:D:D:D

jajajajajajaja

Un Saludo.

egostar 28-03-2008 04:35:49

Cita:

Empezado por JoseFco (Mensaje 275911)
Caral es todo un maestro ya, es hora que suelte la corona de novato y nos la deje a las nuevas generaciones.:D:D:D

jajajajajajaja

Un Saludo.

:D:D:D ya lo decia yo, Caral ya es un viejo.... lobo :D:D:D

Salud OS

FGarcia 28-03-2008 05:43:30

A ver, Egostar me corrige si me equivoco, hice algunos añadidos al ultimo codigo que mado PepePancho:

Código Delphi [-]
var
  Form1: TForm1;
  Cuantos, CuentaB : Integer;  //OJO AQUI SE MODIFICO
 
implementation
{$R *.dfm}
 
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
        ComPort.WriteStr(#2#2);
        Cuantos := 2;
      end;
   2: begin //Modo Escribir
        ComPort.WriteStr(#2#3);
        //ProcedimientoEscribir
        Cuantos := 3;
      end;
   3: begin //Modo Borrar
         //ProcedimientoBorrar
         showmessage('Chip Borrado.. OK!')
      end;
   end
 
//AQUI la cadena recibida vale 2
 else if Str = #2 then begin
   case Cuantos of
      1: begin
          //
          end;
      2: begin //Envia el primer byte. CuentaB vale 0.
             ComPort.WriteStr(Buffer[CuentaB]);
             Inc(CuentaB);
          end;
      
   end;

//AQUI el chip respondio a el envio del primer byte
 else if Str = #53 then begin
   case Cuantos of
      2: ProcedimientoEscribir;
   end;

 end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 if not ComPort.Connected then
  ComPort.Open;
 comport.WriteStr(#4#1#0#1);
   Cuantos := 1;
end;
 
{Este procedimiento pretende escribir caracter a caracter sobre el
puerto serie. CuentaB es un contador que lleva el registro de las transmisiones efectuadas, siempre se 
compara su valor contra el valor de la longitud del buffer que contiene el archivo a transmitir.}

procedure TForm1.ProcedimientoEscribir;
begin
  if CuentaB <= Length(Buffer) then
    begin
      ComPort.WriteStr(Buffer[CuentaB]);
      Inc(CuentaB);
    end
  else
    ComPort.WriteStr(ByteFinTx);
end;
end.

JoseFco 29-03-2008 19:34:47

Hola FGarcia.

Ayer no pude trabajar en el proyecto.Pero si le di una miradita al codigo.
Para poder rodar este codigo tengo que incorporar al programa otras rutinas que tengo por separadas y ya es hora de que se reunan :D:D:D asi que tengo buen taller para el dia de hoy.

Un Saludo.

JoseFco 29-03-2008 23:50:01

Bueno asi esta la cosa.
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;
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);
     end;
     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;
  Buffer: TBuffer;
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.

Esto copila bien y trabaja bien.
Ahora la cosa esta que despues que mando el comando (06 04 00 00 10 00) entonces esperando un tiempo corto tengo que mandar el primer byte del buffer y esperare por cada uno de estos bytes un 53 y asi hasta el final del buffer.

Un Saludo.

JoseFco 30-03-2008 00:04:35

Continuando con el comentario anterior.

Código Delphi [-]
    5: begin // Comando para escribir el chip(06 04 00 00 10 00)
         ComPort.WriteStr(#6#4#0#0#16#0);
          // aqui tiene que entrar la rutina de mandar el primer byte del buffer
     end;

Un Saludo.

MaMu 30-03-2008 01:00:05

Se ve lindo y bien ATcmd, alguna fotito del hard? :D

JoseFco 30-03-2008 01:15:48

Cita:

Empezado por mamu (Mensaje 276218)
Se ve lindo y bien ATcmd, alguna fotito del hard? :D

El hard es un board de trabajo.(por el momento)
Lo que usara este programador es un max 232, un AT89C2051 para el soporte entre el PC y el Chip a programar.Unas cuantas resistencias y un poco de capacitores.Cuando termine el proyecto pondre algunas fotos del mismo.
Los comandos de programacion originales del AT89S51 y 52 radican en los 2kbytes de memoria del AT89C2051, esta aclaracion por si alguien sigue este proyecto que no se sienta frustrado si mirando el data de estos chips se siente perdido o pensara que estoy loco.:p
Delego la mayoria de las operaciones al 2051 por la sencilla razon que domino el uC y no el Delphi.
Un Saludo.

JoseFco 30-03-2008 16:00:04

Hola amigos.

Estoy tratando de agregar este procedimiento pero me da error.
Código Delphi [-]
procedure TForm1.ProcedimientoEscribir;
var
Buffer: TBuffer;
begin
  if CuentaB <= Length(Buffer) then
    begin
      ComPort.WriteStr(Buffer[CuentaB]);
      Inc(CuentaB);
    end

me da el siguiente error; ( Incompatible Types:'String' and 'Byte'

Un Saludo.

JoseFco 30-03-2008 18:03:19

Cita:

Empezado por FGarcia (Mensaje 275924)
A ver, Egostar me corrige si me equivoco, hice algunos añadidos al ultimo codigo que mado PepePancho:


Código Delphi [-]
var
  Form1: TForm1;
  Cuantos, CuentaB : Integer;  //OJO AQUI SE MODIFICO
 
implementation
{$R *.dfm}
 
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
        ComPort.WriteStr(#2#2);
        Cuantos := 2;
      end;
   2: begin //Modo Escribir
        ComPort.WriteStr(#2#3);
        //ProcedimientoEscribir
        Cuantos := 3;
      end;
   3: begin //Modo Borrar
         //ProcedimientoBorrar
         showmessage('Chip Borrado.. OK!')
      end;
   end
 
//AQUI la cadena recibida vale 2
 else if Str = #2 then begin
   case Cuantos of
      1: begin
          //
          end;
      2: begin //Envia el primer byte. CuentaB vale 0.
             ComPort.WriteStr(Buffer[CuentaB]);
             Inc(CuentaB);
          end;
 
   end;
 
//AQUI el chip respondio a el envio del primer byte
 else if Str = #53 then begin
   case Cuantos of
      2: ProcedimientoEscribir;
   end;
 
 end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 if not ComPort.Connected then
  ComPort.Open;
 comport.WriteStr(#4#1#0#1);
   Cuantos := 1;
end;
 
{Este procedimiento pretende escribir caracter a caracter sobre el
puerto serie. CuentaB es un contador que lleva el registro de las transmisiones efectuadas, siempre se 
compara su valor contra el valor de la longitud del buffer que contiene el archivo a transmitir.}
 
procedure TForm1.ProcedimientoEscribir;
begin
  if CuentaB <= Length(Buffer) then
    begin
      ComPort.WriteStr(Buffer[CuentaB]);
      Inc(CuentaB);
    end
  else
    ComPort.WriteStr(ByteFinTx);
end;
end.


Hola Fgarcia. Ya le di mil vueltas a este codigo y no hay forma de que copile.

Un Saludo.

JoseFco 31-03-2008 22:31:42

Algo para los maestros.

Código Delphi [-]
 ComPort.WriteStr(Buffer[CuentaB]);

Aqui me da el siguiente error; ( Incompatible Types:'String' and 'Byte'
Ya mire la ayuda de Delphi y nada.No le encuentro la causa a este error.

Un Saludo.

egostar 31-03-2008 22:38:33

Cita:

Empezado por JoseFco (Mensaje 276524)
Algo para los maestros.

Código Delphi [-]
 ComPort.WriteStr(Buffer[CuentaB]);

Aqui me da el siguiente error; ( Incompatible Types:'String' and 'Byte'
Ya mire la ayuda de Delphi y nada.No le encuentro la causa a este error.

Un Saludo.

No estoy seguro, pero TBuffer como has declarado Buffer es de este tipo

Código Delphi [-]
TBuffer = array[1..BufSize] of Byte;

si quieres usar un indice dentro de una cadena, tal vez puedes usar esto:

Código Delphi [-]
Buffer : Array[1..200] of Char;
//en lugar de 
Buffer : TBuffer;

Salud OS

JoseFco 31-03-2008 22:55:13

Hola egostar.

La cosa esta asi:Tengo esta funcion que estaria mandando los bytes que se encuentran en el buffer al serial port.Tengo que mandar el primer byte y estaria reciviendo un byte por cada uno que mando (53) esto hasta que se termine el contenido del buffer.Y esta rutina se encargaria de eso, pero no me copila.

Código Delphi [-]
procedure TForm1.ProcedimientoEscribir;
begin
  if CuentaB <= Length(Buffer) then
    begin
      ComPort.WriteStr(Buffer[CuentaB]);
      Inc(CuentaB);
    end
  else
    ComPort.WriteStr(ByteFinTx);
end;
end.

Un Saludo.

JoseFco 31-03-2008 23:34:56

Ampliando el procedimiento.

Código Delphi [-]
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);

El programita trabaja bien hasta este punto.(eso dice el espia) y yo le tengo confianza.
Ahora despues de esos bytes "comandos" mi chip esperara el primer byte que esta en el buffer, tambien esta en el "memo" .Y por cada byte de data que el chip reciba me estara mandando un "53". Esto es para darle tiempo al chip que ese primer byte lo pueda mandar al uC que estoy programando y cuando el termine y este listo para el siguiente entonces asi se lo hace saber al PC (mandandole un 53 )Ahora bien no necesariamente tengo que estar mirando el final del buffer, yo se cuantos bytes de data estan dentro de el y son 4096 bytes de data y la misma cantidad de " 53 " estaria recibiendo de confirmacion. Se puede crear una rutina que los cuente y al ser = 4096 termine el procedimiento. jajajajajaja yo razono como si Delphi fuera un uC y estoy creando rutinas.:D

Alguien sabe donde venden Delphi en pildoras???:D:D:D

Un Saludo.

egostar 01-04-2008 00:29:23

Bueno, y porque no usar el Memo para enviar los caracteres, agrega otra variable de tipo Integer de nombre Contador

Código Delphi [-]
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
                  ComPort.WriteStr(#2#2);
                  Cuantos := 2;
             end;
             2: begin //Modo Escribir
                  ComPort.WriteStr(#2#3);
                  //ProcedimientoEscribir
                  Cuantos := 3;
             end;
             3: begin //Modo Borrar
                  //ProcedimientoBorrar
                  showmessage('Chip Borrado.. OK!')
                  Cuantos := 4;
             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);
                  Contador := 1;
             end;
          end;
      end
      else if Str = #2 then begin
           end
           else if Str = #53 then begin
                   if contador <= 4096 then begin
                      ComPort.WriteStr(Memo1.Text[Contador]);
                      Inc(Contador);
                   end;
                end;
end;

A ver como funciona :)

Salud OS

JoseFco 01-04-2008 02:28:55

Una preguntita.
Código Delphi [-]
 5: begin // Comando para escribir el chip(06 04 00 00 10 00)
                  ComPort.WriteStr(#6#4#0#0#16#0);
                  Contador := 1; // aqui esta mandando el primer byte?
             end;
          end;
      end
      else if Str = #2 then begin
           end
           else if Str = #53 then begin
                   if contador <= 4096 then begin
                      ComPort.WriteStr(Memo1.Text[Contador]);
                      Inc(Contador);
                   end;
                end;
end;

Esta copilando bien y rueda sin problemas hasta donde manda los 6 bytes de comando.El primer byte del memo no sale al serial port. contador:=1; Esta esperando el primer 53?
El primer 53 entrara despues que el primer byte de data entro al chip.

Un Saludo.

egostar 01-04-2008 02:33:44

Cita:

Empezado por JoseFco (Mensaje 276575)
Una preguntita.

Esta copilando bien y rueda sin problemas hasta donde manda los 6 bytes de comando.El primer byte del memo no sale al serial port. contador:=1; Esta esperando el primer 53?
El primer 53 entrara despues que el primer byte de data entro al chip.

A ver, lo que entendi es que tu estas esperando el #53, entonces lo que necesitas es enviar #53?

Salud OS

JoseFco 01-04-2008 02:44:26

Cita:

Empezado por egostar (Mensaje 276576)
A ver, lo que entendi es que tu estas esperando el #53, entonces lo que necesitas es enviar #53?

Salud OS

El 53 lo manda el chip despues que recive el primer byte de data ( el primer byte que esta en el memo) entonces es que manda el primer 53.
Código Delphi [-]
   ComPort.WriteStr(#6#4#0#0#16#0);
     // aqui debe mandar el primer byte del memo y entonces espera el 53
                  Contador := 1;

El primer 53 es para mandar el segundo en adelante hasta el final de los 4096 bytes.

Un Saludo.

egostar 01-04-2008 02:47:45

Código Delphi [-]
    ComPort.WriteStr(#6#4#0#0#16#0);
    sleep(100); // Edito, esto es para que haga una pequeña pausa, antes de enviar el primer caracter....
    ComPort.WriteStr(Memo1.Text[1]);
    Contador := 2;

A ver que tal así....

Salud OS

JoseFco 01-04-2008 03:10:04

Ya esta mandando el primer byte y recibe el primer 53.
Eso quiere decir que si el chip regresa el primer 53 es que esta entendiendo bien la cosa.:)
Ahora hay dos problemas, uno es que el primer byte es un "01" y esta mandando "20" .cambie el file hex y el primer byte es un "00" y sigue mandando un "20".El segundo problema es que cuando regresa el primer 53 ya no manda mas nada.Se detiene.La rutina contador no manda mas nada.

Un Saludo.
PD: el 20 es espacio en asscii?? jejejejeje creo que aqui hay gato encerrado.

egostar 01-04-2008 03:16:06

Cita:

Empezado por JoseFco (Mensaje 276586)
Ya esta mandando el primer byte y recibe el primer 53.
Eso quiere decir que si el chip regresa el primer 53 es que esta entendiendo bien la cosa.:)
Ahora hay dos problemas, uno es que el primer byte es un "01" y esta mandando "20" .cambie el file hex y el primer byte es un "00" y sigue mandando un "20".El segundo problema es que cuando regresa el primer 53 ya no manda mas nada.Se detiene.La rutina contador no manda mas nada.

Un Saludo.
PD: el 20 es espacio en asscii?? jejejejeje creo que aqui hay gato encerrado.

Una pregunta Jose, que es lo que tienes en el Memo......

Salud OS

JoseFco 01-04-2008 03:27:24

En el memo lo que hay es hex 00 01 FE 12 0A puro hex .

Este es el programita.

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;
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.WriteStr(Memo1.Text[1]);
           Contador := 2;
     end;
     end;
     end
         else if Str = #2 then begin
         end
           else if Str = #53 then begin
                   if contador <= 4096 then begin
                       sleep(100);
                      ComPort.WriteStr(Memo1.Text[Contador]);
                      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;
  Buffer: TBuffer;
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.

Algo le pasa a la rutina que se detiene y no continua mandando nada mas.( lo del 20 es otra cosa, el programa no debe detenerce por eso y cuando llega el primer 53 debe mandar otro byte. A no ser que el memo no lo leemos como debe ser.:confused:

Si te fijas en ese programita yo llamo un fila, intelhex lo limpiamos y se queda puro hex nada mas.

Un Saludo.

egostar 01-04-2008 03:31:11

Cita:

Empezado por JoseFco (Mensaje 276593)
En el memo lo que hay es hex 00 01 FE 12 0A puro hex .

Algo le pasa a la rutina que se detiene y no continua mandando nada mas.( lo del 20 es otra cosa, el programa no debe detenerce por eso y cuando llega el primer 53 debe mandar otro byte. A no ser que el memo no lo leemos como debe ser.:confused:

Si te fijas en ese programita yo llamo un fila, intelhex lo limpiamos y se queda puro hex nada mas.

Un Saludo.

Pues ahi esta la cosa, estamos enviando caracteres y no los valores

por ejemplo en esa linea

00 01 FE 12 0A

Estamos mandando

0
0

0
1

F
E

1
2

0
A

y deberiamos enviar

$00
$01
$FE
$12
$0A

Voy a ver como le hacemos.

Salud OS

JoseFco 01-04-2008 03:32:37

Esto es lo que esta en el memo:

00 12 00 72 12 00 7E B4 80 04 80 34 80 F6 75 A0
FE 12 00 AF 75 A0 FD 12 00 AF 75 A0 FB 12 00 AF
75 A0 F7 12 00 AF 75 A0 EF 12 00 AF 75 A0 DF 12
00 AF 75 A0 BF 12 00 AF 75 A0 7F 12 00 AF 80 C4
75 A0 7F 12 00 AF 75 A0 BF 12 00 AF 75 A0 DF 12
00 AF 75 A0 EF 12 00 AF 75 A0 F7 12 00 AF 75 A0
FB 12 00 AF 75 A0 FD 12 00 AF 75 A0 FE 12 00 AF
80 92 75 98 52 75 89 20 75 8D F3 D2 8E 22 30 98
FD C2 98 E5 99 22 C2 B5 89 A0 D2 B4 12 00 AF C2
B4 22 D2 B5 89 A0 D2 B4 12 00 AF C2 B4 22 79 01
11 86 79 38 11 86 79 0C 11 86 79 06 11 86 22 7F
00 7E 00 7D 00 0D BD 50 FC 0E BE 50 F6 0F BF 50

y sigue con 00 hasta completar 4096 bytes.


La franja horaria es GMT +2. Ahora son las 18:38:44.

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