Mit Hilfe der SynaSer serial library.
Ist Freeware und Open Source.
Hier
Delphi-Quellcode:
Uses Synaser;
Var
ser: TBlockSerial;
CurrentComPort: Ansistring = 'COM2';
Baudrate: word = 38400;
// Schnittstelle öffnen
function RS232Init(var ser: TBlockSerial): Boolean;
var
availablePorts: AnsiString;
begin
result := false;
availablePorts := GetSerialportNames;
if pos(CurrentComPort, availablePorts) = 0 then exit;
if not assigned(ser) then ser := TBlockserial.Create;
try
ser.RaiseExcept := true;
ser.DeadlockTimeout := 5000;
ser.Connect(CurrentComPort);
ser.Config(Baudrate, 8, 'N', 0, false, true);
ser.RaiseExcept := false;
result := true;
except
FreeAndNil(ser);
end;
end;
Byte Empfangen:
Code:
// liest Byte mit Timeout in ms
data[i] := ser.recvbyte(1000);
Byte Senden::
Code:
ser.SendByte(data: byte);
Als einfaches Beispiel zum Empfang von Daten:
Delphi-Quellcode:
Const
MaxData = 50000;
// nur Beispiel!; anpassen
Type
// oder mit offenem Array arbeiten
tBuffer =
Array [0..Maxdata]
of Byte;
Var
buffer: tBuffer;
function empfangedaten(
var data: tBuffer): integer;
begin
result := 0;
if not RS232Init(ser)
then exit;
try
// evt. ein Startsignal an Gegenstelle
ser.sendstring('
send data' + #13);
repeat
Application.ProcessMessages;
if Keypressed(VK_ESCAPE)
then exit;
// liest Byte mit Timeout in ms
data[result] := ser.recvbyte(1000);
if not (ser.LastError = ErrTimeout)
then inc(result, 1);
Form1.ShowStatusbarInfo(Format('
%d Bytes received', [result]));
until (ser.LastError = ErrTimeout)
or (result > length(data));
if result > 0
then dec(result, 1);
except
// handling...
end;
{...}
end;