CpComPort.WriteBytes

Das CpComPort-Objekt ermöglicht es, direkt mit der seriellen Schnittstelle des Rechners zu kommunizieren. Daten können gesendet und gelesen werden. Das eröffnet z.B. die Möglichkeit, während eines Rennens Daten an einen Arduino zu senden und diesen entsprechende Aktionen ausführen zu lassen.

Das hier verwendete Beispiel findet sich bei allen Befehlen aus diesem Abschnitt, da sie nur gemeinsam wirklich Sinn machen und sich kaum einzeln herauslösen lassen.

Syntax

Befehl CpComPort.WriteBytes(ByteArray:Variant; BytesToSend:Integer)
Funktion Gibt zurück, wie viele Bytes an den COM-Port gesendet wurden
Typ Integer
ab 3.3.1 build 480

Dieser Befehl sendet eine Folge (Array) von Bytes an die serielle Schnittstelle. Er erwartet als Parameter das ByteArray und die Anzahl der zu sendenden Bytes. Im Gegenzug liefert es einen Zahlenwert, wie viele Bytes tatsächlich gesendet wurden.


Codebeispiel


Veranschaulicht die Verwendung und Wirkung der neuen AddOn-Befehle zum Abfragen, Setzen und Löschen vergebener Zusatzpunkte im Serienrennen.

var
  sComPort: String;
  Baudrate: Integer;
  Parity  : Integer;
  StopBits: Integer; 
  ByteSize: Integer;
  
  Data       : String;
  BytesToRead: Integer;
  BytesRead  : Integer;
  
  BytesToSend : Integer;
  myByteArray : Array of Bytes;
  sTextToSend : String;
  iBytesSent  : Integer; 
  iLaengeText : Integer;
  i           : Integer;
  

  begin
  
    // Parameter der COM-Schnittstelle definieren
    sComPort := 'COM4';
    Baudrate := 19200;
    Parity   := 0;
    StopBits := 1;
    ByteSize := 8;
    
    // COM-Port öffnen. Wenn geöffnet (1), weitere Befehle ausführen
    if CpComPort.OpenCOM( sComPort, 
                          Baudrate, 
                          Parity, 
                          StopBits, 
                          ByteSize ) = 1 then
    begin
    
      // Sendet Daten an den COM-Port
      CpComPort.Timeouts (500);    // 500 mSek
      CpComPort.ClearBuffer;       // Lösche Empfangsbuffer
      CpComPort.BufferSize(100);   // Empfangsbuffer Größe
      CpComPort.SendString('"$');
      
      // Liest Daten vom COM-Port
      BytesToRead := 1;
      CpComPort.ReadBytes( Data, BytesToRead, BytesRead );
      // "$ liefert # zurück
      cpShowMessage( 'BytesRead: ' + IntToStr(BytesRead) + Data );
      
     end
     else
       cpShowMessage( sComPort + ' konnte nicht geöffnet werden !' );
       
   // Jeder Text ist eine Menge von Zeichen = Array
   sStringToConvert := 'slot-xtreme';
  
   // Länge der Zeichenfolge ermitteln
   iLaengeText := length(sStringToConvert);
  
   // Arrayumfang definieren
   setLength(MyByteArray, iLaengeText);
  
    // jetzt die Zeichenfolge abarbeiten
    for i := 0 to iLaengeText - 1 do
    begin
      // Jeder Buchstabe gleich 1 Arraywert
      // Ord wandelt das Zeichen in einen Integerwert um
      // Copy kopiert den Text Zeichen für Zeichen
      MyByteArray[i] := Ord(Copy(sStringToConvert, i+1, 1)); 
    end;
  
    // Bytes an die serielle Schnittstelle senden
    iBytesSent := CpComPort.WriteBytes(MyByteArray, iLaengeText);
          
end.


Nach dem erfolgreichen Öffnen der Schnittstelle COM4 wird im ersten Schritt die Dauer festgelegt, die dieser Port auf Daten wartet.

Der nächste Befehl löscht den Datenspeicher und setzt anschließend die Größe auf 100 Bytes.

Abschließend wird die Zeichenfolge „$ an den COM-Port gesendet.

Im nächsten Befehlsblock wird die Richtung umgekehrt und Daten von der seriellen Schnittstelle gelesen. Es geht um 1 Byte. Die Variable Data enthält die Daten und BytesRead sollte enthalten, wie viele Bytes gelesen wurden.

Der Kommentar zeigt an, dass ggfs. andere Inhalte zurückkommen, als gesendet worden sind. Im Beispiel kommt ein # zurück, statt es zu erwartenden „$.

Sendet man z.B. eine 0 als Zeichenfolge über die serielle Schnittstelle, ist das Resultat beim Emfpänger eine 48.

Wie sich das Ergebnis aus dem Beispiel ergibt, kann ich nicht erklären. Bei 0 und 1 weiß ich es aus eigener Erfahrung. Hier wird kein Integerwert übertragen, sondern eine Zeichenfolge (Character). Als Basis dient der ASCII-Zeichensatz. Die 48 entspricht dem Zeichen 0, nicht der Zahl 0.

Soll z.B. ein Arduino ein Steuersignal bekommen und ihr sendet über Cockpit-XP eine 0 an die Schnittstelle, müsst ihr beim horchenden Arduino auf den Wert 48 reagieren.

Über den hier beschriebenen Befehl wird eine Byte-Folge aus dem Array an die serielle Schnittstelle übertragen. Die Umwandlung von Text in Zahlenwerte findet in der For-Schleife statt. Nach der Konvertierung stehen die Zahlenwerte für die einzelnen Buchstaben meines Benutzernamens als Zahlen im Array. Der Screenshot zeigt, welche das sind.




Start - FAQ - Glossar - Sitemap - Impressum

 
cockpit-xp/addon/befehlsreferenz/writebytes.txt · Zuletzt geändert: 2023/12/24 11:57 von slotx