Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-11-2008
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
readstr + librería Comport

Hola

A ver, estoy usando comport como ya lo había comentado, pero hay unos problemas que no puedo resolver, primero que nada a veces me responde con una ÿ por delante de toda la respuesta, lo soluciono con un StringReplace, aunque la idea sería que ni me la regrese, algo andará mal

Y el punto más importante es este:

Estoy enviando comandos AT a un móvil, por ejemplo le envío AT y me debería responde OK, a la primera no lo hace, pero a la segunda si, luego envío por ejemplo AT+GMMI, y me responde solamente OK, osea la anterior respuesta del comando AT solo, y si de nuevo le envío AT+GMMI pues me muestra el resultado bien.

AHora resulta que tengo que enviarle por ejemplo unos 3 comandos al móvil para primero configurarlo luego pedirle datos y ala, ahí el problema, que se hace un lío con las respuestas y al final me entrega todo menos lo esperado y además de que no llega a ejecutarse el último o penúltimo comando por el mismo hecho de que tendría que enviarse 2 veces el mismo comando para así recibir una buena respuesta, esto no siempre es así pero en la mayoría de los casos. ¿Cómo soluciono eso?

este es mi código:

Código Delphi [-]
procedure TForm1.BEnviarClick(Sender: TObject);
var
  tmp, resp, at : AnsiString;
  i : Integer;
  data : String;
  datas : TStrings;
begin

  at := 'AT' + chr(13) + chr(10);
  ComPort.WriteStr(at);
  Sleep(10);
  ComPort.ReadStr(resp, 80);
  ShowMessage(at + resp);

   at := 'AT+CMGF=1' + chr(13) + chr(10);
   ComPort.WriteStr(at);
   Sleep(10);
   ComPort.ReadStr(resp, 80);

  ShowMessage(at + resp);

bueno, como ven creo creo que todo es correcto a excepción del 80, según he leido en la ayuda es la cantidad de datos a recibir, puede que por eso el problema.. pero ¿Qué número debería ir ahí?
cabe decir que no estoy usando el evento writesrt del comport, o algo así se llame jeje

Bueno, a los que lograron hacer eso por favor una mano que no puedo salir de esta.. lo que quiero es leer el sms del móvil, lo he logrado, pero por delphi no puedo de un SOLO tirón.

Saludos!
Responder Con Cita
  #2  
Antiguo 14-11-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.739
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Has probado poniéndole un valor más alto en Sleep?

Aqui dice que el truco está en configurar correctamente el timeout
Responder Con Cita
  #3  
Antiguo 14-11-2008
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Hola

Bueno, me respondo a mi mismo con una pregunta, cuando preguntaba de Count que cuanto debería poner es simple, el componente tiene una propiedad llamada ImputCount

Mi código a quedado de esta manera:

Código Delphi [-]
  at := 'AT' + chr(13) + chr(10);
  ComPort.WriteStr(at);
  Sleep(600);
  ComPort.ReadStr(tmp, ComPort.InputCount);
  Sleep(600);

    at := 'AT+CGMM' + chr(13) + chr(10);
    ComPort.WriteStr(at);
    Sleep(600);
    ComPort.ReadStr(tmp, ComPort.InputCount);
    Sleep(600);

    at := 'AT+CGMI' + chr(13) + chr(10);
    ComPort.WriteStr(at);
    Sleep(600);
    ComPort.ReadStr(resp, ComPort.InputCount);
    Sleep(600);
    ShowMessage(resp);

Bueno, el último SHowmessage mi muestra la respuesta del comando AT+CGMI pero NO TODAS LAS VECES, aveces me muestra del anterior, ahí está el problema ahora, alguien que me sepa ayudar??

He probado con varios tiempos, y este es alto y a cada rato y supongo que debería solucionarlo ya, no creo que le tenga que poner 1 minuto no ??

Saludos!
Responder Con Cita
  #4  
Antiguo 14-11-2008
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
No he seguido el hilo del principio pero ComPort usa el evento OnRxChar para detectar cualquier caracter que entra por el puerto serie, asi que deberas de separar en dos partes tu codigo, en uno el que usas para escribir en el puerto y en OnRxChar para leer lo que respondio.

Código Delphi [-]
procedure TForm1.BEnviarClick(Sender: TObject);
var  
tmp, resp, at : AnsiString;  i : Integer;  data : String;  datas : TStrings;
begin  at := 'AT' + chr(13) + chr(10);  
ComPort.WriteStr(at);    at := 'AT+CMGF=1' + chr(13) + chr(10);  
ComPort.WriteStr(at);
end;



