Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Comport y Delphi para enviar Comandos AT (https://www.clubdelphi.com/foros/showthread.php?t=73570)

aagrlp640 02-05-2011 18:40:28

Comport y Delphi para enviar Comandos AT
 
Hola compañeros de la comunidad delphi, tengo una pregunta, lo que pasa es que tengo ya instalado el componente comport para comunicarme con los puertos del modem por medio de delphi, lo que quiero es que al enviar el comando "at" me mande el "ok" que se supone debería de aparecer, les pongo mi código a continuación:
Código Delphi [-]
procedure TForm1.BEnviarClick(Sender: TObject);
var
  resp, at : AnsiString;
begin
  ComPort.Open;
  at := 'AT' + chr(13) + chr(10);
  ComPort.WriteStr(at);
  Sleep(10);
  ComPort.ReadStr(resp, 80);
  ShowMessage(resp);
end;
El problema de este código es que el showmessage no me manda nada.
Me podrían decir que está mal o sí alguien ya lo ha hecho antes me podrían mandar parte del código.
De hecho probando desde la hiperterminal y putty si me corren bien los comandos at, así que sí hay comunicación con el modem (Nokia n900)
Lo que uso es:
Celular Nokia n900 para usarlo como modem.
- Cable de datos de Nokia n900 para conectarlo a la pc.
- Delphi 7
- Windows XP
- Componente comport
Saludos ojalá puedan ayudarme.

afxe 03-05-2011 16:14:42

mas información.
 
Puede que tu problema venga por la configuración del componente comport, ¿Tienes bien puesto el puerto? ¿La velocidad de transmisión? ¿el protocolo de comunicación?.... Tienes que asegurarte que esos parámetros estén sincronizados con los que tiene tu modem.

aagrlp640 03-05-2011 17:02:18

Hola afxe, gracias por tu respuesta, pues según yo si tengo todo bien porque cuando pongo el componente ComPort1 y le doy doble click configuro esa información de la misma manera que lo hago en hiperterminal.
Le pongo
Puerto > com6 (el de mi cel)
bits por segundo > 9600
bits de datos > 8
paridad > ninguno
bits de parada > 1
control de flujo > hardware
De casualidad no tendrás algún ejemplo o me podrías comentar si a ti si te ha funcionado haciendolo mas o menos de la misma manera.

FGarcia 03-05-2011 18:15:00

Debes de usar el evento OnRxChar para capturar lo que te envían al puerto serie.

El componente trae una sección de ejemplos y ademas trae un archivo de ayuda.

aagrlp640 03-05-2011 19:37:05

Hola FGarcia, estuve investigando de lo que mecomentas de OnRxChar, quería saber si me podrías explicar como se usa o como tendría que integrarlo a mi código.

FGarcia 04-05-2011 17:46:59

Bueno, este ejemplo viene en el programa de ejemplo de la carpeta Examples que se instala junto con el componente. Tiene algunas modificaciones para otra cosa que use antes pero te sirve.


Código Delphi [-]
{-----------------------------------------------------------------------------
  Procedure: ComPortRxChar
  Author:    Administrator
  Date:      05-ago-2008
  Arguments: Sender: TObject; Count: Integer
  Result:    Este es el procedimiento clave para recibir datos desde el puerto
             serie. Cualquier caracter que entra por el puerto serie lo coloca
             -en este caso- en el componente Memo. Si se necesita recibir
             caracteres diferentes y para cada uno de esos caracteres realizar
             una accion diferente, se puede usar una estructura de tipo Case Of
             o IF ELSE
             Si los datos a recibir son de una longitud constante o vienen de-
             limitados por un caracter de inicio o por un caracter terminador
             es preferible usar el componente ComDataPacket en vez de este
             Evento. NOTA: NO SE PUEDEN USAR PARA UN MISMO PUERTO AMBOS. SON
             EXCLUYENTES.
-----------------------------------------------------------------------------}
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
  Str: String;
begin
  //Aqui leemos lo que entro al puerto serie
  ComPort.ReadStr(Str, Count);

  //Aqui escribimos en el Memo. Coloque comentarios para no usar esta parte
  Memo.Text := Memo.Text + Str;

  {Quite los comentarios para usar esta seccion de ejemplo IF ELSE. Pruebe con
  el checkbox de nueva linea checado y sin checar}
  {if Str = 'A' then
    ShowMessage('Recibi una letra A')
  else if Str = '1' then
    ShowMessage('Recibi un numero 1')
  else
    ShowMessage('Recibi esto: ' + Str);}
  
end;

aagrlp640 04-05-2011 18:57:10

Muchas gracias por la ayuda me has apoyado bastante, dejenme checar bien los archivos de ejemplo y si hay alguna novedad yo les aviso.
Saludos.

aagrlp640 05-05-2011 20:44:22

Hola, ya lo logre hacer funcionar correctamente en mi nokia n900, sin embargo en un modem usb de telcel marca zte modelo MF100 me falla, desde la hiperterminal he probado los comandos y si me funcionan, sin embargo en delphi algunos no funcionan.
Estos comandos no funcionan en Delphi me mandan “ERROR”:
Código:

AT+CMGF=1  (Para definir el formato del mensaje)
AT+CMGs=”442……” (Para enviar un mensaje)

Algunos que si funcionan son por ejemplo:
Código:

AT (Ver si hay comunicación con el modem)
AT+CGMI (Nombre del fabricante)

Sin embargo en el n900 si corre bien todos los que ponga. No sé que será lo que falla que en hiperterminal si me reconoce todos y en Delphi sólo algunos
Aquí está esa parte de código donde pongo esos comandos
Código Delphi [-]
        procedure TForm1.Button_SendClick(Sender: TObject);
var
  Str: String;
begin

  if Comport.Connected  then
    begin
        mensaje:= Edit_Data.Text;
        at := 'AT' + #13#10; {Este commando si funciona en Delphi}
        ComPort.WriteStr(at); 
        Sleep(10);
        at := 'AT+CMGF=1' + #13#10; {Este commando si funciona en hiperterminal pero no en delphi}
        ComPort.WriteStr(at);
        Sleep(10);
        at := 'AT+CMGS="4424311080"' + #13#10; {Este commando si funciona en hiperterminal pero no en delphi}
        ComPort.WriteStr(at);
        Sleep(10);
        ComPort.WriteStr(mensaje + #26);
        Sleep(10);
      end
  Else
    begin
      lblpuerto.Caption := 'Se debe conectar primero al puerto';
    end
end;
Les pongo todo mi código a continuación:

Código Delphi [-]
unit ComMainForm;

interface

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

type
  TForm1 = class(TForm)
    ComPort: TComPort;
    Memo: TMemo;
    Button_Open: TButton;
    Button_Settings: TButton;
    Edit_Data: TEdit;
    Button_Send: TButton;
    lblpuerto: TLabel;
    ComLed1: TComLed;
    Label1: TLabel;
    procedure Button_OpenClick(Sender: TObject);
    procedure Button_SettingsClick(Sender: TObject);
    procedure Button_SendClick(Sender: TObject);
    procedure ComPortOpen(Sender: TObject);
    procedure ComPortClose(Sender: TObject);
    procedure ComPortRxChar(Sender: TObject; Count: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  at : AnsiString;
  mensaje : String;
implementation

{$R *.DFM}

procedure TForm1.Button_OpenClick(Sender: TObject);
begin
  if ComPort.Connected then
    begin
    ComPort.Close;
    lblpuerto.Caption := 'Desconectado';
    end
  else
    begin
    ComPort.Port := 'COM5';
    ComPort.BaudRate := StrToBaudRate('2400');
    ComPort.Open;
    lblpuerto.Caption := 'Conectado a '+ ComPort.Port;

    end
end;

procedure TForm1.Button_SettingsClick(Sender: TObject);
begin
  ComPort.ShowSetupDialog;
end;

procedure TForm1.Button_SendClick(Sender: TObject);
var
  Str: String;
begin

  if Comport.Connected  then
    begin
        mensaje:= Edit_Data.Text;
        at := 'AT' + #13#10;
        ComPort.WriteStr(at);
        Sleep(10);
        at := 'AT+CMGF=1' + #13#10;
        ComPort.WriteStr(at);
        Sleep(10);
        at := 'AT+CMGS="4424311080"' + #13#10;
        ComPort.WriteStr(at);
        Sleep(10);
        ComPort.WriteStr(mensaje + #26);
        Sleep(10);
      end
  Else
    begin
      lblpuerto.Caption := 'Se debe conectar primero al puerto';
    end
end;

procedure TForm1.ComPortOpen(Sender: TObject);
begin
  Button_Open.Caption := 'Desconectar';
end;

procedure TForm1.ComPortClose(Sender: TObject);
begin
  if Button_Open <> nil then
    Button_Open.Caption := 'Conectar';
end;

procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
  Str: String;
begin
  ComPort.ReadStr(Str, Count);
  Memo.Text := Memo.Text + Str;
end;


end.
Muchas gracias, ojalá me puedan apoyar.
Saludos.

luk2009 30-06-2011 06:52:04

el comando at+cmgf=1 puede que te de error debido a que tu celular no acepte el formato de texto. Puedes probar el comando AT+CMGF=0 y si te da ok, entonces significa que el formato que acepta es PDU.

Hay muchos celulares y modem gsm que solo funcionan enviando mensajes en formato PDU y algunos aceptan ambos pero hay que probar.

aagrlp640 30-06-2011 06:59:09

Cita:

Empezado por luk2009 (Mensaje 405177)
el comando at+cmgf=1 puede que te de error debido a que tu celular no acepte el formato de texto. Puedes probar el comando AT+CMGF=0 y si te da ok, entonces significa que el formato que acepta es PDU.

Hay muchos celulares y modem gsm que solo funcionan enviando mensajes en formato PDU y algunos aceptan ambos pero hay que probar.

Hola luk2009, muchas gracias por la respuesta, pero de hecho ya pude solucionar mi problema lo que hice fue en vez de usar sleep, mejor use un timer para dar mas tiempo para que se ejecute bien el comando, de hecho el modem de telcel si acepta envío de mensajes en modo texto, nada mas que esta medio feo y lento, por eso el n900 lo hacia todo bien,
Saludos

luk2009 01-07-2011 05:00:25

me alegro que hayas podido avanzar con tu proyecto. yo no uso comport, yo utilizo asyncpro o apro, aunque estoy pensando en hacer algunas pruebas con synapse, porque asi podria utilizarlo tanto en lazarus como en delphi y eso me permite utilizarlo tanto en windows, como linux, mac y otros.

Estoy trabajando en hacer que mediante los sms que se reciban el software los lea, y segun el mensaje pueda devolver mensajes con busquedas especificas de una base de datos. Es decir si un tecnico en la calle envia un sms verificando el problema de un cliente, que el sistema busque los datos del problema y devuelva con otro sms al tecnico. Esto puede aplicarse para un cobrador o cualquiera.

Me gustaria saber si te has puesto a leer los mensajes y como es tu experiencia con eso.

aagrlp640 01-07-2011 05:36:51

Cita:

Empezado por luk2009 (Mensaje 405262)
me alegro que hayas podido avanzar con tu proyecto. yo no uso comport, yo utilizo asyncpro o apro, aunque estoy pensando en hacer algunas pruebas con synapse, porque asi podria utilizarlo tanto en lazarus como en delphi y eso me permite utilizarlo tanto en windows, como linux, mac y otros.

Estoy trabajando en hacer que mediante los sms que se reciban el software los lea, y segun el mensaje pueda devolver mensajes con busquedas especificas de una base de datos. Es decir si un tecnico en la calle envia un sms verificando el problema de un cliente, que el sistema busque los datos del problema y devuelva con otro sms al tecnico. Esto puede aplicarse para un cobrador o cualquiera.

Me gustaria saber si te has puesto a leer los mensajes y como es tu experiencia con eso.

Hola luk2009
Mira para eso de accesar a un registro de la base de datos te recomiendo que crees una tabla con los campos; clave, problema y solucion, por ejemplo:
Tabla problemas:
Código:

Clave: 1
Problema: La maquina dejo de funcionar
Solución: Remplazar tal pieza

Ahora cuando el técnico en el celular mande un 1, sólo debes de leer el 1 y ya vas a saber que problema es, desde la programación en delphi o lo que quieras vas a poder acceder a la base de datos y buscar el problema con la clave 1 y responde al mensaje con la solución.
También lo que se me ocurre para que el técnico no tenga que aprenderse las claves, es desarrollar una aplicación de java para celular con una interfaz que sea en modo gráfico, donde vengan los problemas y el técnico seleccione cual es el problema y que la aplicación mande el mensaje con el numero 1, yo no creo que sea difícil desarrollar una aplicación que mande un mensaje, debe ser muy sencillo. Te conviene en java porque casí cualquier celular lo agarra.
Para la parte de leer los mensajes hay un comando AT para leer los mensajes me parece que es:
AT+CMGR
Saludos, si tienes dudas avisame y vere con que te puedo ayudar.

lilian_Verita 06-10-2011 21:54:31

por favor ayudenme
 
Por favor alguien me puede ayudar necesito recibir los SMS de mi modem huawei com10
Justo en el momento en el que llega el SMS por favor necesito su ayuda

ecfisa 06-10-2011 23:43:06

Hola lilian_Verita y bienvenida a los foros de Club Delphi :)

Como a todo recién llegado te invitamos a que leas nuestra Guía de estilo.

Te aconsejo que habras un nuevo hilo con tu consulta ya que de ese modo recibirás más y mejores respuestas. (sin ir más lejos yo entré aqui por error ;) )

Como es probable que ignores como comenzar un hilo te comento.
Desde la página principal click sobre Foros.
Una vez allí eliges mediante un click sobre el nombre el foro que más se adecúe a tu consulta, en este caso creo que Internet o Varios pueden ser adecuados.
Luego haces click sobre el botón Nuevo hilo, pones un título relacionado y significativo y debajo escribes tu consulta.


Un saludo. :)

luk2009 07-10-2011 13:19:59

Es dificil poder ayudarte si no das mas informacion. Que componentes deseas utilizar, cual es tu experiencia con delphi y que has hecho hasta ahora con lo de los mensajes. Dinos como pretendes utilizar esta aplicacion y
Da informacion y recibiras informacion

aagrlp640 07-10-2011 20:53:55

Mas información
 
Hola prodrías dar mas información sobre lo que quieres hacer, es que no entiendo bien lo que quieres hacer.

rastafarey 10-10-2011 22:47:07

resp
 
si mas no recuerdo debes espeficicar una cosa de pdu o texto si mas no recuerdo. hay comando para espeficar el modo.

aagrlp640 11-10-2011 17:40:18

Cita:

Empezado por rastafarey (Mensaje 415148)
si mas no recuerdo debes espeficicar una cosa de pdu o texto si mas no recuerdo. hay comando para espeficar el modo.

El comando para especificar el formato del mensaje como dice rastafarey es el comando:

Cita:

Para modo PDU
at+cmgf=0

Para modo Texto
at+cmgf=1


La franja horaria es GMT +2. Ahora son las 03:31:14.

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