Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-08-2006
Geta Geta is offline
Miembro
 
Registrado: ago 2004
Posts: 27
Poder: 0
Geta Va por buen camino
Seoane, al final voy a probar lo que dices de programarme a pelo las rutinas de manipulacion del COM. Pero estoy pez en la api. Sabes de informacion de la API referente a como manipular el puerto COM ?

Agredeceria links o documentos.

A por cierto esto de los threads, ni idea como funcionan?

gracias.

Última edición por Geta fecha: 17-08-2006 a las 21:19:23.
Responder Con Cita
  #2  
Antiguo 17-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Todas las funciones las tienes en la ayuda. En el menú de ayuda de Delphi abre "Windows SDK" hay encontraras la función CreateFile, SetCommState, etc. Incluso creo recordar que viene algún ejemplo de como leer el puerto serie. Básicamente windows trata el puerto serie como si fuera un archivo mas (con ciertas limitaciones), una vez abierto y configurado, puedes leer y escribir en el como si de un archivo se tratase. Tienes un par de funciones, además, para manejar si te hiciese falta, las lineas RTS,DTR, etc.

PD: En el ejemplo anterior, añadi una linea que faltaba.

Última edición por seoane fecha: 17-08-2006 a las 21:33:01.
Responder Con Cita
  #3  
Antiguo 17-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Cita:
Empezado por Geta
A por cierto esto de los threads, ni idea como funcionan?
Los threads sirven para ejecutar un código en un hilo diferente al principal. Si una rutina va a durar mucho corremos el riesgo de que nuestra aplicación parezca congelada. Así que podemos utilizar threads para que se ejecute paralelamente al resto de la aplicación. En este foro encontraras mucha información sobre threads, echale un vistazo
Responder Con Cita
  #4  
Antiguo 18-08-2006
Geta Geta is offline
Miembro
 
Registrado: ago 2004
Posts: 27
Poder: 0
Geta Va por buen camino
Nada, no soy capaz de mandar un string por el com con las funciones de la API. Me es imposible.

Imaginad una cadena a mandar por ejemplo: ' hola'

Como la mando, he imtentado con writefile pero al leer la respuesta del dispositivo, nada, no hay respuesta.

estoy desesperado.
Responder Con Cita
  #5  
Antiguo 18-08-2006
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.572
Poder: 27
egostar Va camino a la fama
Post

He hecho algunas pruebas con el componente AdpComPort, prueba con este código, haber que tal.

Código Delphi [-]
 
 
var
  Form1: TForm1;
  Primer,Resto : String;
  
:::::::::
 
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
  I : Word;
  C : Char;
  S : String;
begin
  S := '';
  for I := 1 to Count do begin
    C := ApdComPort1.GetChar;
    S := S + C;
  end;
  sleep(100);
  if Length(S) = 1 then begin
     Primer := S;
  end
  else begin
         Resto := S;
         Memo1.Lines.Add(Primer+Resto);
         Primer := '';
         Resto  := '';
       end;
end;

Puede ser mejorado, pero lo hice asi al vuelo.

Te explico un poco, en el evento OnTriggerAvail del AdpComPort llega los bytes uno por uno, entonces, al llegar cada paquete leo el primer caracter y espero 100 ms para que llegue toda la cadena restante. Yo uso un Memo para ver la cadena pero tu puedes usar variables.

Podrás mover este parámetro de espera en ms si la cadena es muy grande, pero no lo creo necesario.

Espero te sirva.

Saludos
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #6  
Antiguo 18-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Suponiendo que ya tienes el puerto abierto y configurado, para escribir una cadena puedes usar algo como esto:

Código Delphi [-]
var
  s: string;
  Escritos: Cardinal;
begin
  s:= 'hola'; // O puede que s:= 'hola' + #13#10;
  WriteFile(hPort, PChar(s)^,Length(s), Escritos, nil);
end;
Responder Con Cita
  #7  
Antiguo 18-08-2006
Geta Geta is offline
Miembro
 
Registrado: ago 2004
Posts: 27
Poder: 0
Geta Va por buen camino
Cita:
Empezado por seoane
Suponiendo que ya tienes el puerto abierto y configurado, para escribir una cadena puedes usar algo como esto:

Código Delphi [-]var s: string; Escritos: Cardinal; begin s:= 'hola'; // O puede que s:= 'hola' + #13#10; WriteFile(hPort, PChar(s)^,Length(s), Escritos, nil); end;

Magnifico, asi si que me lo entiende el dispositivo. Le he dicho a si a groso modo que encienda un led con un byte en hexadecimal y se ha encendido. pero se supone me tenia que responder un byte y no lo hace. Leo con ReadFile asi:

Código:
comando: String;
...
...
ReadFile(hPort,comando,length(comando),cuantos,nil);
pero nada.
Responder Con Cita
  #8  
Antiguo 18-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
Bien, parece que estas controlando algún tipo de dispositivo electrónico, habría que ver como es el protocolo de comunicación de ese dispositivo. ¿Utiliza comandos de texto?, es decir, los que tu mandas y recibes son cadenas de texto. Si es así, para mandar el texto ya tienes la solución arriba, y para recibir texto hay que saber que carácter termina cada linea. Lo normal es leer byte a byte el puerto serie hasta encontrar el carácter final que suele ser #13.

De todas formas el código que tu pones no es correcto:
Cita:
Empezado por Geta
comando: String;
...
...
ReadFile(hPort,comando,length(comando),cuantos,nil);
No puedes leer el puerto serie con una variable tipo string, al menos no así. Ya que ReadFile intentara leer tantos caracteres como longitud tenga la cadena de texto almacenada en comando (si no hay nada sera 0), y lo peor es que lo almacenara a partir de la primera posición de memoria de la variable comando, que en un string no coincide con el primer carácter de la misma. Yo normalmente leo los bytes uno a uno, o utilizo un buffer (un array de Chars).

De todos modos, ¿cual es el protocolo de comunicación de ese dispositivo?, ¿que le tienes que mandar tu?, ¿que te responde el?, ¿es texto o bytes?, ¿sabes la longitud de la respuesta, o esta delimitada por un carácter final?. Y si no es mucho preguntar ¿que dispositivo es?, si me das más datos puede que entienda mejor lo que necesitas.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Disminuir el tamaño de un ejecutable tannyk Varios 6 18-05-2005 06:23:41
Disminuir el tamaño de los archivos .pst (outlook) Alexander Windows 3 11-05-2005 19:42:38
Disminuir tamaño de un programa Leomedellin Varios 1 06-04-2005 18:49:05
de BYTE a STRING emeceuy Varios 3 20-08-2004 16:29:32
ADO: Byte nulo (byte #0) en un string Pandre Conexión con bases de datos 0 02-04-2004 20:18:37


La franja horaria es GMT +2. Ahora son las 20:43:37.


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
Copyright 1996-2007 Club Delphi