PDA

Ver la Versión Completa : componentes tpapro (celulares GSM)


tutuk
15-07-2005, 03:16:57
hola como estan?

el problema es el siguiente :

utilizo los componentes tpapro para hacer una aplicacion que reciba mensajes SMS, los procese y los conteste al celular desde el que fue enviado.

ultilizo delphi 6 - winxp

cuando ejecuto el programa en mi pc todo marcha bien pero cuando instalo en otro pc al no .
explico mas o menos como funciona :

con un timer chequeo cada 3 segundos si hay un mensaje nuevo recibido en el telefono (lo tengo conectado al puerto usb), si llega uno lo desarmo al mensaje y asi obtengo el remitente y el cuerpo del mensaje


procedure TForm1.comTriggerAvail(CP: TObject; Count: Word);
var
I : Word;
C : Char;
S : String;
linea:tstringlist;
begin
S := '';
for I := 1 to count do begin
C := com.GetChar; {C de carga con un caracter enviado por el puerto COM}
S := S + C; {se almacenan en S solo los caracteres que deseo}
{De esta manera me queda en S una cadena a mi gusto}
end;
linea:=tstringlist.Create;
linea.CommaText :=s;
if chescuchar.Checked =True then
begin
if linea[0]='+CMGL:' then
begin
{agrego el mensaje a los recibidos}
table1.Append;
table1.FieldByName('fecha').value:=date;
table1.FieldByName('hora').value:=time;
table1.FieldByName('nmens').value:=strtoint(linea[1]);
table1.FieldByName('remitente').value:=linea[3];
table1.FieldByName('mensaje').value:=linea[4];
table1.Post;
if table2.FindKey([strtoint(linea[4])]) then
begin
memo1.Lines.Add('Encontrado ... '+linea[4]+' = ' + table2.fieldbyname('datos').value);
tel.SMSAddress:=linea[3];
tel.SMSMessage:=linea[4]+'='+table2.fieldbyname('datos').value;
tel.SendMessage;
end
else
begin
memo1.Lines.Add(linea[4]+'=No Encotrado');
tel.SMSAddress:=linea[3];
tel.SMSMessage:=linea[4]+'=No Encotrado';
tel.SendMessage;
end;
end;
end;
end;

pero en otro pc parece ser que cuando chequeo el mensaje la respuesta del puerto no es "rapida" o algo asi porque me toma una x cantidad de caracteres y no todo completo. en mi pc anda todo bien.

hay alguna forma de hacer esperar a recibir la cadena completa.

espero haberme hecho entender

gracias por su tiempo

islu
15-07-2005, 12:00:25
Yo ahe utilizado estas librerias en varias ocasiones, y no se si tendrás el mismo problema que tuve yo en una ocasión, pero los sintomas son similares. En mi caso fue con una pístola de EAN, leyendo EAN128 ( bastante largos ), lo que hice fue, simplemente esperar el ASCII #13 ( o #10 ), es decir :


{...}
Completo : boolean; //->Completo es una variable global a la clase
Status : string; //->Variable global también
{...}

procedure TFormEjemplo.PuertoTriggerAvail(CP: TObject; Count: Word);
var
i : integer;
c : char;
begin
for i := 0 to Count - 1 do
begin
c := Puerto.GetChar;
if( (c > #47) and (c < #91) ) then
Status := Status + c;

if( c = #13 ) then Completo := true;
end;

if( Completo ) then
begin
Completo := false;
{...}
{<Cuerpo de tú código>}
{...}
Status := '';
end;
end;

No se si tendrás algún carácter que te indique el fin, o que el SMS esta completo. Puedes provar con una cadena, o algo por el estilo.

Yo solo encontré esta solución, y ahora esta funcionando perfectamente casi 2 años....

Espero haberte ayudado....

tutuk
18-07-2005, 06:24:05
gracias intentare por ahi a ver que pasa