Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Daten von einem anderen Programm "auffangen" und verarbeiten (https://www.delphipraxis.net/148739-daten-von-einem-anderen-programm-auffangen-und-verarbeiten.html)

schweindi 7. Mär 2010 15:57


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 (174522).

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

thkerkmann 7. Mär 2010 16:27

Re: Daten von einem anderen Programm "auffangen" u
 
Hi,

Es gibt eine OpenSource software, die heisst Com0Com, das könnte dich interessieren.

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

schweindi 7. Mär 2010 16:29

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 :)

schweindi 8. Mär 2010 16:14

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!

schweindi 9. Mär 2010 00:21

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:
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

thkerkmann 9. Mär 2010 07:38

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.

Synaser ist da meine Wahl. Dort kannst du genau festlegen wie es wann weitergeht. Ein sleep ist dafür völlig ungeeignet.

Gruss

schweindi 9. Mär 2010 16:19

Re: Daten von einem anderen Programm "auffangen" u
 
jop danke - jetzt hab ich das ganze mal mit Synaser umgeschrieben... folgendes:

Delphi-Quellcode:
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;
das wird ausgeführt, wenn man den ConnectButton klickt.
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:
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;
dann wird zwar der Befehl geschickt: (monitor) "COM Bridge.exe IRP_MJ_WRITE USBER000 SUCCESS AT+CFUN=1.."
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?

thkerkmann 9. Mär 2010 19:26

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

schweindi 9. Mär 2010 19:37

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.

thkerkmann 9. Mär 2010 20:03

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 01:36 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz