Kommunikation zwischen AVR und PC überden Virtual Serial Port

Olga Weis

In diesem Artikel wird beschrieben, wie Sie zwischen AVR und PC auf einfache, aber umfassende Weise kommunizieren können. Es ist einfach, weil ich eine eher "klassische" Schnittstelle verwenden werde, um zwischen AVR und PC zu kommunizieren, RS232-Schnittstelle über COM-Anschlüsse. Umfassend werde ich Sie durch den Übergang zwischen AVR und PC führen, wie Sie die Programmschnittstelle RS232 auf dem Computer und auf dem AVR schreiben. Dieser Artikel enthält insbesondere:

Inhalt


  1. Schematische Darstellung und Funktion der COM-Port-Pins am Computer. AVR-Schaltung zum PC über COM-Port.
  2. Erstellen Sie zu Simulationszwecken einen virtuellen COM-Port am PC.
  3. Verwenden Sie Funktionen in der Standard-C-Exportbibliothek wie printf, scanf ... in WinAVR.
  4. COM-Port-Programm auf PC schreiben (Visual C ++, Visual Basic)

1. COM-Port-Übersicht


Ein COM-Port oder ein serieller Port ist ein Kommunikationsport, der Teil der "alternden" Form des PCs ist, sowohl Desktops als auch Laptops. Mit dem Aufkommen und der "Erweiterung" des USB-Standards verschwindet der COM-Port (und entweder der LPT-Port oder der parallele Port). Weitere Informationen zu seriellen Anschlüssen finden Sie in unserem neuer Artikel.

COM-Port-Kommunikation ist RS232 serielle Kommunikation. Dieser Standard ist im Vergleich zu USB ziemlich langsam. Bei der Robotik oder Steuerung ist der COM-RS232 jedoch wegen seiner Einfachheit und wegen dieser Verlangsamung sehr beliebt. COM-Anschlüsse auf vorhandenen Computern (sofern verfügbar) bestehen meistens aus 9-poligen Steckern. Irgendwo gibt es jedoch einen 25-poligen COM-Port, der ungefähr dem LPT-Port entspricht, der jedoch männlich ist, während der LPT-Port weiblich ist.

Need to understand Hauptpunkte über Nullmodems und Pinbelegung RS 232.

Abbildung 1 zeigt zwei Arten von COM-Ports, und Tabelle 1 fasst die Funktionen der Ports zusammen.

9-poliger COM- und 25-poliger COM-Port
Abbildung 1.

pins am COM port
Tabelle 1

Am auffälligsten im Pins des COM-Ports ist die 3-polige 0 V-SG (Signalmasse), die TxD-Datensenderpins und die RxD-Datenempfangspins. Dies sind drei grundlegende Pins für die RS232-Kommunikation und UART-kompatibel beim AVR. Die verbleibenden Pins können auch verwendet werden, wenn der Benutzer mit der Registerorganisation des PCs vertraut ist. In den meisten Fällen werden jedoch nur drei Pins verwendet.

Wie in AVR5-UART angegeben, sind die RS232- und UART-Standards im Allgemeinen in Bezug auf Übertragung, Baudrate ... gleich, unterscheiden sich jedoch in Spannung und Polarität. Siehe das Vergleichsbeispiel in Abbildung 2.

Vergleichen Sie UART und RS232
Abbildung 2.

Im UART-Standard (bei AVR) entspricht der Pegel 1 der hohen Spannung (5 V, TTL), während der Pegel des RS232 1 der niedrigen Spannung (negative Spannung, möglicherweise -12 V) entspricht. Es besteht eindeutig ein Bedarf an einem "Konverter" zwischen den beiden.

Glücklicherweise müssen wir diese Brücke nicht selbst entwerfen, da es spezielle ICs gibt. MAX232 ist einer der am häufigsten verwendeten UART-RS232-Switch-ICs. Natürlich können Sie eine einfache Schaltung mit nur wenigen Komponenten wie Kondensatoren, Widerständen, Dioden und Transistoren erstellen. Die Stabilität ist jedoch nicht garantiert.

Abbildung 3 zeigt, wie Sie mit dem Max232 IC eine Verbindung zwischen UART am AVR und dem COM-Port des PCs herstellen.

Verbinden Sie den AVR über Max232 mit dem PC
Abbildung 3.

Die obige Schaltung bewirkt nur eine Änderung des Spannungspegels zwischen RS232 und UART. Der Kommunikationsmodus dieser Standards wird nicht geändert. Die Programmierung auf PC und AVR ist daher kein Ersatz. In der Tat hat Max232 zwei Transome.

In Abbildung 3 wird nur der Transceiver 1 verwendet. Der TxD-Pin (Pin 3) des COM-Ports, der an den R1IN (Receive 1-Eingang) von Max232 angeschlossen ist, entspricht dem R1OUT (Receive) -1-Ausgang), der mit dem Empfänger RX von verbunden werden muss der AVR. Gleich für T1IN und T1OUT. Der Wert der 10 uF-Kondensatoren ist relativ normal, aber wenn Sie den Kondensator durch 1 uF ersetzen, bleibt der Schaltkreis aktiv, die Übertragungsdistanz (Kabinenstecker) ist jedoch kürzer (wenn zu lange Kommunikationsfehler auftreten). Die Widerstände in Abbildung 3 dienen nur zum Schutz von COM-Ports und ICs. Daher müssen Sie diese Widerstände möglicherweise nicht verwenden, ohne den Betrieb der Schaltung zu beeinträchtigen. Vcc und GND sind Quellen von AVR-Schaltungen.

Hinweis: Wenn Sie über einen COM-Port zwischen zwei Computern kommunizieren möchten, müssen Sie 1 verwenden Crossover-Kabel (Die TxD-Pins von PCx sind mit dem RxD von PC2 verbunden und umgekehrt), um 2 COM-Ports miteinander zu verbinden.

2. Erstellen Sie einen virtuellen COM-Port für die Simulation


Um die Kommunikation zwischen AVR und PC über den COM-Port herzustellen, benötigen Sie offensichtlich einen COM-Port. Außerdem müssen Sie eine AVR-Schaltung erstellen und den Max232 überbrücken. Leider haben nicht alle Computer diesen Port. Wenn Sie nur lernen möchten, wie Sie mit AVR-PC kommunizieren oder einen bestimmten Algorithmus testen möchten, ist die Simulation der Lösung vorzuziehen. Um die RS232-Kommunikation zu simulieren, Proteus ist wieder nützlich, um Datenübertragungen mit COM-Ports zu simulieren.

Das Problem ist also, wie Sie virtuelle COM-Ports auf dem Computer erstellen und diese miteinander verbinden, um Kommunikationssimulationen durchzuführen. Aufgrund der Beschaffenheit des COM-Ports ist nur einmal "offen" (offen), was bedeutet, dass die beiden Programme nicht denselben Port öffnen können.

Unsere Idee ist, zwei virtuelle COM-Ports zu erstellen, die miteinander "gekreuzt" werden (z. B. COM2 und COM3). Im Proteus-Ausgang des UART ist COM2 angeschlossen. In der PC-Software (z. B. HyperTerminal) wird eine Verbindung zu COM3 hergestellt. Auf diese Weise konnten wir zwischen dem AVR (Proteus-Modell) und dem PC (HyperTerminal-Software) kommunizieren.

Es gibt eine gute Software, mit der virtuelle COM-Ports und virtuelle Verbindungen genau so erstellt werden können, wie es von uns gefordert wird. In diesem Abschnitt werde ich eine Software vorstellen Eltima (Virtual Serial Port Driver).

Virtual Serial Port Drive (VSPD) emuliert virtuelle serielle Ports und verbindet sie paarweise über ein virtuelles Nullmodemkabel. Anwendungen an beiden Enden des Paares können Daten so austauschen, dass alles, was an den ersten Port geschrieben wird, im zweiten und rückwärts erscheint.

VSPD ist einfach zu bedienen und stabil. Nach dem wird heruntergeladen Fahren Sie mit der Installation fort, suchen Sie die Datei "Paar hinzufügen" und führen Sie sie aus.

Schnittstelle des VSPD wie in Abbildung 4 gezeigt.

Virtual Serial Port Software-Schnittstelle
Abbildung 4.

Auf der Registerkarte "Managerports" schlägt die Software automatisch vor, dass einige virtuelle COM-Ports erstellt werden können. Sie können sie erneut auswählen und auf "Paar hinzufügen" klicken, um diese beiden COM-Ports zu erstellen. Der von VSPD erstellte virtuelle COM-Port wird in der Windows-Geräteliste angezeigt und geht nicht verloren, wenn der Benutzer die VSPD-Software ausschaltet. Führen Sie den Geräte-Manager von Windows aus. Im Abschnitt Ports (COM und LPT) sehen Sie die erstellten virtuellen COM-Ports (siehe Beispiel in Abbildung 5).

Virtuelle COM-Anschlüsse und Verbindungen zwischen ihnen, die von VSPD erstellt wurden
Abbildung 5.

3. Verwenden Sie die Standardexportbibliothek stdio.h in WinAVR


Wer schon einmal C-Programmiersprache gelernt hat, wird sein erstes "Hallo Welt" -Programm nicht vergessen:

Hallo Welt

Dieses Programm erledigt einfach die Aufgabe, "Hallo Welt" auf dem Bildschirm einzugeben. Der Briefdruck erfolgt durch die "printf" Befehl in Zeile 3. Der printf Befehl ist in der stdio Bibliothek, die Standard-Ein- / Ausgabebibliothek. Der Befehl printf in stdio dient nicht nur zum Drucken auf dem Bildschirm, sondern kann auf jedem Ausgabegerät oder sogar auf einer Computerfestplatte gedruckt werden ...

Für AVR, wenn Sie den Compiler verwenden, wenn Sie anrufen printf, der String wird gedruckt (ausgegeben) das UART-Modul (natürlich müssen Sie zuerst die UART-Register installieren, um den UART zu aktivieren).

CodevisionAVR selbst versteht UART als Standard-Eingabe- / Ausgabegerät für Befehle in der stdio-Bibliothek (printf, scanf ...). Mit WinAVR (avr-gcc) ist jedoch alles andere anders. Um Standardeingabe und -ausgabe verwenden zu können, müssen wir ein Eingabegerät und eine "grundlegende" Eingangsfunktion deklarieren. Die Basisfunktion ist eine vom Benutzer definierte Funktion, deren Aufgabe es ist, ein Zeichen in ein Eingabegerät zu exportieren (oder zu importieren).

In der AVR5-UART-Kommunikation definieren wir beispielsweise eine Funktion "uart_char_tx" Ausgabe von Zeichen an UART wie folgt:

uart_char_tx

Oder in TextLCD betrachten wir die Funktion "putChar_LCD" So geben Sie ein Zeichen auf dem LCD-Bildschirm aus:

putChar_LCD

Beide "uart_char_tx" und "putChar_LCD" wie das obige Beispiel kann als "grundlegende" Importfunktion für Funktionen wie verwendet werden printf ... im Standard sdtio Bibliotheken exportieren. Funktion übernehmen "uart_char_tx" wird verwendet, wenn der angerufen wird printf Funktion wird der String in die UART exportiert.

Im Gegensatz dazu, wenn die "putChar_LCD" Funktion wird als Basisfunktion verwendet, die stdio printf Funktion gibt den Datenstring auf dem LCD aus. Mit dieser Methode können Sie mit dem avr-gcc translator flexibler auf die stdio-Bibliothek zugreifen. Mit den stdio-Funktionen können Sie Daten zu jedem Gerät wie UART-Terminal, TextLCD, Grafik-LCD oder sogar SD-, MMC-Karte exportieren und importieren Sie definieren die Eingangsfunktion "basic".

Um zu zeigen, wie Funktionen in der Bibliothek stdio verwendet werden, zeige ich ein Beispiel für die Eingabe von Daten in Text LCD und uart using stdio's printf .... Die Schaltungssimulation für dieses Beispiel ist in Abbildung 6 dargestellt.

Simulieren Sie ein Beispielausgabebeispiel mit der stdio-Bibliothek
Abbildung 6.

Alle Daten, die auf dem LCD und dem uart-Terminal in Abbildung 6 angezeigt werden, werden über das Display durchgeführt printf und fprintf Funktionen. Auch in diesem Beispiel kann der Benutzer über die Tastatur ein Zeichen eingeben ASCII code. des Schlüssels wird auf dem Terminal gedruckt. Der in Liste1 gezeigte Code.

Exportieren Sie Daten mit der Standard-Exportbibliothek stdio auf LCD und UART
Liste 1.

Um die Funktionen in der Standardausgabebibliothek verwenden zu können, müssen Sie die Bibliothekskopfdatei wie in Zeile 4 einfügen "#include ".

Hinweis Wenn Sie avr-gcc verwenden, befinden sich avr -libc-bezogene Funktionen im "/ avr /" Unterverzeichnis des Include-Verzeichnisses.

Zum Beispiel, Der Header io.h oder interrupt.h enthält spezielle Funktionen für avr. Beim Anhängen dieser Dateien geben wir Folgendes an: "#include " ... Die Standard-C-Sprache (wie stdio.h, math.h, ...) befindet sich jedoch direkt im Include-Verzeichnis. Wenn Sie diese Dateien anhängen, müssen Sie sie direkt wie in der Codezeile 4 schreiben. Sie müssen die Bibliothek kopieren und einbinden myLCD.h wie in Zeile 5 (TextLCD überprüfen).

Wie bereits erwähnt, benötigen wir zur Verwendung der Funktionen in stdio grundlegende Eingabe- / Ausgabefunktionen. Die Zeilen von 7 bis 11 sind uart-Ausgabefunktionen mit dem Namen "uart_char_tx", die als Basisfunktion für die Ausgabefunktionen von stdio verwendet werden. Das"uart_char_tx" Die Funktion wurde in der UART-Lektion besprochen, in der die 8-Zeile geringfügig geändert wurde "if (chr == '\ n') uart_char_tx ('\ r')", Diese Zeile hat die Bedeutung, dass, wenn der Benutzer das Zeichen "\ n" ausgeben möchte, die Funktion "uart_char_tx" das Zeichen ausgibt '\ r'.

Also, wenn Sie auf eine '\ n' (with ASCII code 10, called Line Feed - LF) am Ende des Satzes eine Kombination aus '\ r' + '\ n' (code '\ r' = 13 namens Carriage Return - CR) wird an den Stream gesendet. Um dieses Problem besser zu verstehen, erfahren Sie mehr über den Carriage Return Line Feed (CRLF) in Windows.

Zwei Zeilen Code 13 und 14 sind sehr wichtig, wenn Sie die stdio-Bibliothek verwenden. Die Bedeutung dieser beiden Zeilen besteht darin, zwei virtuelle "FILE" (auch Stream genannt) für den Datenexport zu erstellen. Wir untersuchen Zeile 14: Erstellen Sie einen Stream für die UART.

statisch FILE uartstd = FDEV_SETUP_STREAM (uart_char_tx, NULL, _FDEV_SETUP_WRITE);

Wir erstellen eine Variable namens uartstd (user-named self-named) Dies ist vom Typ FILE (ein virtueller Gerätetyp) und verwendet das Makro "FDEV_SETUP_STREAM" zum Initialisieren und Festlegen der Parameter für uartstd. Dieses Makro hat die Funktion, ein fdevopen zu öffnen und "Werkzeuge" für den Import in das Gerät zuzuweisen.

#define FDEV_SETUP_STREAM (put, get, rwflag)

Der angefügte Parameter "FDEV_SETUP_STREAM" besteht aus einer Basisfunktion namens "stellen", eine grundlegende Funktion aufgerufen "erhalten" und ein Flag, das die Ausgabe- oder Eingabefunktion der geöffneten Vorrichtung anzeigt. Insbesondere ist die Variable uartstd in Zeile 13 ein "virtuelles Gerät", das für die Datenausgabe verwendet wird (aufgrund der _FDEV_SETUP_WRITE Parameter).

Das Werkzeug für die uartstd-Ausgabe ist das "uart_char_tx" Funktion, die wir oben erstellt haben. Es gibt keine Funktion zum Abrufen von Daten von uartstd (get = NULL parameter). Sie können sich das vorstellen: Die Variable uartstd ist ein Blatt Papier, die Funktion "uart_char_tx" ist ein "Stempel", mit dem ein Zeichen auf ein Blatt Papier gedruckt werden kann. Wir vergeben "uart_char_tx" an usrtstd werden dann alle drucke auf uartstd papier von erledigt "uart_char_tx". Die Funktion "uart_char_tx" wird daher als Basisfunktion bezeichnet.

Auf ähnliche Weise erstellen wir in Zeile 13 ein weiteres "Papier" mit dem Namen lcdstd und seine Grundfunktion verlässt die Funktion "putChar_LCD", was bereits in der definiert ist myLCD.h Bibliothek.

Die Zeilen im Hauptprogramm der Zeilen 17 bis 25 beginnen mit UART und TextLCD. Sie können die zugehörigen Artikel überprüfen, um mehr darüber zu erfahren. Nach dem Booten sind UART und LCD für den Datenexport bereit. Nun können wir die Funktionen in der stdio-Bibliothek gerne nutzen printf oder sprint ... um die Daten zu exportieren. Sie werden Abbildung 6 sehen, da ich sie mit den folgenden Codezeilen vergleichen möchte. Zeile 27 "printf (" In lan 1 "), Der Zweck besteht darin, die Zeichenfolge "In lan 1" mithilfe der Funktion printf auf dem LCD-Display zu drucken. Wie in Abbildung 6 gezeigt, wird diese Zeichenfolge jedoch nicht angezeigt.

Schauen Sie sich jetzt Zeile 28 an "fprintf (& lcdstd,"www.eltima.com")" und schauen Sie sich noch einmal Abbildung 6 an, diesmal haben Sie die Zeichenfolge gesehen "www.eltima.com/de/" erscheint auf dem LCD, Erfolgreich mit der Funktion fprintf. Das fprintf Funktion ist eine Funktion, die Daten an ein virtuelles Gerät ausgibt, wobei der erste Parameter der Funktion auf das Gerät zeigt und der zweite Parameter der zu druckende Datenstring ist. In diesem Fall haben wir fprintf zum Exportieren verwendet "www.eltima.com/de/" String zum lcdstd virtuelle Maschine und erfolgreich. Was ist mit der printf-Funktion in Zeile 27? Schauen wir uns die Zeilen von 30 bis 32 an. In Zeile 30 wird wieder die Funktion printf verwendet "printf (" In lan 3 ")" das drucken "lan 3" auf dem LCD aber immer noch nicht erfolgreich (siehe LCD in Abbildung 6). In Zeile 31 weisen wir "stdout = & lcdstd" zu. Dabei ist stdout eine Variable (eigentlich ein Stream oder virtuelles Gerät) der Sprache C, die das Standardgerät für die Dateneingabe definiert. Wenn Sie lcdstd in Zeile 31 stdout zuweisen, erklären wir, dass LCD das Standardeingabegerät ist. In Zeile 32 nennen wir also printf "printf (" Lan lan 4:% i ", x)" wir waren erfolgreich.

Wenn Sie diesmal auf dem LCD schauen, erscheint die Zeile "Lan Lan 4: 8205". Hier ist 8205 der Wert der Variablen x in der Anweisung in Zeile 32. Zusammenfassend ist das fprintf Diese Funktion ermöglicht das direkte Drucken auf ein angegebenes virtuelles Gerät während der Verwendung von printf Funktion müssen wir das Eingabegerät zuweisen. Precedes für die Variable stdout. Schauen Sie sich den Code aus den Zeilen 34 bis 37 und die ersten drei Zeilen im Terminal in Abbildung 6 an, die Sie wahrscheinlich bereits selbst kennen.

Schließlich befindet sich der UART-Datenunterbrechungsserver in den Codezeilen 41 bis 44. In diesem Beispiel führen wir einfach den " Ma ASCII: " Zeile mit dem Wert, der von "Der UART ist im UDR-Register enthalten ist: "fprintf (& uartstd," Ma ASCII:% i \ n ", UDR)".

Um das zu verstehen stdio Bibliothek in WinAVR müssen Sie die Dokumentation "avr-libc Manual", Abschnitt "Standard-E/A-Einrichtungen", lesen.

4. Programmierung mit COM-Port mit Visual Basic und Visual C ++


In vielen Fällen erfordern Kommunikationsanforderungen einen höheren Grad an Komplexität, z. B. Datenspeicherung oder variable Grafik, sodass Benutzer ihre eigenen Programme selbst schreiben müssen. Dieses Lernprogramm zeigt Ihnen, wie Sie Programme zum Übertragen und Empfangen von Daten von einem COM-Anschluss in Visual Basic und Visual C ++ 6.0 auf einem Computer schreiben. Beachten Sie, dass der Zweck dieses Artikels AVR ist. Die Anwendung, die unter Windows geschrieben wurde, habe ich Ihnen so vorgestellt, wie Sie das Prinzip auf einfache Weise verstehen können. Um anspruchsvollere Anwendungen zu entwickeln, müssen sich Leser mit Windows-Programmierkenntnissen auskennen. In allen folgenden Tutorials gehe ich davon aus, dass die wenigsten Leser wissen, wie ein Projekt in Visual Basic und / oder Visual C ++ erstellt wird.

1. Schreiben Sie ein COM-Anschlussprogramm mit Visual Basic 6.0


Seit den späteren Versionen von Windows 2000 war die Kommunikation mit herkömmlichen Computerports, z. B. LPT-Ports, unter Windows relativ schwierig. Mit COM-Ports ist es jedoch ein Glück, dass Microsoft ein Tool (eigentlich ein Steuerelement) mit der Bezeichnung "Microsoft Communication Control" oder kurz MSComm zur Verfügung stellt. MSComm wurde in beliebter MS-Programmiersoftware wie Visual Basic oder Visual C ++ als "Steuerelement" verwendet. Als "Controller" für COM-Ports enthält MSComm alle Tools, die zur Kommunikation mit diesem Port erforderlich sind. Die Aufgabe des Programmierers besteht einfach in der Deklaration und Verwendung. Befolgen Sie die nachstehenden Anweisungen, um die Verwendung von MSComm in Visual Basic zu veranschaulichen.

Führen Sie Visual Basic 6 aus, gehen Sie zum Menü "Datei / Neues Projekt" und erstellen Sie eine "Standard-EXE". Sie sehen ein Projekt mit dem Namen "Project1" mit einem Hintergrunddialogfeld mit dem Namen Form1. Sie können jedes Projekt und Hauptformular benennen. Klicken Sie in der Toolbox-Symbolleiste auf das Steuerelement "Textbox" und zeichnen Sie zwei als Haupttextfelder bezeichnete txtOuput und txtInput (Umbenennen von Textfeldern im Eigenschaftenfenster. Rechts unten rechts). Setzen Sie den Parameter Multiple mit txtOutput auf True und ScrollBars auf "3 - Both".

Setzen Sie als Nächstes das MSComm-Steuerelement in das Hauptformular. Das MSComm-Steuerelement ist standardmäßig nicht in der Visual Basic-Toolbox verfügbar. Wir müssen es der Toolbox hinzufügen, bevor Sie es verwenden können. Um MSComm zur Toolbox hinzuzufügen, wählen Sie das Menü "Projekt/Komponenten". Sie sehen ein Dialogfeld mit dem Namen Komponenten. Suchen Sie und klicken Sie auf "Microsoft Comm Control 6.0", wie in der Abbildung gezeigt, und klicken Sie auf OK. Jetzt sehen Sie in der Toolbox von VB das Symbol von MSComm. Klicken Sie auf dieses Symbol und zeichnen Sie ein MSComm-Objekt im Hauptformular. Behalten Sie den Standardnamen dieses Objekts bei: MSComm1.

Schreibe einen Code :

Dieses Beispiel hat folgenden Zweck: Vom COM-Port empfangene Daten werden im angezeigt txtOutput Textfeld und wenn der Benutzer 1 Zeichen in txtInput Zeichen wird über den COM-Port übertragen.

Doppelklicken Sie zuerst auf das Hauptformular und schreiben Sie den folgenden Code in das Form_Load () Veranstaltung:

Form_Load

Der Zweck dieses Codes besteht darin, die Parameter für MSComm1 festzulegen.

  • CommPort Parameter = 3 bedeutet, dass wir eine Verbindung zum COM3-Port herstellen möchten. Dieser Parameter hängt vom COM-Port ab, mit dem wir kommunizieren möchten.
    Parameter Rahmen = "38400, N, 8.1" bedeutet Baudrate = 38400, Kein Paritätsbit, Frame-Länge ist 8 und 1 Stoppbit.
  • RThreshold = 1 bedeutet, dass bei einem COM-Port mit 1 Zeichen der Datenempfangs-Interrupt auftritt.
  • InputLen = 1 bedeutet, dass beim Lesen von Daten aus dem Empfangspuffer ein Zeichen (1 Byte) gelesen wird.
  • PortOpen = True "offene" COM-Ports können kommunikationsbereit sein.


  • Doppelklicken Sie als Nächstes auf das MSComm1-Symbol im Hauptformular, um den Code in das zu schreiben MSComm1_onComm () Veranstaltung:
MSComm1

Das onComm() Ereignis ist im Wesentlichen ein MSComm-Interrupt-Handler. Wenn ein Datenbyte an den Puffer des COM-Ports gesendet wird (Anzahl der Bytes, die von der RT-Schwelle angegeben wird), wird onComm Wenn ein Ereignis eintritt, schreiben wir den Code, um die Daten zu empfangen und zu verarbeiten. ob. Zeile 2 deklarieren wir eine temporäre Variable namens Eingabetext mit String-Datentyp. Beachten Sie, dass das onComm -Ereignis aus verschiedenen Gründen auftreten kann. Wenn wir uns nur für eingehende Daten interessieren, ist Zeile 3 eine Art "Filter" -Ereignis. Wir führen nur die Codezeile aus, während das comEvReceive -Ereignis (die Daten wird abgerufen):

Wenn Me.MSComm1.CommEvent = comEvReceive Then. Das einzig Wichtige, was zu den an COM gesendeten Daten gelesen werden muss, ist das Lesen des Eingangspuffers von MSComm wie in Zeile 4:InputText = MSComm1.Input. Nach diesem Befehl werden die Daten in der temporären Variablen InputText enthalten. Als Nächstes erhöhen wir einfach die empfangenen Zeichen in den Inhalt des Textfelds txtOutput, um auf dem Bildschirm angezeigt zu werden (Zeile 5): txtOutput.Text = txtOutput.Text + InputText. Zeile 6 ist dafür verantwortlich, den Cursor an das Ende des txtOutput-Inhalts zu bringen, um die Daten einfach anzeigen zu können.

comEvReceive

Doppelklicken Sie anschließend auf das Textfeld "Eingabe" und suchen Sie nach dem KeyPress-Ereignis, um die folgenden Codezeilen zu schreiben:

txtInput_KeyPress Ereignis tritt ein, wenn ein Benutzer eine Taste drückt txtInput. Die Linie Me.MSComm1.Output = Chr (KeyAscii) erfolgt das Senden des Werts von KeyAscii an den COM-Port, KeyAscii is the ASCII Code der gedrückten Taste.

Sie haben den COM-Port über Visual Basic geschrieben. Führen Sie die folgende Simulation aus, um Ihr Programm zu testen:

  • Erstellen Sie mit der VSPD-Software zwei virtuelle COM-Ports COM2 und COM3, kreuzen Sie diese (siehe Abschnitt COM-Port). virtuell).
  • Schauen Sie in den Ordner mit der AVR_STD eBeispiel: Führen Sie die Simulationsdatei mit dem Proteus aus und führen Sie sie aus AVR_STD_Terminal.DSN software.
  • Klicken Sie in Visual Basic auf die Schaltfläche Ausführen oder F5, um das neue Projekt auszuführen.
  • Klicken Sie auf In Proteus ausführen, um die Schaltung zu simulieren AVR_STD_Terminal.DSN. Sie sehen etwas Text txtOutput. Klicken txtInput Geben Sie einen beliebigen Schlüssel ein, um das Ergebnis anzuzeigen. So haben Sie sich erfolgreich eine COM-Anwendung mit COM-Port in Visual Basic geschrieben.

2. Schreiben Sie ein COM-Port-Programm mit Visual C ++ 6.0


In diesem Teil des Lernprogramms wird die Verwendung eines COM-Ports wie im obigen Beispiel beschrieben, es wird jedoch Microsoft Visual C ++ (VC ++) verwendet. Der Hauptzweck besteht darin, eine Anleitung zur Verwendung von MSComm in VC ++ zu geben. Ich werde daher sehr skizzenhafte Teile wie das Erstellen eines Projekts in VC ++ vorstellen. Leser müssen sich mit mehr Wissen über die VC ++ - Programmierung ausstatten. Eines der großartigen Tutorials für Anfänger ist "Teach Yourself Visual C ++ 6 in 21 Tagen" von Sams Teach Yourself, das Sie bei Bedarf lesen können.

Gehen Sie in VC ++ zum Menü "Datei / Neu", um ein neues Projekt zu erstellen. Wählen Sie den Projekttyp als aus "MFC AppWizard (exe)", Klicken Sie im Feld Projektname auf AVR_PC. Klicken Sie auf OK. Wählen Sie im zweiten Dialogfeld "Dialogbasiert" als Projekttyp aus und klicken Sie auf Fertig stellen, um das Projekt zu erstellen (andere Schritte als Standard).

