Delphi ist ein visuelles Tool zur schnellen Anwendungsentwicklung mit den Vorteilen leistungsstarker Funktionen, Benutzerfreundlichkeit und schneller Codeausführung. Viele Programmierer sind bereit, Delphi als Entwicklungstool zu wählen . Der Wermutstropfen ist jedoch, dass Delphi nicht über eine eigene serielle Kommunikationssteuerung verfügt und die serielle Kommunikation in der Hilfedokumentation nicht erwähnt wird, was für Entwickler, die Kommunikationsprogramme kompilieren, große Unannehmlichkeiten mit sich bringt.
Derzeit gibt es drei häufig verwendete Methoden zur Implementierung der seriellen Kommunikation mit Delphi: Eine besteht darin, Steuerelemente wie die MSCOMM-Steuerung und die SPCOMM-Steuerung zu verwenden. Die dritte besteht darin, andere serielle Kommunikationsprogramme aufzurufen. Unter anderem ist die Verwendung einer API zum Schreiben serieller Kommunikationsprogramme komplizierter und erfordert viel Kommunikationswissen. Im Vergleich dazu ist die Verwendung des SPCOMM-Steuerelements relativ einfach. Das Steuerelement verfügt über umfangreiche Eigenschaften und Ereignisse, die eng mit der Kommunikation über die serielle Schnittstelle zusammenhängen, bietet verschiedene Vorgänge an der seriellen Schnittstelle und unterstützt auch Multithreading. Der folgende Artikel stellt die Verwendung der SPCOMM-Steuerung anhand von Beispielen ausführlich vor.
SPCOMM-Installation
1. Wählen Sie im Dropdown-Menü „Komponente“ die Option „Komponente installieren“, geben Sie den Pfad ein, in dem sich das SPCOMM-Steuerelement im Unit-Dateinamen befindet. Für andere Elemente können Standardwerte verwendet werden, und klicken Sie auf die Schaltfläche „OK“.
2. Nach der Installation erscheint in der Systemsteuerung ein rotes Kontroll-COM. Jetzt können Sie COM-Steuerelemente genauso verwenden wie Delphis eigene Steuerelemente.
SPCOMM-Eigenschaften, -Methoden und -Ereignisse
1.Attribute
●CommName: Zeigt die Namen serieller Ports wie COM1 und COM2 an;
●BaudRate: Die entsprechend den tatsächlichen Anforderungen eingestellte Baudrate. Dieser Wert kann auch nach dem Öffnen der seriellen Schnittstelle geändert werden, und die tatsächliche Baudrate ändert sich entsprechend.
●ParityCheck: Gibt an, ob eine Paritätsprüfung erforderlich ist;
●ByteSize: Die entsprechend der tatsächlichen Situation festgelegte Bytelänge;
●Parität: Paritätsbit;
●StopBits: Stoppbits;
●SendDataEmpty: Dies ist ein boolesches Attribut. Wenn es wahr ist, bedeutet dies, dass der Sendepuffer leer ist. Wenn es falsch ist, bedeutet dies, dass der Sendepuffer nicht leer ist sind Informationen in der Sendewarteschlange.
2. Verfahren
●Die Startcomm-Methode wird zum Öffnen der seriellen Schnittstelle verwendet. Wenn das Öffnen fehlschlägt, wird normalerweise ein Fehler gemeldet. Es gibt sieben Hauptfehlertypen: ⑴ Der serielle Port wurde geöffnet. ⑶ Das Dateihandle ist kein Kommunikationshandle. ⑸ Das Ereignis kann nicht generiert werden Der Lesevorgang kann nicht generiert werden. ⑺ Der Schreibvorgang kann nicht generiert werden.
●StopComm-Methode wird zum Schließen der seriellen Schnittstelle verwendet und hat keinen Rückgabewert;
Die Methode „WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word)“ ist eine Funktion mit einem booleschen Rückgabewert. Sie wird verwendet, um eine Zeichenfolge an den Schreibvorgang zu senden. Sie gibt „true“ zurück, wenn das Senden fehlschlägt. Durch Ausführen dieser Funktion wird der Rückgabewert sofort abgerufen und der Sendevorgang wird anschließend ausgeführt. Diese Funktion verfügt über zwei Parameter, wobei pDataToWrite die zu sendende Zeichenfolge und dwSizeofDataToWrite die Länge der zu sendenden Zeichenfolge ist.
3. Ereignis
●OnReceiveData :PRocedure (Sender: TObject;Buffer: Pointer;BufferLength: Word) des Objekts
Dieses Ereignis wird ausgelöst, wenn Daten in den Puffer eingegeben werden, wo die vom seriellen Port empfangenen Daten verarbeitet werden können. Buffer enthält die empfangenen Daten und BufferLength ist die Länge der empfangenen Daten.
●OnReceiveError: procedure(Sender: TObject; EventMask: DWORD)
Dieses Ereignis wird ausgelöst, wenn beim Datenempfang ein Fehler auftritt.
Verwendung von SPCOMM
Im Folgenden finden Sie ein Beispiel für die serielle Kommunikation mithilfe der SPCOMM-Steuerung.
Am Beispiel der Kommunikation zwischen PC und Mikrocontroller 8051 müssen wir zunächst das Handshake-Signal zwischen ihnen anpassen. Angenommen, das Kommunikationsprotokoll zwischen ihnen ist: Ein Datenrahmen vom PC zum 8051 ist 6 Bytes, und ein Datenrahmen vom 8051 zum PC ist ebenfalls 6 Bytes. Wenn der PC (F0,01,FF,FF,01,F0) sendet, kann 8051 einen Frame (F0,01,FF,FF,01,F0) empfangen, der angibt, dass der Datenkommunikations-Handshake erfolgreich ist, und die beiden können folgen Die Protokolle übertragen Daten untereinander.
Erstellen Sie ein neues Projekt COMM.DPR, setzen Sie die NAME-Eigenschaft des Formulars auf FCOMM, definieren Sie den Titel des Formulars als Testkommunikation und fügen Sie die entsprechenden Steuerelemente hinzu.
1. Legen Sie die COMM1-Attribute fest:
●Baudrate: 4800;
●Paritätsbit: Keines;
●Byte-Länge: 8;
●Stoppbit: 1;
●Serieller Anschluss: COM1.
Die gesendeten und empfangenen Daten werden in Memo1 angezeigt. Speichern Sie das neue Formular als Comm.pas.
2.Schreiben Sie den Quellcode
//Variablenbeschreibung
var
fcomm:TFCOMM;
viewstring:string;
i:Ganzzahl;
rbuf,sbuf:array[16] of byte;
//Serielle Schnittstelle öffnen
procedure TFCOMM.FormShow(Sender: TObject);
beginnen
comm1.StartComm;
Ende;
//Schließen Sie die serielle Schnittstelle
procedure TFCOMM.FormClose(Sender: TObject; var Action: TCloseAction);
beginnen
comm1.StopComm;
Ende;
//Passen Sie den Prozess des Sendens von Daten an
Prozedur senddata;
var
i:Ganzzahl;
commflg:boolean;
beginnen
viewstring:='';
commflg:=true;
für i:=1 bis 6 do
beginnen
wenn nicht fcomm.comm1.writecommdata(@sbuf[i],1), dann
beginnen
commflg:=false;
brechen;
Ende;
//Verzögerung zwischen Bytes beim Senden
Schlaf(2);
viewstring:=viewstring+intttohex(sbuf[i],2)+'' end;
viewstring:='Senden'+viewstring;
fcomm.memo1.lines.add(viewstring);
fcomm.memo1.lines.add('' );
Wenn nicht commflg, dann messagedlg('Senden fehlgeschlagen!',mterror,[mbyes],0);
Ende;
//Schaltflächenklick-Ereignis senden
Prozedur TFCOMM.Btn_sendClick(Sender: TObject);
beginnen
sbuf[1]:=byte($ f0); //Frame-Header
sbuf[2]:=byte($ 01); //Befehlsnummer
sbuf[3]:=byte($ ff);
sbuf[4]:=byte($ ff);
sbuf[5]:=byte($ 01);
sbuf[6]:=byte($ f0); //Ende des Frames
senddata;//Rufen Sie die Sendefunktion auf
Ende;
//Empfangsprozess
procedure TFCOMM.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
var
i:Ganzzahl;
beginnen
viewstring:='';
move(buffer^,pchar(@rbuf^),bufferlength);
for i:=1 to bufferlength do
viewstring:=viewstring+intttohex(rbuf[i],2)+'';
viewstring:='receive'+viewstring;
memo1.lines.add(viewstring);
memo1.lines.add('' );
Ende;
Wenn Memo1 das Senden von F0 01 FF FF 01 F0 und das Empfangen von F0 01 FF FF 01 F0 anzeigt, bedeutet dies, dass die serielle Schnittstelle korrekt Daten gesendet und empfangen hat und die serielle Kommunikation erfolgreich war.