Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Serielle Schnittstelle spinnt... (https://www.delphipraxis.net/86924-serielle-schnittstelle-spinnt.html)

Dawn87 21. Feb 2007 08:44


Serielle Schnittstelle spinnt...
 
Hallo,

ich schreibe zur Zeit ein Programm was Daten über serielle Schnittstelle von einem Mikrocontroller empfängt.

Jede Sekunde werden 66 bytes eingelesen, diese 66 Bytes werden nur auf Anfrage vom Mikrocontroller gesendet.

Diese Geschichte funktioniert auch wunderbar, soweit. Doch wenn während der Kommunikation die Onlinehilfe aufgerufen wird oder eine andere Aktion im Programm ausgeführt wird, liefert die Funktion READBYTE() aus der freeware PORT.dll nur noch den Wert 255 zurück. Beides hat nichts mit miteinander zu tun (das heißt es wird beim Aufrufen der Hilfe nicht explizit auf die Verbindung zugegriffen).

Hat da jemand eine Idee?

Grüße
Stefan

Muetze1 21. Feb 2007 08:54

Re: Serielle Schnittstelle spinnt...
 
Du programmierst die serielle Schnittstelle im Direktzugriff? Warum (um Gottes Willen)?

Die WinAPI bietet dir zum einen ordentliche Funktionen, welche auch einen Buffer zur Verfügung stellen sowie interrupt-driven arbeiten, damit ist die Systemlast deutlich geringer als dein Weg über das Polling. Auch hast du es deutlich einfacher, wenn du nur fragen musst: ist was da, und wenn ja, gib es mir.

Aber du musst dich ja nichtmal mit den WinAPI Schnittstellen beschäftigen, es gibt genug Bibliotheken, welche dir einfach und sauber eine API zu der seriellen Schnittstelle zur Verfügung stellen (auf Basis der WinAPI). Nutze lieber diese (ich nenne mal 2)

ComPort
Turbo Power ASync Professional

Zu deinem Problem: Du pfuscht Windows damit dazwischen und daher kann keiner genau sagen wie sich Windows verhält, bzw. wann du wem wie dazwischen haust. Der direkte Hardwarezugriff ist nicht umsonst verboten worden...

Dawn87 21. Feb 2007 09:06

Re: Serielle Schnittstelle spinnt...
 
Hallo,

soweit ich weiß ist die PORT.dll ein Wrapper für solche "ordentlichen" Windows Funktionen? Außerdem Polle ich ja nicht wirklich, ich weiß das nach dem senden von "data5" 66 bytes Daten + ein ENTER ($0d) zurückkommen. Das System wird dadurch nicht wirklich ausgelastet:

Delphi-Quellcode:
SendCommand('data5',False);

Sleep(20);

sBuffer := '';

nTime := GetTickCount + 1000;

  bWorking := True;

  for i := 1 to 67 do
  begin
    sChar := Readbyte();

    If GetTickCount >= nTime Then
    begin
      ShowError(105,'Zeitüberschreitung beim Empfangen von Daten (Timeout)');
      CloseConnection;
      bWorking := False;
      Exit;
    end;

    sBuffer := sBuffer + Chr(sChar);
  end;


  for i := 1 to 67 do
  begin
    if sChar = 255 then
      begin
        CloseConnection;
        ShowError(106,'Ungültige Daten empfangen.');
        bWorking := False;
        Exit; // Fehler
      end;
  end;

yörsch 21. Feb 2007 09:57

Re: Serielle Schnittstelle spinnt...
 
wie ich aus dem codeschnipsel sehe, benutz du keinen eigenen thread?!
das könnte einiges anproblemchen verhindern... :spin2:

Dawn87 21. Feb 2007 09:59

Re: Serielle Schnittstelle spinnt...
 
Hallo,

der gepostede Code läuft in einem Timer. Wie verhält sich dieser unter Delphi? Wird automatisch ein Thread für diesen erzeugt? (bin Delphi-Anfänger ;-))

Kann ich in Delphi Textboxen aus einem anderen Thread heraus aktualisieren (bei .NET muss man das z.B. über einen Delegaten regeln).

Grüße
Stefan


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