![]() |
Daten von einem anderen Programm "auffangen" und v
sodala, wieder mal ich :)
mit großer Hilfe habe ich endlich mein Programm, dass mit einem Modem kommunizieren kann, fertiggestellt ( ![]() Jetzt bin ich mir garnicht sicher, ob die folgende Frage hier reinpasst, aber irgendwie hat sie doch mit Win API zu tun, denke ich. Wie ich schon in der oben genannten Frage geschrieben habe, ist die Software die wir verwenden alt und nicht kompatibel mit dem neuen Modem. Jetzt hab ich mir gedacht es müsste doch möglich sein, mit einem Programm die Daten/ Befehle die dieses SMS-Programm an den Com Anschluss sendet "abzufangen" und dann richtig verarbeitet weiterzuschicken. Leider fallen mir da auf Anhieb kaum gute Wege ein. Hat jemand vielleicht eine Idee, wie man das -eher leicht- machen könnte? (Ich hab mir mal angeschaut, wie leicht es wäre einen "virtuellen" com Anschluss zu erstellen und die Software auf diesen einzustellen um die empfangenen Daten dann ans richtige Modem weiterzusenden, doch das sah auf den ersten Blick extrem aufwendig aus, da man einen eigenen Driver bräuchte) Danke im Voraus |
Re: Daten von einem anderen Programm "auffangen" u
Hi,
Es gibt eine OpenSource software, die heisst ![]() Diese simuliert zwei serielle Schnittstellen, die miteinander verbunden sind. Wenn Programm A mit einer dieser Schnittstellen spricht, könnte Programm B die Gegenstelle auf der anderen Schnittstelle sein, und dein Modem hängt dann tatsächlich an der realen Schnittstelle C, und wird von Programm B versorgt. Gruss |
Re: Daten von einem anderen Programm "auffangen" u
das klingt ausgezeichnet, könnte genau das sein, was ich suche - danke ich schaus mir mal an :)
|
Re: Daten von einem anderen Programm "auffangen" u
jop, danke es war genau das was ich gesucht habe.
Ich hab zwar noch bisschen Probleme die Timeouts mit dem anderen Programm übereinzustimmen, deshalb werden manche Antworten schon gesendet, obwohl die Anfrage noch nicht ganz empfangen wurde, aber das mach ich noch. Mit sleep() und die Timeouts richtig einstellen, dann sollte es gehen. danke! |
Re: Daten von einem anderen Programm "auffangen" u
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:
So sleeptime hab ich 10ms,50ms,100ms und 1000ms probiert, es hilft natürlich nichts.
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 siehts im Monitor aus:
Code:
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.
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 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 |
Re: Daten von einem anderen Programm "auffangen" u
Hi,
ich würde dafür nicht TComport nehmen. Dies ist eine Ereignisgesteuerte Komponente. Wenn man warten will/muss, sollte man einen blockierenden Ansatz verwenden. ![]() Gruss |
Re: Daten von einem anderen Programm "auffangen" u
jop danke - jetzt hab ich das ganze mal mit Synaser umgeschrieben... folgendes:
Delphi-Quellcode:
das wird ausgeführt, wenn man den ConnectButton klickt.
procedure TForm1.Button2Click(Sender: TObject);
var StartIni : TIniFile; Answer : string; begin ComPort1.Connect(Edit1.Text); //Ini File StartIni:=TIniFile.Create(ChangeFileExt(Application.ExeName,'.INI')); try StartIni.writeString('Com1','Name',Edit1.Text); finally StartIni.Free; end; //Modem Configuration ComPort1.Config(com_rate, com_bits, Char(com_parity), com_stop, com_softflow, com_hardflow); Memo_text.Lines.Add('-------'); Memo_text.Lines.Add('Connected to '+Edit1.text); Memo_text.Lines.Add('-------'); Writeln(Logf, 'Connected to '+Edit1.text); //Modem status ComPort1.SendString('AT'+#13#10); Writeln(Logf, 'SEND: AT'); Answer := ComPort1.RecvString(readtotal); if (Answer = 'OK') then begin if Logout then Writeln(Logf, 'RECIEVED: '+Answer); if Memoout then Memo_text.Lines.Add('RECIEVED: '+Answer); end else begin Memo_text.Lines.Add('RECIEVED: no answer!'); Memo_text.Lines.Add('ERROR: '+IntToStr(ComPort1.LastError)); end; ComPort1.Flush; //set +cfun=1 ComPort1.SendString('AT+CFUN=1'+#13+#10); Writeln(Logf, 'SEND: AT+CFUN=1'); Answer := ComPort1.Recvstring(readtotal); if (Answer = 'OK') then begin if Logout then Writeln(Logf, 'RECIEVED: '+Answer); if Memoout then Memo_text.Lines.Add('RECIEVED: '+Answer); end else begin Memo_text.Lines.Add('RECIEVED: no answer!'); Memo_text.Lines.Add('ERROR: '+IntToStr(ComPort1.LastError)); end; end; Readtotal : Integer -> da hab ich zb 500 bzw 1000 eingegeben und es ging eigentlich. aber nach "AT+CFUN=1" bekomme ich keine Antwrot mehr... und wenn ich manuell die Befehle eingebe:
Delphi-Quellcode:
dann wird zwar der Befehl geschickt: (monitor) "COM Bridge.exe IRP_MJ_WRITE USBER000 SUCCESS AT+CFUN=1.."
procedure TForm1.Button4Click(Sender: TObject);
var Str: String; begin //write to port Str := Edit2.Text; ComPort1.SendString(str+#13+#10); // string type variable if logout then Writeln(Logf, '(ComPort1) SEND: '+str+' #13 #10'); if memoout then Memo_text.Lines.Add('SEND: '+str+' #13 #10'); ComPort1.RecvString(readtotal); if memoout then Memo_text.Lines.Add('Answer: '+str); Edit2.Clear; end; aber ich bekomme keine Antwort zurück......... und allgemein, wie kann ich, wie bei TComPort das Programm warten lassen, so dass es sofort, wenn es einen Input bekommt etwas macht... Klartext: Programm startet -> connect drücken (den code oben ausführen) -> Programm ist fertig, es bleibt offen -> Modem sendet irgendwas -> Programm "wacht auf" und macht was mit dem Befehl, den es bekommen hat. wie könnte das gehen? |
Re: Daten von einem anderen Programm "auffangen" u
Ich kenne jetzt TComPort nicht im Detail, aber ich denke es hat dafür ein Event
Sowas wie OnReadData oder so Schau mal im OI auf die Events - da sollte was dabei sein. Gruss P.S. Nochwas zu Synaser Wenn Du ReadString (timeout:integer) verwendest, dann ist der timeout in millisekunden. Du solltest wirklich mal ein Terminalprogramm (Hyperterm oder so) verwenden, und testen, ob deine Annahmen bzgl. des Timings stimmen. Gruss |
Re: Daten von einem anderen Programm "auffangen" u
naja ich verwende ja Synaser.
Stimmt der gepostete code so? ja ich weiß, dass es sich um ms handelt. Ich hab auch schon im hyperterm alle meine Befehle durchprobiert, um zu sehen, wie die Antworten des Modems sein werden. Aber wie bekomme ich die genauen timings?? Ich wollte nämlich genau die einstellungen von hyperterm nachahmen, da die ja sichtlich funktioniert haben. |
Re: Daten von einem anderen Programm "auffangen" u
Ansich sieht das gut aus, was du da machst.
Ich kenne die AT Befehle nicht, die Du da verwendest. Was sollte denn deiner Meinung nach dem AT+CFUN=1 passieren ? Es kommt ja nicht darauf an, die genaue Zeit zu warten, es geht um eine maximale Zeit. Also 5000 msec wären nicht zuviel, wenn die Daten früher einlaufen, werden sie auch früher geliefert und das Programm geht weiter. Noch ein Tipp zu Comport.Config () Die Stoppbits solltest Du mithilfe der Konstanten aus Synaser einstellen, denn: 0 = 1 stoppbit 1 = 1,5 stoppbits 2 = 2 stoppbits Synaser kennt SB1, SB1andHalf, SB2 das kann schonmal sehr wichtig werden. Gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz