Autor Beitrag
CASS
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 160

WIN XP
D7 Enterprise
BeitragVerfasst: Fr 17.12.04 12:32 
Hallo Leute,

ich hoffe das ihr mir eine Anregung geben könnt, wie ich das folgende Realisieren kann.

Ich habe eine Com-Port Komponente über die ich den Com-Port abfragen kann, etwas hinschicken kann, und ein "On-Receive" Ereignis einstellen kann.

Wofür das alles:
Ich möchte vom PC aus ein anderes Gerät über den Com-Port steuern. Das Gerät verlangt eine Art Handshake (Ich schicke ne Anfrage, das Gerät antwortet mit Freigabe oder keine Freigabe, dann folgt der eigentliche Befehl von mir). Jetzt ist es aber so, dass das Gerät auch Meldungen abschickt, ohne das ich eine Abfrage mache. Diese Meldungen muss ich auch anzeigen können, dafür benötige ich das onReceive ereignis.

Das Problem:
Ich muss je nachdem welchen Befehl ich weg sende, die Antwort anders Auswerten, weswegen ich nicht immer ein Standard OnReceive ereignis hernehmen kann. Wie kann ich jetzt für die 5 sec. in der ich einen Befehl sende und die antwort erhalte das OnReceive ereignis abschalten?

Zusätliche Schwierigkeit:
Das ganze soll dann auch noch über LAN funktionieren.

Danke allen schon mal die sich damit Befassen,
Benny
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Fr 17.12.04 12:56 
wie wärs mit sowas?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
// globale Konstanten und Variablen
const 
  TD_STANDARD   = 0;
  TD_BEFEHL01   = 1;
var
  iWhatToDo     : integer;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
// im OnRecieve:
case iWhatToDo of
  TD_STANDARD : blabla;
  TD_IRGENDWAS: begin
                  blabla;
                  iWhatToDo := TD_STANDARD;
                end;
end;



ausblenden Delphi-Quelltext
1:
2:
3:
// wenn du einen Befehl schickst
iWhatToDo := TD_BEFEHL01;
SendeAnComPort(..);  // den Befehl an den COM-Port senden


Geht nur, wenn du dir sicher bist, dass nachdem du einen Befehl an das Gerät geschickt hast, dir das gerät auch mit sicherheit als nächstes darauf antwortet!


MrSaint

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
CASS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 160

WIN XP
D7 Enterprise
BeitragVerfasst: Fr 17.12.04 13:04 
Hey, Danke für die Schnelle antwort,
der ansatz ist ganz gut.
Muss ich mal testen wenn ich zuhause bin.

Nur eine Frage, wozu brauch ich die globalen Konstanten???

THX Nochmal
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Fr 17.12.04 13:10 
Also warum du die globale Variable brauchst ist denke ich klar. Die Konstanten sind nur zum "Überblick", dass man den Quellcode nachher einfacvh besser lesen kann. Mit den Konstanten kann man halt
ausblenden Delphi-Quelltext
1:
iWhatToDo := TD_BEFEHL01;					

schreiben statt
ausblenden Delphi-Quelltext
1:
iWhatToDo := 1;					

-> Leichter lesbar :)
Außerdem: Wenn du später mal die Funktionen irgendwie änderst und Konstanten drin hast, dann brauchst du die "Kennzahl" der Funktion nur einmal bei der Konstante ändern, sonst müsstest du jedes Vorkommen dieser Kennzahl suchen und per Hand ersetzen...


MrSaint

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
CASS Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 160

WIN XP
D7 Enterprise
BeitragVerfasst: Fr 17.12.04 13:18 
OK, merci ;-)

Aber ein Problem hab ich noch:
Ich muss vor jedem schicken eines Befehls einen Handshake machen.
Das heißt Befehl hinschicken, Auswerten ob OK oder NICHT OK zurückkommt
und dann wenn OK zurück kommmt den eigentlichen Befehl schicken (gibt viele verschiedene).
Zusätzlich muss ich noch irgendwas einbauen, dass ich merk, wenn etwas an
der Verbindung nicht stimmt, und mir das Gerät gar keine antwort schickt.
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Fr 17.12.04 14:31 
CASS hat folgendes geschrieben:
Ich muss vor jedem schicken eines Befehls einen Handshake machen.

Also das sollte das kleinere Problem sein. Ich würd da einfach ne function schreiben, welche das "abkapselt". Also bisschen Pseudo-Code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function SendMessageToCOMPort:boolean;
begin
  HandshakeSenden;
  if HandshakeOK then
    EigentlicheMessageSenden
  else
    result := false;
end;

Dann rufst du in zukunft einfach nur noch SendMessageToCOMPosrt auf und überprüfst, ob da false zurück kommt.
Zitat:
Zusätzlich muss ich noch irgendwas einbauen, dass ich merk, wenn etwas an
der Verbindung nicht stimmt, und mir das Gerät gar keine antwort schickt.


Das is wahrscheinlich etwas komplexer. Ich würde das nun mit nem Thread machen. Und zwar läßt nen Thread laufen, der ständig überprüft, ob die Message schon angekommen ist (das is einfach per Boolean-Variable zu lösen) und wenn die Message dann da is, dann würd ich den Thread beenden. Daneben würd ich nen zweiten Thread laufen lassen, mit dem du per Suche im MSDN WAITFORSINGLEOBJECT auf den ersten wartest und ne Zeitspanne angibst, wie lang du maximal warten willst (wär dann dein timeout). Ist diese Zeitspanne abgelaufen und du hast noch keine antwort bekommen, gibst ne menldung aus.

Zur Einführung in Threads: www.pergolesi.demon....rog/threads/ToC.html , www.delphi-source.de...ials/threads/?page=1 und tutorials.luckie-online.de/ (@Luckie: diesmal hab ich deinen link auch dabei ;) )



MrSaint

P.S.: Evtl. hat aber auch deine COM-Koponente einen Timeout! Einfach mal nachschauen!

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems