Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi COM-Port ließt nach Neustart nicht (https://www.delphipraxis.net/144425-com-port-liesst-nach-neustart-nicht.html)

Jens Hartmann 7. Dez 2009 17:17


COM-Port ließt nach Neustart nicht
 
Hallo zusammen,

habe einen Interesanten Fehler in meinem Programm. Ich lese wie vieleicht mittlerweile bekannt, Daten von der seriellen Schnittstelle ein, verarbeite diese und archivier die Daten dann in einer DB.

Nach dem ich jetzt mehrere Test durchgeführt habe, ist mir aufgefallen, das wenn ich das Programm in die Autostart von Windows lege, an dem PC einen Stromausfall simuliere, und dieser dann wieder gestartet ist, meine Programm zwar sauber und ohne Fehler
startet, die Verbindung aufbaut, (soweit mann das bei der seriellen Schnittstelle Verbindung nennen kann. Ich gehe ja nur in einen Lesemodus, da die Hardware nur senden kann.) jedoch keine Daten lesen tut.

Trennen ich die Verbindung jetzt manuell mit der Funktion
Delphi-Quellcode:
ComPort.Close
und starte Sie erneut, mit
Delphi-Quellcode:
ComPort.Open
,
werden sofort Daten gelesen.

Die serielle Schnittstelle lese ich mit der ComPortLib Komponente aus über die Komponente ComDataPacket.

Hat jemand eine Idee, wie ich das Problem beseitigen kann, ohne den ComPort 2 mal zu öffnen und zu schließen. :gruebel:

MFG

Jens

letsfetz 7. Dez 2009 17:28

Re: COM-Port ließt nach Neustart nicht
 
Ich würde mal versuchen länger zu warten, damit alle Windowsfunktionen vollständig zur Verfügung stehen. Probier mal ob du den Programmstart nicht irgenwie um 30 sek verzögern kannst.

Kann sein, muss aber nicht ;-)

Jens Hartmann 7. Dez 2009 17:30

Re: COM-Port ließt nach Neustart nicht
 
Denn Programmstart in der Autostart, oder vieleicht einen Timer, der erst 30 Sek. später die Verbindung herstellt.

Gruß Jens

WoGe 7. Dez 2009 17:31

Re: COM-Port ließt nach Neustart nicht
 
Hallo
was für eine Hardware ist Dein serieller Port - Ein Echter oder USB2Seriell?
Bei letzterem empfiehlt es sich eine Einschaltreihenfolge zu beachten: Erst die Geräte und dann den Rechner.

Gruss
wo

Jens Hartmann 7. Dez 2009 17:57

Re: COM-Port ließt nach Neustart nicht
 
Es ist ein ganz normaler serielle Port

MFG

Jens

divBy0 7. Dez 2009 19:33

Re: COM-Port ließt nach Neustart nicht
 
Hast du mal mit Portmon geschaut was mit dem Port passiert?

letsfetz 7. Dez 2009 20:27

Re: COM-Port ließt nach Neustart nicht
 
Zitat:

Zitat von Jens Hartmann
Denn Programmstart in der Autostart, oder vieleicht einen Timer, der erst 30 Sek. später die Verbindung herstellt.

Gruß Jens

Nein ich meine ein Programm im Autostart, welches dein Prog. erst startet wenn alle Windowsdienste laufen. Ich sag dies deshalb weil ich auch schon so ähnliche "Timingprobleme" hatte, da das Programm direkt im Autostart war und im Form.Create Sachen passiert sind die im Windows während der Startphase einfach noch nicht zur Verfügung standen.

Jens Hartmann 8. Dez 2009 19:50

Re: COM-Port ließt nach Neustart nicht
 
Zitat:

Zitat von divBy0
Hast du mal mit Portmon geschaut was mit dem Port passiert?

Nein habe ich nicht. Werde ich aufjedenfall mal machen. Jedoch kann ich an Hand von meinem Programm erkenne, das Daten kommen. Ich habe eine Control-LED programmiert, die immer dann AKTIV ist, wenn die Funktion "READPACKET" durchlaufen wird.

Daher weiß ich das aufjedenfall gelesen wird. Aber mit PortMon werde ich mal testen.

Zitat:

Zitat von letsfetz
Nein ich meine ein Programm im Autostart, welches dein Prog. erst startet wenn alle Windowsdienste laufen. Ich sag dies deshalb weil ich auch schon so ähnliche "Timingprobleme" hatte, da das Programm direkt im Autostart war und im Form.Create Sachen passiert sind die im Windows während der Startphase einfach noch nicht zur Verfügung standen.

Da gebe ich Dir recht. Ich habe allerdings, meine Funktion wie folgt aufgebaut...

Delphi-Quellcode:

...Form.Create
begin
..
COMConnectTimer.Intervall := 30000;
COMConnectTimer.Enabled := true;
...
end;
...
procedure TForm1.COMConnectTimer(Sender: TObject);
begin
  ComPort1.Close;
  ComLoadSettings;
  ComPort1.Open;
  COMConnect.Enabled := false;
end;

procedure TForm1.ComLoadSettings;
var
  Pfad :String;
  AppDataDir : string;
  sMessage : String;
begin
try
  AppDataDir := GetSpecialFolder(CSIDL_COMMON_APPDATA) + strAppDataDir;
  if not DirectoryExists(AppDataDir) then
  begin
    Servicememo.Lines.Add('Der Pfad '+AppDataDir+' konnte nicht gefunden werden'+#13+
                          'ComPort wurde nicht initialisiert');
  end
  else
  begin
  ComPort1.LoadSettings(stIniFile, AppDataDir + strIniFName);
  Servicememo.Lines.Add('ComPort wurde initialisiert am: '+DateTimeToStr(Now));
  Servicememo.Lines.SaveToFile(AppDataDir + 'Service.txt');
  end;
except
  on e : Exception Do
  begin
    sMessage := e.Message;
    Servicememo.Lines.Add(sMessage);
  end;
end;
end;
Danke schon mal für Eure Tips.

Gruß Jens

Jens Hartmann 9. Dez 2009 16:55

Re: COM-Port ließt nach Neustart nicht
 
Hallo zusammen,

ich habe den Fehler gefunden. Da ich mit einem ComPort DataPacket arbeite, und meine Software mehrere Hardwarekomponenten enthält, muss dieses Packet beim herstellen der Verbindung die entsprechenden Start und Stop Strings zur Verfügung haben.

Da diese Funktion nicht beim Form.Create oder BeforComPort.Open durchgeführt wurde, sondern fehlerhafter weiße :wall: in der Manuellen Verbindungsoption BTVerbinden.Click, konnte natürlich dieser String nie gesetzt werden. Nach dem manuellen Trennen und erneuten Verbinden war ja dann die Funktion da.

Ich habe die Hardwareanpassung jetzt mit in das in die Funktion ComPortLoadSettings verlegt und siehe her, es funktioniert.

Dooffer Fehler. Naja, gefunden beseitigt und geprüft.

Danke trotz nochmal für die nützlichen Tips. :thumb:

Gruß Jens

Jens Hartmann 15. Dez 2009 21:26

Re: COM-Port ließt nach Neustart nicht
 
Hallo Leute,

ich hatte zwar das Problem gelößt, bin aber doch mal auf den Vorschlag mit dem Programm zum Starten eingegangen, um wirklich solche Laufzeiten etc. mal ausgleichen zu können. Wollte jetzt mal von Euch wissen, ob das so der richtige Weg ist. Hier mal der Code...

Delphi-Quellcode:
procedure TPSStarter.ProgbarTimerTimer(Sender: TObject);
var
  Zeit : integer;
begin
  ProgBarStatus.Position := ProgBarStatus.Position + 200;
  Zeit := (Starter.Interval - ProgBarStatus.Position);
  Zeit := Zeit div 1000;
  Label1.Caption := 'Noch '+IntToStr(Zeit)+' Sekunden bis zum Start von Print && Save';
end;

procedure TPSStarter.StarterTimer(Sender: TObject);
begin
if FileExists('.\Print & Save.exe') then
  begin
    ShellExecute(Application.Handle, 'open', ('.\Print & Save.exe'), nil, nil, SW_ShowNormal);
    Starter.Enabled := false;
    ProgbarTimer.Enabled := false;
    PSStarter.Close;
  end
  else
  begin
  ShowMessage('Beim Start von Print & Save ist ein Fehler aufgetreten'+sLineBreak+
              'Bitte starten Sie Print & Save erneut'+sLineBreak+sLineBreak+
              'Sollte es erneut zu einem Fehler kommen wenden Sie sich bitte an: '+sLineBreak+
              'hartmann + uebach Nachrichtentechnik GmbH'+sLineBreak+
              'Tel: 02739/8965-0');
  PSStarter.Close;
end;
end;

end.
Danke schon mal für Euro Kommentare.

Gruß Jens


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:22 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