AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Daten von einem anderen Programm "auffangen" und verarbeiten

Daten von einem anderen Programm "auffangen" und verarbeiten

Offene Frage von "schweindi"
Ein Thema von schweindi · begonnen am 7. Mär 2010 · letzter Beitrag vom 13. Mär 2010
Antwort Antwort
Seite 1 von 3  1 23   
schweindi

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

Daten von einem anderen Programm "auffangen" und v

  Alt 7. Mär 2010, 15:57
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
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Daten von einem anderen Programm "auffangen" u

  Alt 7. Mär 2010, 16:27
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
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
schweindi

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

Re: Daten von einem anderen Programm "auffangen" u

  Alt 7. Mär 2010, 16:29
das klingt ausgezeichnet, könnte genau das sein, was ich suche - danke ich schaus mir mal an
  Mit Zitat antworten Zitat
schweindi

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

Re: Daten von einem anderen Programm "auffangen" u

  Alt 8. Mär 2010, 16:14
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!
  Mit Zitat antworten Zitat
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
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Daten von einem anderen Programm "auffangen" u

  Alt 9. Mär 2010, 07:38
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
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
schweindi

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

Re: Daten von einem anderen Programm "auffangen" u

  Alt 9. Mär 2010, 16:19
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?
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Daten von einem anderen Programm "auffangen" u

  Alt 9. Mär 2010, 19:26
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
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
schweindi

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

Re: Daten von einem anderen Programm "auffangen" u

  Alt 9. Mär 2010, 19:37
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.
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Daten von einem anderen Programm "auffangen" u

  Alt 9. Mär 2010, 20:03
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
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:55 Uhr.
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