Código Delphi [-]
procedure TForm1.ComPortRxChar(sender: TObject);
varStr: string;
begin
ComPort.ReadStr(Str, Count);
if Str = 'XXXX' then  
// lo que sea
else if Str = 'YYY' then  
// lo que quiera
else if Str = 'ZZZ' then  
// y asi sucesivamente
end;


Existen otros metodos de lectura, deberas de leer el archivo de ayuda que viene con el componente
Espero te sirva de algo lo que te comento.
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?

Última edición por FGarcia fecha: 14-11-2008 a las 19:29:32.
Responder Con Cita
  #5  
Antiguo 14-11-2008
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Hola

Bueno, eso fué lo primero que hice, osea usar ese método del componente, pero SI o SI tengo que usarlo ?

Osea pienso que de la manera que yo lo estaba haciendo es correcto, pero algo me falta o me sobra, ahora he descartado de usar este evento que me comentas por que qué pasará si tengo muuuuchas cosas que enviar y muuuuchas cosas que recibir ? Entonces "creo" que mi código se llenará de else if, else, if, por eso quería cojer manualmente la respuesta y hacer con ella lo que quiera en _cualquier_ parte de mi código, espero me sepas decir cuales son las "otras" formas de leerlo que me interesaría aprender, desde ya muchas gracias por el tiempo.

Otra cosa, además si envío por ejemplo 4 comandos y luego paso a leer en el evento no tendrá la respuesta de los 3 en buffer?
Cosa que tendría todo menos lo que necesito.

Saludos!

EDIT:

bueno, esto igual responde igual que usando el evento

[delphi] ComPort.Open;
ComPort.WriteStr('AT' + chr(13) + chr(10));
Sleep(300);
ComPort.WriteStr('AT+CGMM' + chr(13) + chr(10));
Sleep(300);
ComPort.WriteStr('AT+CGMI' + chr(13) + chr(10));
Sleep(300);
ComPort.ReadStr(resp, ComPort.InputCount);
ShowMessage(resp);[\DELPHI]

Y pues el mismo problema, en primer lugar no necesito así toda la respuesta de los 3 o más comandos en uno, necesito de cada uno, y ahí es donde ocurre el problema que os comenté con anterioridad, de que me muestra la anterior respuesta del comando anterior, y sigo pensando que puede ser el TIME, pero he probado con varios valores y altos y sigue lo mismo :S

Saludos!

Última edición por BlackDaemon fecha: 14-11-2008 a las 20:24:25. Razón: por que no quiero postear de nuevo xD
Responder Con Cita
  #6  
Antiguo 14-11-2008
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Hola

He probado tu código y cuando le doy por primera ves me sale un caracter "raro", luego a la segunda ves sin hacer un Connect := False ni nada me sale esto:

http://omploader.org/veGM3

Es el caracter que les comenté en el primer post que hasta ahora no sé por qué me lo regresa :S
Ahora usando tu código SIEMPRE me lo regresa, es el primero.. pero como yo lo hago aveces NO lo regresa y aveces sí, entonces no sé lo que pasa, estoy totalmente confundido de que pueda ser.

En el delphi he visto que el tipo de datos AnsyChar va de #0..ÿ <- ahí el condenado símbolo, pero no entiendo por que me lo manda.. en la doc dice que ese componente recibe como comando un AnsiString y Regresa un AnsiString, que por cierto eso estaba mal en tu código, tú lo pusiste como un String.
Actualmente ando usando delphi 2009
Desde ya muchas gracias

Saludos
Responder Con Cita
  #7  
Antiguo 14-11-2008
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Hola

Bueno ya no sé qué hacer con esto, me tiene medio loco, he intentado de mil formas y no hay manera de hacerle responder como se debe al móvil, a ratos responde bien, a ratos mal, a ratos unas cadenas que ni dios entiende... a ratos se lía con regresarme los datos, pero sé que todo es por la librería, estoy usando portCom, me agrada, es fácil y todo, pero esto que me pasa me dan ganas de cambiarme a otra, he visto la que es fans el amigo Egostar, pero es muy... grande creo, además de eso no he podido instalarla en delphi 2009 xD

Bueno, siguiendo con el problema este he usado varias cosas, cambiando el tiempo (pausa) entre envío y leer datos, pero nada sigue mal todo..

Aquí les muestro una captura de pantalla que estaba debugüeando, lo poco que se es apretar el F8 jeje, pero bueno, como ven al lado izquiero pone que las variables r1, r2, y r3 son la salida de cada comando AT, pero joder, ahí el problema que les digo, como ven me pone todo mal, hasta me la repite, otras veces pone signos raros, en fin, el buffer ? tiempo ? Yo? clubdelphi ? xD

jodo, olvidaba la captura que tanto mencioné jeje

http://omploader.org/veGQ2


Desde ya muchas gracias

Saludos!
Responder Con Cita
  #8  
