Schritt 6: Die Windows-Software...
Die Windows-Software wurde mit Microsoft Visual Studio 2015 Update 1 geschrieben. Es ist eine systemeigene C++-MFC-Dialogfeld-basierten Anwendung mithilfe des MFC-Dialogfeld-Assistenten erstellt. Die UI - wurde der Dialog mit der Ressourcen-Editor erstellt. Der Körper des Codes wird durch den Assistenten erzeugt. Ich werde nur die Teile hervorheben, die Kommunikation mit dem Arduino zu demonstrieren. Der Rest des Codes ist in Github hier erhältlich:
https://github.com/alsliahona/CO2LaserWaterFlowMonitor/
Suche nach dem Arduino "COM" Serial port
Nun, da wir über die Tage des MODEMs weitgehend verschoben haben, ist es nicht üblich, viele COM-Ports auf Windows-PC im Einsatz haben. Es ist jedoch möglich, dass Sie USB-Geräte wie Ihre Arduino haben können, mit denen eine COM port als serielle Schnittstelle. Wir können alle der verfügbaren COM-Anschlüsse auf dem PC leicht aufzählen, mithilfe einer for-Schleife die QueryDosDevice aufruft. Haben wir eine Liste der COM-Ports können präsentieren wir die Liste dem Benutzer, so dass sie diejenige auswählen, die ihre Wasser-Strömungswächter ist. Wenn nur ein Element in der Liste können wir automatisch öffnen. Dann starten wir einen Container der CCO2WaterFlowDlg Klasse hinzufügen. Dies ist auf Linie 50 der CO2WaterFlowDlg.h, als eine std::map von zwei Zeichenfolgen. Die erste Zeichenfolge (Schlüssel) ist der COM-Port, den wir anzeigen und öffnen wird. Die andere Zeichenfolge ist DOS Gerätenamen, die wir vor allem für die Diagnostik zu halten.
Die Methode in Zeile 54 deklariert wird verwendet, um den Behälter zu füllen. Es wird in CO2WaterFlowDlg.cpp, Linien 70-78 implementiert:
BuildCOMPortMap() wird aufgerufen, wenn die Anwendung wird gestartet und eine Instanz von CCO2WaterFlowDlg konstruiert wird, wie Sie auf Zeile 94 oben sehen können. Unsere Container werden an dieser Stelle keine COM-Geräte auf dem System vorhanden.
Wenn das Dialogfeld zuerst initialisiert wird sie prüfen in OnInitDialog() zu sehen, wenn COM-Anschlüsse zur Verfügung stehen. Wenn dies nicht der Fall ist, wird eine Meldung an den Benutzer, bat sie um Plug-in-Flow Rate Monitor angezeigt werden. Diese Meldung wird wiederholt, bis der Benutzer auf Abbrechen klickt, oder ein COM-Gerät vorhanden ist. Sehen Sie die Schleife auf Linien 146-155 unter:
Die Liste der verfügbaren Geräte werden in der Dropdown-Liste (ComboBox) angezeigt werden. Dies geschieht, wenn in Zeile 161 über RefreshCOMList() aufgerufen wird. Der Code dafür ist ziemlich standard MFC-Code zum Auffüllen einer ComboBox. Es ist nachfolgend dargestellt:
296-Linien durch 301 eindeutige Einträge in das Kombinationsfeld, während Linien 304 durch 309 hinzufügen jedes Element aus dem Behälter in das Kombinationsfeld. Ein weiterer Container, M_COMSelectionMap wird beibehalten, die die Combo-Box-Eintrags-ID mit der COM-Port verbindet. Klickt der Benutzer auf öffnen, wird dies verwendet werden, ziehen Sie den Namen der COM-Port zu öffnen.
Linie 310 ist das letzte Element hinzugefügt, um das Kombinationsfeld ausgewählt.
Wenn nur ein Element in der Liste (Linie 312) enthalten ist, wird das Element automatisch geöffnet, durch die Simulation einer Benutzer-Klick auf die Schaltfläche öffnen (Linie 316).
Öffnen des COM-Anschlusses
Klickt der Benutzer auf die Schaltfläche öffnen, oder wenn OnBnClickedButtonOpen() aufgerufen wird, durch RefreshCOMList() wird das aktuell ausgewählte Element der Combo-Box verwendet, um den Namen der COM-Port (Linien 221 und 222 unten) zu erhalten:
In Zeile 223 beim Versuch gemacht wird, den seriellen Port zu öffnen. Unterlässt es den Benutzer aufgefordert werden, und ein neues Element auswählen dürfen. Wenn aber wir erfolgreich den COM-Port öffnen, Linien 230-232 sperrt die Tasten Open und Scan-Ports und die Schaltfläche "Set Schwelle" ermöglichen. Sobald die COM-Port geöffnet hat, ist einen Timer zu jeder 1/8 Sekunde schießen. Der Timer-Handler verwendet M_SerialPort das neueste Update (falls vorhanden) aus dem Wasser Flow Monitor zu lesen und es aktualisiert den Status des Dialogfelds angezeigt.
Die ScanPorts Taste tut nichts mehr als wieder aufrufen, BuildCOMPortMap() und RefreshCOMList().
Die ArduinoSerial-Klasse
Die ArduinoSerial-Klasse behandelt alles, was mit öffnen, schließen, lesen und schreiben auf dem Arduino über die serielle Schnittstelle. Es richtet sich speziell an Wasser Flow Monitor, aber kann leicht für andere Bedürfnisse angepasst werden. Es ist in ArdSerial.h wie folgt definiert:
Beachten Sie, dass die Klasse selbst initialisieren ist, weil wir nicht versuchen, den COM-Port zu öffnen, bis wir wissen, was Sie wählen wollen. Wenn Close() aufgerufen wird wird der COM-Port geschlossen werden, wie M_hSerial an CloseHandle() übergeben wird, und M_bConnected wird wieder auf False gesetzt. Da dies ein RAII-Klasse ist, es wird automatisch bereinigen (z. B. Schließen Sie den Griff) wenn der Destruktor aufgerufen wird – dies geschieht durch den Aufruf von Close().
Wir haben bereits gesehen, wo die Open() Methode in der CCO2WaterFlowDlg.cpp OnBnClickedButtonOpen() [Zeile 223 CO2WaterFlowDlg.cpp] aufgerufen wird. Sie werden feststellen, dass diese M_SerialPort eine Instanz von ArduinoSerial wie in Zeile 52 der CO2WaterFlowDlg.h erklärt wird:
Parameter "CreateFile" und Einstellung COM
Öffnen des Gerätes, sobald wir wissen, dass den COM-Port ist einfach eine Frage des Anrufers CreateFile gefolgt durch Aufrufe von GetCOMState und SetCOMState, die die Baud-Rate und anderen seriellen Parameter gesetzt. 26 bis 50 Zeilen unterhalb zeigen den Aufruf von CreateFile und die Benutzerführung auf Fehler:
Mit dem offenen Port wir den COM-Zustand erhalten und anzupassen, um eine 9600 Baud-Rate (fühlen Sie sich frei, dies zu ändern, wenn Sie möchte, aber passen die Änderung in Ihrer Arduino-Skizze!) zu verwenden Alle restlichen Aufbau der COM-Port ist unten dargestellt. Obwohl es eine Menge Code aussieht, gibt es nicht viel zu erklären:
Beachten Sie den Aufruf von PurgeComm auf Linie 87 und den Schlaf auf Linie 89. Jedesmal, wenn Sie an den seriellen Port auf dem Arduino verbinden wird das Gerät zurückgesetzt.
Lesen und Schreiben von/nach dem Arduino
Da wir gezielt die Kommunikation mit dem Arduino sehr einfach, die ArduinoSerial lesen und Write-Methoden beschränken sich auf eine vollständige Lesung gehalten haben, Null beendet Textzeile, und ein einzelnes Byte zu schreiben. Sie haben bemerkt die Erklärung unserer lesen Sie Puffer in Zeile 45 der ArdSerial.h als auch die privaten Member-Funktion, die ReadAvailable() in Zeile 47 erklärt. ReadAvailable wird verwendet, um neue Daten von der seriellen Schnittstelle zu unserem Puffer anfügen. Es sieht wie folgt aus:
(Beachten Sie der Kommentar in Zeile 124 ist eine Übertragung aus dem Arduino Seriennummer Beispiel hier:
http://playground.arduino.cc/Interfacing/CPPWindows). In Zeile 122 wird ein temporärer Puffer die Größe, welche Spiele die lesbaren Bytes berichtet, durch den Aufruf von ClearCommError auf Linie 114 zugeordnet. Diese Bytes werden in unserer temporären Puffer (vArray) lesen, on Line 126. Und auf Linien 131 bis 134 sind diese Bytes an M_vBuffer angehängt.
ReadAvailable() wird aufgerufen, jedes Mal, wenn ReadNullZString() aufgerufen wird, und ReadNullZString überträgt nur die erste Null-terminierten String in den Puffer auf die Ausgabe StrRead:
Schreiben auf dem Arduino ist sehr einfach-- und dies ist im großen Teil, weil wir immer nur ein einzelnes Byte verwendet, um den Schwellenwert zu aktualisieren zu senden müssen:
Binden es zurück auf die Benutzeroberfläche
Der Timer, der bereits erwähnt wurde, die jede 1/8 Sekunde feuert m_Serial.ReadNullZString() rufen. Wenn eine Zeichenfolge verfügbar ist wird es dann analysiert die Zeichenfolge und die Benutzeroberfläche aktualisiert. Dies ist teilweise unten dargestellt. (Durchsuchen Sie die Github-Code zu sehen, der Rest des Codes)
Eine wichtige Sache zu beachten... Der "Durchfluss" angezeigt basiert auf den Spezifikationen für den Flow Rate Sensor. Verwenden Sie ein anderes Durchflusssensor Rate, einstellen Sie die Mathematik ab Zeile 275 nach Vorgaben des Sensors.
Festlegen des Schwellenwerts
Das letzte, zu decken ist, wie wir die neue Schwelle an den Arduino senden. Sie haben wahrscheinlich schon basierend auf den oben stehenden Code erraten, nennen wir einfach m_SerialPort.WriteByte() mit der neuen Schwelle. Korrekt wäre. Der Code ist sehr einfach, wie Sie unten sehen können:
Auf Linie 329 ist der Schwellenwert von der Benutzeroberfläche zu lesen und umgewandelt zu einem BYTE auf Linie 330 und Arduino auf Linie 331 an. Sie erinnern von der Arduino-Skizze, damit die Hauptschleife unterbrechen, passen Sie die Alarmschwelle, und starten Sie dann die Hauptschleife.