Serielle Schnittstelle ansprechen und pollen
Da ich bisher eigentlich nur Fragen gestellt habe, wollte auch mal was für die Allgemeinheit tun…
Da ich viel Erfahrungen mit seriellen Schnittstellen gemacht habe, hier ein kleines, Crashkurs- artiges Tutorial. Gewisse Kenntnisse über die RS232 und Delphi bzw. API Programmierung setze ich voraus.
1. Benutzte GlobaleVariablen
2. Die Schnittstelle öffnen / schließen / testen
Um die Schnittstelle zu öffnen und ein gültiges Schnittstellen- Handle zu bekommen, ruft man die Funktion CreateFile auf. Vereinfachtes Bsp:
Die Ini Funktion für die Overlapped Strukturen:
Um die Schnittstelle wieder zu schließen (und es gibt X mistige Programm die das vergessen, was zur Folge hat, dass danach andere Programme nicht mehr auf die Schnittstelle zugreifen können) geht man wie folgt vor:
Bevor man jedoch die Schnittstelle öffnet, sollte man vielleicht auch testen, ob Sie denn verfügbar ist (oder ob die tolle Com-Konsole von Pipi Lüdi- Soft vergessen hat die Schnittstelle zu schließen). Dies mach ich ziemlich billig (Verbesserungsvorschläge jederzeit willkommen):
2. Die Schnittstelle konfigurieren:
Die Konfiguration der Schnittstelle erfolgt über den Device Control Block (PortDCB) siehe Windows.pas – TDCB. Mit dieser Struktur lassen sich Parameter wie Baudrate, Flusssteuerung, StopBits usw. setzen und zwar wie im folgenden Beispiel die Baudrate:
Die Hilfe des MS-SDK gibt auch bereitwillig Auskunft zu den verwendeten Funktionen.
3. Abfragen und Setzen der Status Leitungen
Um CTS, DCD, DSR und Ring abzufragen, eignet sich die Funktion GetCommModemStatus.
Bsp:
Um RTS, DTR, XOFF, XON oder einen Break zu setzen oder zurückzusetzen benutzt man die Funktion EscapeCommFunction:
Bsp. Setzen und zurücksetzen der DTR Leitung
In diesem Zusammenhang bedeutet XON/XOFF, dass ein Empfangen der entsprechenden XON/XOFF Chars simuliert wird. Ein Break ist, wenn ich die TX – Leitung dauerhaft auf 1 setze. ACHTUNG, ist ein Break gesetzt und ich versuche zu senden (mit WriteFile), wird das Programm eine sauberen Abgang hinlegen. Am Besten man lässt den Quatsch – braucht eh keiner.
4. Lesen und Schreiben
Jetzt wird’s endlich interessant. Zum Lesen und Schreiben verwendet man die Funktionen ReadFile und wie sollte es auch sonst sein, WriteFile. Eigentlich ist die Benutzung dieser Funktionen im Zusammenhang mit der seriellen Schnittstelle ganz einfach – wenn man ein Programmierbeispiel hat:
An dieser Stelle eine Anmerkung:
Ich habe mir für den Schnittstellen Zugriff zunächst eine Delphi Unit und dann eine DLL geschrieben. Aus der stammen die ganzen Funktionen. Daher übergebe ich auch PChars. Ich bitte etwaige Unelegantheiten im Bezug auf PChar – string zu entschuldigen – die kommen durch das Hin- und Her. Um das ganze als Delphi Unit zu verwenden, sollte überall die Direktive stdcall entfernt werden.
Und nun *Trommelwirbel* das interessanteste:
5. Schnittstellen Polling
Möchte man benachrichtigt werden, wenn auf die Schnittstelle (von aussen) zugegriffen wird (Daten gesendet oder Statusleitungen gesetzt werden), so musste man in grauer Vorzeit die Schnittstelle manuell zyklisch abfragen (Polling). Dies kann man heute sehr elegant mit einem Thread erledigen. Das ganze funktioniert im Groben so:
Man erstelle einen Thread, man halte in an mit der Funktion WaitCommEvent. Der Thread ist nun angehalten und zwar bis eines der Ereignisse eingetreten ist, die man vorher mit SetCommMask spezifiziert hat. Wird der Thread fortgesetzt ist eines der Ereignisse eingetreten. Will man den Thread von „aussen“ aus dem Wartezustand befreien macht man das so:
Hier nun ein Bsp. Für einen Polling- Thread. In diesem Beispiel wird, wenn ein Ereignis eintritt, die Funktion ReleaseEvent aufgerufen, die ich hier weglasse, da sie zu speziell wäre.
Dieser Thread stellt lediglich die Mindestanforderung an einen Polling thread dar. Für den Hausgebrauch (und mehr) sollte das reichen.
So, bevor ich mich noch mehr zu dem Thema auslasse, will ich erst mal sehen ob das irgendein Schwein interessiert.
MfG SchelmVomElm