Announcement

Collapse
No announcement yet.

Serielle Schnittstelle über CreateFile ansprechbar??

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Serielle Schnittstelle über CreateFile ansprechbar??

    HI,
    ich habe gelesen, dass man mit der Windows eigenen Methode CreateFile, eine Verbindung zur seriellen oder parallelen Schnittstelle herstellen kann. Wie würde der Aufruf und die Bearbeitung (Set,Get...) der Schnittstellen unter Delphi aussehen? Kann dies jemand an einem Beispiel erklären? Vielen Dank.

    Marten

  • #2
    Öffnen der seriellen Schnittstelle:<br>
    <pre>
    function TSerielleSchnittstelle.openport(newport :PCHAR):Boolean; {öffnet den Port}
    begin
    hcomdev:=0;// Typ THandle (Zeiger auf den Comport
    //Aufruf der Windows Funktion zum öffnen des Comports
    hcomdev:=CreateFile (port,
    GENERIC_READ or GENERIC_WRITE,
    0, { comm devices must be opened w/exclusive-access }
    NIL, { no security attrs }
    OPEN_EXISTING, { comm devices must use OPEN_EXISTING }
    0, { not overlapped I/O }
    0); { hTemplate must be NULL for comm devices }

    result:=(hcomdev <> INVALID_HANDLE_VALUE);
    if not result then
    GetLastError;
    end; { end of openport }
    </pre>
    <br>

    Einstellen der Portparameter:<br>

    <pre>
    function TSerielleSchnittstell.SetComState:Boolean;
    var ok:Boolean;
    begin

    ok := GetCommstate (hcomdev, dcb);

    if not ok then { lt. MS-SDK }
    begin
    GetCommMask (hComDev, events);
    result:=false;
    end
    else
    begin
    dcb.baudrate := baudrate;
    dcb.ByteSize := 8; {Datenbits einstellen}
    dcb.Parity := 0;
    dcb.StopBits := 0; {stopbit}

    ok := BuildCommDCB (settings_Pchar, dcb);

    if not ok then { lt. MS-SDK }
    begin
    result:=false;
    end
    else
    begin
    result := SetCommState (hcomdev,dcb); {Einstellen der Portparameter}
    end;
    end;

    end; { end of SetComState

    Comment


    • #3
      Schreiben auf die Schnittstelle<br>
      <pre>
      function TSerielleSchnittstell.writeport(writebuf:String):B oolean; {Auf den Port schreiben}
      var
      laenge: DWORD; {Länge des Übertragungsstrings}
      ptr: PCHAR;
      Fehlerfrei: Boolean;
      written: DWORD; { numbers of bytes written }
      begin
      if hcomdev = INVALID_HANDLE_VALUE then
      begin
      result:=false;
      Exit;
      end;

      result:=false;
      laenge:=Length (new_writebuf); {Länge feststellen}
      ptr := stralloc (laenge+1); {Speicher allokieren}
      StrPCopy (ptr, new_writebuf);
      fehlerfrei:=WriteFile (hcomdev, ptr^, laenge, written, NIL);

      if fehlerfrei then
      fehlerfrei:=self.waitereignis(EV_TXEMPTY,1000);
      {warte bis Zeichen gesendet worden ist}

      if (laenge <> written) then
      fehlerfrei := false;

      strdispose (ptr); {Speicher freigeben}
      result:=fehlerfrei;
      end; { end of writeport }
      </pre>

      Lesen vom Port:<br>
      <pre>
      function TSerielleSchnittstell.readport :Boolean;
      {
      Funktion liest vom Port
      Rückgabewert =True: Funktion war erfolgreich
      Rückgabewert =False: Funktion war nicht erfolgreich
      }
      var
      bytes_read: DWORD; {Anzahl gelesener Bytes}
      laenge: DWORD; {Anzahl der Bytes in der Inputque}
      status: TCOMSTAT; {Übertragungsstatus}
      ErrorMask: DWORD; { 32-Bit errormask from ClearCommError }
      ok: BOOL;
      begin
      if hcomdev = INVALID_HANDLE_VALUE then
      begin
      result:=false;
      exit;
      end;

      result := false;
      bytes_read := 0;

      ok := ClearCommError (hcomdev,ErrorMask,@status);
      if not ok then
      begin {bei der Übertragung hat das System einen Fehler festgestellt}
      GetCommMask (hComDev, events);
      end
      else
      begin
      SetCommMask (hcomdev, $FF);
      bytes_read :=0;
      laenge := status.cbInQue; {Anzahl der empfangenen Zeichen feststellen}
      if laenge > 0 then {falls etwas empfangen wurde}
      begin
      strcopy (readbuf, '');
      ReadFile (hcomdev, readbuf^, laenge, bytes_read, NIL);

      readport := true;
      end {End of if laenge>0}
      else {es wurde nichts empfangen}
      readport:=false;
      end; {End of :if error = 0}

      end; { end of readport }

      function TSerielleSchnittstell.waitereignis(EmaskeWORD;zeit:Word):Boolean;
      {wartet, darauf ein Ereignis oder ein}
      {"Timeout" auftritt}
      {wartet, darauf ein Ereignis oder ein}
      {"Timeout" auftritt}
      var
      break: Boolean;
      ComMask: DWORD;
      FirstTickCount:Longword;
      begin
      {Variablen und Rückgabewrte initialisieren}
      set_events (Emaske);
      waitereignis :=false;
      break :=false;
      FirstTickCount:=GetTickCount;

      while ((abs(GetTickCount-FirstTickCount) <= Longword(zeit)) and not break) do
      begin
      Application.ProcessMessages;
      GetCommMask (hcomdev, ComMask);
      if ((ComMask and emaske) = emaske) then break:=True;
      end;

      if break then
      begin
      wincomevent:=false; {Ereignisse neu "anschalten"}
      set_events ($FF); {altes Ereignis löschen}
      waitereignis:=true; {Rückgabewert einstellen}
      end;
      end; { end of waitereignis }

      </pre&gt

      Comment


      • #4
        Hallo,<p>
        ich habe an COM1 eine Waage angeschlossen. Wenn ich die Struktur<br>dcb mit den vom Werk vorgegebenen Einstellungen fülle, so schlägt SetCommState(..)<br>fehl. Nehme ich die Funktion raus, so erhalte ich trotzdem Daten von der Waage.<br>Ändere ich die Daten (StopBits := 0 statt 1), dann ist das Result von<br>SetCommState TRUE, aber es kommen keine Daten mehr.<br>Kann mir jemand die Zusammenhänge von GetCommState, SetCommState<br>und den vom Werk vorgegebenen Einstellungen der Waage erklären??

        Comment

        Working...
        X