Antiguo 15-11-2008
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
Como ando con el chamaco atravesado no habia dado la vuelta por aca. En la carpeta ejemplos de ComPort viene un ejemplo de aplicacion tipo consola para un modem. Por si las dudas lo pego aqui:

Código Delphi [-]
program ModTest;
{$APPTYPE CONSOLE}
uses
  SysUtils,
  CPort,
  Windows,
  SyncObjs;
var
  ComPort: TComPort;
  Events: TComEvents;
  Answer, Data: string;
  Step: Integer;
  Event: TEvent;

function CtrlHandler(CtrlType: LongWord): Boolean;
begin
  Event.SetEvent;
  Result := True;
end;
begin
  Event := TEvent.Create(nil, True, False, '');
  SetConsoleCtrlHandler(@CtrlHandler, True);
  try
    ComPort := TComPort.Create(nil);
    try
      if ParamCount > 0 then
        ComPort.Port := ParamStr(1)
      else
        ComPort.Port := 'COM1';
      ComPort.Events := [];
      ComPort.FlowControl.ControlDTR := dtrEnable;
      ComPort.FlowControl.ControlRTS := rtsEnable;
      ComPort.Open; // open port
      ComPort.WriteStr('AT'#13#10); // send test command
      Answer := '';
      Step := 0;
      repeat
        Events := [evRxChar];
        ComPort.WaitForEvent(Events, Event.Handle, 5000);  // wait for charachters
        if evRxChar in Events then
        begin
          ComPort.ReadStr(Data, ComPort.InputCount);
          Answer := Answer + Data;
          if Pos('OK', Answer) > 0 then
            Break;
        end;
        Inc(Step)
      until (Events = []) or (Step = 20);
      if Pos('OK', Answer) > 0 then
        WriteLn('Modem found on ' + ComPort.Port)
      else
        WriteLn('Modem NOT found on ' + ComPort.Port);
    finally
      ComPort.Free;
    end;
  except
    on E: Exception do
      WriteLn('Error: ' + E.Message);
  end;
  Event.Free;
end.

y del archivo de ayuda:

Cita:

Reading from port
Reading from input buffer can be performed in two ways. Usually application calls one of the read methods inside OnRxChar event, which triggers when charachter(s) arrive in input buffer. If read method is called inside OnRxChar event, read timeouts should be set to no wait, that is, read method checks input buffer and returns immidiately, since the number of bytes in input buffer is already known. Application can also call read method outside OnRxChar, but it should set read timeouts properly. See TComTimeouts for more details.
If component is linked to other component that needs incoming data, like TComDataPacket or TCustomComTerminal, OnRxChar event is is not called, however, the component calls OnRxBuf event. The application can not read the data from input buffer inside OnRxBuf event, since it has already been read. The data is placed automatically by the component in Buffer parameter of OnRxBuf event. Whether OnRxChar or OnRxBuf event is called, can be checked with TriggersOnRxChar property.
Method Description
Read Reads from input buffer to non-typed variable.
ReadAsync Reads from input buffer to non-typed variable in
asynchronous mode.
ReadStr Reads from input buffer to string type variable.
ReadStrAsync Reads from input buffer to string type variable in
asnychronous mode.

Example (inside OnRxChar)
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
Str: String;
begin
ComPort1.ReadStr(Str, Count);
// do something with Str variable
end;

Example (outside OnRxChar)
var
Str: String;
begin
// set timeouts here or at design time
ComPort1.ReadStr(Str, NumberOfBytes);
// do something with Str variable
end;

Example (inside OnRxBuf)
procedure TForm1.ComPort1RxBuf(Sender: TObject; const Buffer; Count: Integer);
begin
// application does not have to read data from input buffer
// data is already in buffer parameter
HandleData(Buffer, Count); // handle data
end;
Mas de la ayuda en la lectura de eventos

Cita:
Waiting for events

When Events property is not empty, a special thread is created for monitoring port events when application calls Open method. This is possible only when you use TComPort component in an application (thread) which creates message loop. Most applications have message loop (GUI, NT services). However, if you want to use TComPort component in a console application, you have to set Events property to empty before calling Open method or your application will crash. To monitor events in console application, you have to use WaitForEvent method.

Example

var
ComPort: TComPort;
Events: TComEvents;

begin
ComPort := TComPort.Create(nil);
try
ComPort.Events := []; // do not create monitoring thread
ComPort.Open; // open port
Events := [evCTS, evDSR, evRLSD]; // define events to wait for
ComPort.WaitForEvents(Events, nil, WaitInfinite); // wait until at least one event happens
if evCTS in Events then

WriteLn('CTS Changed'); // CTS signal changed state
ComPort.Close; // close port
finally
ComPort.Free;
end;
end;



Je Je si las dudas persisten el lunes regresa de vacaciones sensei egostar
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?

Última edición por FGarcia fecha: 15-11-2008 a las 18:00:31.
Responder Con Cita
  #9  
Antiguo 15-11-2008
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Hola

Bueno, ese aplicación de consola ya la había visto, pero no he podido pasarla a una app de ventanas, soy nuevo en esto de delphi, lo siendo

Bueno, he estado probando con otro móvil y no rengo ningún problema al recibir los datos, me llega todo perfecto como lo tengo, pero en el mío, (nokia n95) me llega cualquier cosa que ni dios entiende, no sé que pasará, en fin, ahora tengo otro problema.

Resulta que tengo que estar enviando constantemente un comando AT al móvil, y no hay problema, lo hay y todo eso bien, es un comando para ver si hay un sms nuevo, cuando envío un sms y luego ejecuto la aplicación pues me lo lee sin problemas, y luego le puse que me diga que no hay sms nuevo, todo perfecto
Ahora resulta que he probado enviar un sms mientras la aplicación estaba corriendo, un while infinito.. y mi sorpresa es que salta un error y creo que es de la librería, no sé cómo podría saber de donde viene el error, he debugueado y todo pero no pillo (igual soy malo para eso) bueno, y he dicho que podía capturarlo con un try, except y si hay error pues NO hacer nada.. que retorne una cadena vacía por ej.

Tengo una función que envía un comando, y a esta la llamo cada X tiempo en el while
Código Delphi [-]
  at := 'AT' + cmd + chr(13) + chr(10);
  Sleep(time);
  try
    ComPort.WriteStr(at);  
    try
      ComPort.ReadStr(resp, ComPort.InputCount);    
    except
      Result := '';
    end;
  Sleep(time);
  except
    Result := '';
  end;
  Sleep(time);
  Result := resp;

Bueno he hecho esa chapuza, y he dedudico que si el error sería al esribir/leer el puerto pues que no haga nada, pero igual sigue saltando el error.

Esto creo que es por que el modem qué hará cuando recibe un sms, puesto que pienso que cuando el móvil está poniendo como que hay un nuevo SMS NO LEIDO y en eso la aplicación está pidiendo si hay uns sms NO LEIDO, y produce el error, acabo de probar y he dejado la aplicación corriendo, enviado un sms y sorpresa, no a lanzado el error, me lo a leido tranquilamente y como debería ser, y dije.. ok, le envío otro y plop, el error que les muestro más abajo, ¿Alguna idea de que pueda ser y cómo resolverlo?

Este es el error, y como ven antes si lo leyó bien

http://omploader.org/veGh0

La idea es hacer una aplicación que esté constantemente leyendo los NUEVOS sms del móvil

saludos y me gustaría que me den ideas
Responder Con Cita
  #10  
Antiguo 02-09-2010
Sebastian Ochoa Sebastian Ochoa is offline
Registrado
 
Registrado: ago 2010
Posts: 3
Poder: 0
Sebastian Ochoa Va por buen camino
A blackdaemon

Hola BlackDaemon.. vengo a ti cordialmente a intentar ocupar un pequeño espacio de tu tiempo, es que desde hace tiempo ando en busca de solucion a mi problema, y leyendote me doy cuenta que estas habil en estos temas. amigo, intento crear (o encontrar) un programa que sea capaz de detectar usando el modem, y mediante Caller Id, el numero telefonico de una llamada entrante, si dicho numero se encuentra dentro de una lista de numero aceptados a entrar a mi pc, este programa le deje conectarse y si el numero no se encuentra en dicha lista, simplemente deje sonar el telefono indefinidamente. Crees por favor que me puedas ayudar con esto, llevo bastante tiempo buscando y nada. Encontre un paquete de componentes que tiene algo que se parece a lo que busco, y ya logre un pedazo de programa que detecta el numero, lo reconoce en la lista pero cuando abro el puerto este no lo deja conectarse, o sea, no lo deja entrar a mi red porque windows no reconoce usuario y contraseña, esto apezar de que ese mismo usuario esta registrado en windows. No se bien si me entiendes, pero por favor intentalo y ayudame ok. sin mas. Saludos.
Responder Con Cita
Respuesta



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
Componente ComPort Mary Carmen G. Varios 1 06-08-2008 00:30:26
componente ComPort pollo_c Varios 12 02-08-2008 23:14:33
Problemita con ReadStr JoseFco Varios 4 30-07-2008 18:17:51
Problemas con ComPort 3.0 jairo guzman C++ Builder 0 18-02-2007 00:12:31
comport interface elbert Noticias 1 05-11-2006 17:12:38


La franja horaria es GMT +2. Ahora son las 18:25:46.


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