Einzelnen Beitrag anzeigen

ASM

Registriert seit: 15. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Daten über RS232

  Alt 27. Feb 2013, 09:29
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;
  Mit Zitat antworten Zitat