Wenn das neue Projekt erstellt wird, wird ein Dialogfeld mit den Schaltflächen "OK" und "Abbrechen" angezeigt. Verwenden Sie das Werkzeug "Bearbeiten", um 2 "Bearbeitungsfelder" hinzuzufügen und die Benutzeroberfläche neu anzuordnen. Klicken Sie mit der rechten Maustaste auf das Feld Bearbeiten, und wählen Sie im Popup-Menü die Option Proterties aus. Ändern Sie dann die ID der beiden Bearbeitungsfelder in IDC_OUTPUT und IDC_INPUT.

Wie in VB wird Control MSComm nicht standardmäßig in der VC ++ Toolbox angezeigt, die wir hinzufügen müssen, wenn wir dieses Steuerelement verwenden möchten. Gehen Sie in das Menü "Projekt/Zu Projekt hinzufügen/Komponenten und Steuerelemente ...". Wenn das Dialogfeld "Komponenten- und Steuerelementgalerie" angezeigt wird, wählen Sie den Ordner "Registrierte ActiveX-Steuerelemente" aus, navigieren Sie zur Datei "Microsoft Communications Control, Version 6.0", klicken Sie auf die Schaltfläche "Einfügen" und klicken Sie auf "OK", wenn Sie Fragen haben. Klicken Sie auf die Schaltfläche Schließen, um das Dialogfeld zu schließen. Zu diesem Zeitpunkt wird das Symbol von MSComm in der VC ++ - Toolbox angezeigt. Klicken Sie auf das Symbol von MSComm und zeichnen Sie ein Steuerelement im Hauptdialogfeld des Projekts. Standardmäßig heißt dieses Steuerelement IDC_MSCOMM1.

Das Programmieren in VC ++ ist schwieriger als für VB (für Neulinge). Auf Eigenschaften von Steuerelementen wie dem Bearbeitungsfeld kann nicht direkt zugegriffen werden Textbox in VB. Um beispielsweise einen String oder eine Nummer im Edit-Feld zuzuweisen und anzuzeigen, müssen Sie Daten durch Zwischenvariablen zuweisen und aktualisieren. In diesem Schritt erstellen wir zwei Variablen für die 2 Bearbeitungsfelder.

Drücke den "Aussicht / ClassWizard" Menü oder die "Ctrl + W" Tastenkombination in der "MFC ClasWizard" dialog , Wählen Sie die Registerkarte "Member-Variablen". Klicken Sie auf die Linie IDC_OUTPUT, drücke den "Hinzufügen vatiable ..." und geben Sie den Variablennamen ein "m_txtOutput" mit dem typ ist CString.

Wiederholen Sie die obigen Schritte, um eine Variable mit dem Namen zu erstellen "m_txtInput" zum "IDC_INPUT". Erstellen Sie schließlich eine Variable mit dem Namen "m_comm" für IDC MSCOMM1. Klicken Sie auf OK, um das MFC zu schließen ClassWizard Dialogbox. Ab jetzt müssen wir uns nur noch die 3 Variablen merken "m_txtOutput", "m_txtInput", "m_comm" wenn wir beim Schreiben von Code auf die Bearbeitungsfelder und MSComm zugreifen möchten.

Schreibe einen Code:

Drücken Sie Strg + W zum erneuten Öffnen ClassWizard, dieses Mal wählen Sie die "Nachrichtenkarten" Registerkarte, in der "Klassenname" Box dafür sorgen "CAVR_PCDlg" ist ausgewählt. Wählen Sie in Object IDS "CAVR_PCDlg" Mitteilungen" suchen und auswählen "WM_INITDIALOGS" dann klick "Code bearbeiten".

Jetzt können Sie Code für das schreiben "OnInitDilaog ()" event, ein Ereignis, das auftritt, wenn Sie das Programm ausführen und der Hauptdialogfeld gestartet wird. Also werden wir hier die Parameter für m_comm einstellen (m_comm ist der Variablenname, der die darstellt IDC_MSCOMM1 Kontrolle, die wir in den obigen Schritten erstellt haben). Fügen Sie die folgenden Zeilen nach dem hinzu "// TODO: Fügen Sie hier zusätzliche Initialisierung hinzu" Linie:

Diese fünf Codezeilen entsprechen den fünf Zeilen in Form_Load () Abschnitt von Das VB-Projekt, das wir zuvor behandelt haben, muss ich nicht näher auf diese Codezeilen eingehen.

Form_Load

Als nächstes schreiben wir den Code für die onComm Ereignis des MSComm-Steuerelements, bevor Sie den Code schreiben, drücken Sie Ctrl + W Um das ClassWizard-Dialogfeld anzuzeigen, und führen Sie die sechs Schritte aus, um das onComm-Ereignis zum Projekt hinzuzufügen.

Schreiben Sie den sa-Code in die onComm Veranstaltung:

onComm

