![]() |
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 |
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) ![]() ![]() 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... |
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; |
Re: Serielle Schnittstelle spinnt...
wie ich aus dem codeschnipsel sehe, benutz du keinen eigenen thread?!
das könnte einiges anproblemchen verhindern... :spin2: |
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 18:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz