Einzelnen Beitrag anzeigen

schweindi

Registriert seit: 4. Feb 2010
60 Beiträge
 
#5

Re: Daten von einem anderen Programm "auffangen" u

  Alt 9. Mär 2010, 00:21
hmm.. jetzt geht mir das ganze doch schon ziemlich auf die Nerven, manchmal geht das Programm manchmal nicht und ich hab eig keine Ahnung, was ich verändert habe, damit es ging.

Folgendes Problem:

Wenn ich mein Programm starte soll es zuerst "at+cfun=1" ans modem schicken, dann die Antwort des Modems abwarten und dann "at" schicken, wieder die Antwort abwarten. Klingt extrem einfach, doch irgendwie bin ich unfähig!

mein Versuch:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var StartIni : TIniFile;
begin
ComPort1.Port:=Edit1.Text;
//Ini File
StartIni:=TIniFile.Create(ChangeFileExt(Application.ExeName,'.INI'));
try
StartIni.writeString('Com1','Name',Edit1.Text);
finally
  StartIni.Free;
end;
ComPort1.Open;
Memo_text.Lines.Add('-------');
Memo_text.Lines.Add('Connected to '+Edit1.text);
Memo_text.Lines.Add('-------');
Writeln(Logf, 'Connected to '+Edit1.text); //logfile
//set +cfun=1
ComPort1.WriteStr('AT+CFUN=1');
ComPort1.TransmitChar(#13);
Writeln(Logf, 'SEND: AT+CFUN=');
sleep(sleeptime);
Application.ProcessMessages;
//send status
ComPort1.WriteStr('AT');
ComPort1.TransmitChar(#13);
Writeln(Logf, 'SEND: AT');
sleep(sleeptime);
Application.ProcessMessages; //brauch ich da noch eines?
So sleeptime hab ich 10ms,50ms,100ms und 1000ms probiert, es hilft natürlich nichts.
So siehts im Monitor aus:
Code:
REQUEST                  Port       Result       Other

IOCTL_SERIAL_GET_MODEMSTATUS   USBER000    SUCCESS
IRP_MJ_WRITE                   USBER000    SUCCESS   Length 9: AT+CFUN=1
IOCTL_SERIAL_WAIT_ON_MASK      USBER000    SUCCESS
IOCTL_SERIAL_WAIT_ON_MASK      USBER000    SUCCESS
IOCTL_SERIAL_GET_COMMSTATUS    USBER000    SUCCESS
IRP_MJ_READ                    USBER000    SUCCESS   Length 16: AT+CFUN=1...OK..
IOCTL_SERIAL_GET_COMMSTATUS    USBER000    SUCCESS
IRP_MJ_WRITE                   USBER000    SUCCESS   Length 2: AT
daraus schließe ich, dass in der zeile IRP_MJ_READ at+cfun=1 vom modem zurückgesendet wurde und drangehängt "...OK.." wenn ich nach diesem Button dann manuell zb AT eingebe, passiert nichts, keine Antwort vom Modem kein Wait nichts.

Interessant: wenn ich disconnect klicke (ComPort1.Close und dann wieder connecte steht vor der Ausgabe "Answer: OK" dh das Event OnPacket von TComPort1 hat sich eingeschaltet... also ich blicke da nicht mehr durch und kenne mich anscheinend zu wenig aus :S

Was möchte ich?
1) Das Programm soll erst den nächsten Befehl senden, (in dem Fall "AT") wenn es vom Modem eine Antwort bekommen hat
2) Wenn es zum Timeout kommt, soll der Befehl erneut versendet werden.

Danke für jede Hilfe!
Gruß Schweindi
  Mit Zitat antworten Zitat