Wie bereits erwähnt, ist m_comm eine Variable, die MSComm darstellt. Die Handhabung von COM-Ports erfolgt jetzt über die Variable m_comm. In Zeile 4 deklarieren wir eine Untervariable strInput vom Typ CString, die den Wert des letzteren enthält. Wie in VB kann das onComm-Ereignis aus vielen Gründen auftreten.

Wir kümmern uns nur um den Fall, in dem Daten zwischengespeichert werden sollen, Zeile 5 ermöglicht das Herausfiltern des Ereignisses: ob (m_comm. GetCommEvent () == 2). Zeile 6 deklarieren wir eine Subvariable namens in_dat mit dem COleVariant Art. COleVariant ist die Klasse von MFC, ihr Name ist eine Kombination aus C + OLE + VARIANTE in dem OLE ist "Objektverknüpfung eingebettet""Ist ein Objekttyp nicht verfügbar, der eingebettet ist, ist MSComm ein OLE-Typ.

VARIANTE ist ein unbekannter Variablentyp. Wenn Sie eine Variable x haben, möchten Sie manchmal einen numerischen Wert zuweisen x, Manchmal möchten Sie jedoch einen String zuweisen x. Dann erkläre x ist VARIANT. Im Falle von MSComm sind die Eingangs- und Ausgangsdaten dieses Objekts entweder "unbekannt" oder "VARIANT".

In Zeile 7 erhalten wir einfach den Wert von m_comm auf die Variable in_dat: in_dat = m_comm.GetInput(). In der nächsten Zeile "extrahieren" wir das Zeichenfolgenelement aus der Variablen in_dat und weisen Sie die strInput-Variable zu: strInput = in_dat.bstrVal (relativ können Sie in_dat in CString ändern und es strInput zuweisen).

Wir müssen extrahieren CString weil das Bearbeitungsfeld nur angezeigt wird CString. Um die empfangenen Daten im Bearbeitungsfeld anzuzeigen ( IDC_OUTPUT ) Wir haben die Variable erhöht m_txtOutput (dargestellt durch das Bearbeitungsfeld IDC_OUTPUT ) mit Linie 9: m_txtOutput + = strInput. Schließlich für den Wert der m_txtOutput zu aktualisierende Variable im Feld Bearbeiten müssen wir die UpdateData-Funktion mit dem Parameter FALSE als Zeile 10 aufrufen: UpdateData (FALSE) (so funktioniert Visual C ++).

Die Zeilen von 12 bis 14 werden verwendet, um den Cursor am Ende der Zeile der Editierfeld nach dem Ende des Datenempfangs zu positionieren. Sie können es ignorieren, wenn es nicht benötigt wird.

Schreiben Sie abschließend den Code für das Feld Bearbeiten (IDC_INPUT) Wenn wir also tippen, wird das Zeichen an den COM-Port gesendet. Drücken Sie Ctrl + W und führen Sie die folgenden Schritte aus, um sie dem hinzuzufügen onChange Veranstaltung.

Fügen Sie ein onChange-Ereignis für IDC_INPUT hinzu
Abbildung 7.

Schreiben Sie den folgenden Code in die Eingabe-Eingabebox onChange Veranstaltung:

onChange

Wenn der Benutzer ein Zeichen in das Bearbeitungsfeld eingibt, wird die onChange Ereignis tritt ein. Wir extrahieren dann das letzte Zeichen im Text des Bearbeitungsfelds darunter, das die Variable darstellt m_txtInput mit der Befehlszeile 11: tmpStr = m_txtInput.Right (1).

Woher tmpStr ist eine in Zeile 9 deklarierte temporäre Variable. Beachten Sie, dass der Inhalt des Edit-Felds gelesen werden muss. Wir müssen anrufen Daten aktualisieren mit dem vorigen TRUE Parameter wie in Zeile 10. Zum Schluss rufen Sie die Methode auf SetOutput odes MSComm-Objekts zum Senden des COM-Port-Werts: m_comm.SetOutput (COleVariant (tmpStr)).

Um ein Zeichen (oder eine Zeichenfolge) an den COM-Port zu senden, müssen wir das Zeichen zuerst "umwandeln" COleVariant denn wie gezeigt funktioniert MSComm nur mit COleVariant. Absatz COleVariant (tmpStr) macht dies.

Nachdem Sie den Code für das Ereignis onChange geschrieben haben, können Sie drücken Ctrl + F5 um das Programm auszuführen. Verwenden Sie die AVR_STD_Terminal. DSN-Schaltung und führen Sie die Simulation wie bei der Programmierung mit VB durch. Das Ergebnis ist in Abbildung 8 dargestellt.

Kommunikation zwischen AVR und Visual C ++
Abbildung 8.

Virtual Serial Port Driver

Anforderungen: Windows (32 Bit und 64 Bit): XP(nur Standard)/2003(nur Standard)/2008/ Vista/7/8/10, Windows Server 2012, Windows Server 2016 , 5.46MB Größe
Ausführung 9.0.567 (der 5. Aug, 2017) Anmerkungen zur Version
Categorie: Serial Port Software