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