...write/read a string to/from the serial port?

Author: GeLu-EDV-Service

Category: System

function OpenCOMPort: Boolean;
var
  
DeviceName: array[0..80] of Char;
  ComFile: THandle;
begin
   
{ First step is to open the communications device for read/write.
     This is achieved using the Win32 'CreateFile' function.
     If it fails, the function returns false.

     Wir versuchen, COM1 zu öffnen.
     Sollte dies fehlschlagen, gibt die Funktion false zurück.
   }
  
StrPCopy(DeviceName, 'COM1:');

  ComFile := CreateFile(DeviceName,
    GENERIC_READ or GENERIC_WRITE,
    0,
    nil,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0);

  if ComFile = INVALID_HANDLE_VALUE then
    
Result := False
  else
    
Result := True;
end;


function SetupCOMPort: Boolean;
const
  
RxBufferSize = 256;
  TxBufferSize = 256;
var
  
DCB: TDCB;
  Config: string;
  CommTimeouts: TCommTimeouts;
begin
   
{ We assume that the setup to configure the setup works fine.
     Otherwise the function returns false.

     wir gehen davon aus das das Einstellen des COM Ports funktioniert.
     sollte dies fehlschlagen wird der Rückgabewert auf "FALSE" gesetzt.
   }

  
Result := True;

  if not SetupComm(ComFile, RxBufferSize, TxBufferSize) then
    
Result := False;

  if not GetCommState(ComFile, DCB) then
    
Result := False;

  // define the baudrate, parity,...
  // hier die Baudrate, Parität usw. konfigurieren
   
  
Config := 'baud=9600 parity=n data=8 stop=1';

  if not BuildCommDCB(@Config[1], DCB) then
    
Result := False;

  if not SetCommState(ComFile, DCB) then
    
Result := False;

  with CommTimeouts do
  begin
    
ReadIntervalTimeout         := 0;
    ReadTotalTimeoutMultiplier  := 0;
    ReadTotalTimeoutConstant    := 1000;
    WriteTotalTimeoutMultiplier := 0;
    WriteTotalTimeoutConstant   := 1000;
  end;

  if not SetCommTimeouts(ComFile, CommTimeouts) then
    
Result := False;
end;


{
  The following is an example of using the 'WriteFile' function
  to write data to the serial port.

  Folgendes Beispiel verwendet die 'WriteFile' Funktion, um Daten
  auf den seriellen Port zu schreiben.
}


procedure SendText(s: string);
var
  
BytesWritten: DWORD;
begin
   
{
     Add a word-wrap (#13 + #10) to the string

     An den übergebenen String einen Zeilenumbruch (#13 + #10) hängen
   }
  
s := s + #13 + #10;
  WriteFile(ComFile, s[1], Length(s), BytesWritten, nil);
end;


{
  The following is an example of using the 'ReadFile' function to read
  data from the serial port.
  
  Folgendes Beispiel verwendet die 'ReadFile' Funktion, um Daten
  vom seriellen Port zu lesen.
}


procedure ReadText: string;
var
  
d: array[1..80] of Char;
  s: string;
  BytesRead, i: Integer;
begin
  
Result := '';
  if not ReadFile(ComFile, d, SizeOf(d), BytesRead, nilthen
  begin
    
{ Raise an exception }
  
end;
  s := '';
  for i := 1 to BytesRead do s := s + d[I];
  Result := s;
end;


procedure CloseCOMPort;
begin
  
// finally close the COM Port!
  // nicht vergessen den COM Port wieder zu schliessen!
  
CloseHandle(ComFile);
end;

 

printed from
www.swissdelphicenter.ch
developers knowledge base