Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Daten über RS232 (https://www.delphipraxis.net/173478-daten-ueber-rs232.html)

ueei.net 27. Feb 2013 06:53

Daten über RS232
 
Hallo, ich würde gerne Daten über die RS232 Schnittstelle senden und auch empfangen.

Die Daten sind in folgendem Format vorhanden (Senden und Empfangen)

40 03 70 01 03 01 53 94 1B 03 1B 02 00 00 02

Ja, ich habe schon Google bemüht und auch die Suche im Forum. Nachdem ich aber ein Projekt in aller letzter Sekunde rein bekommen habe fehlt mir die Zeit für Experimente. Ich würde für eine verwendbare Lösung auch gerne einen Unkostenbeitrag anbieten.

Wichtig ist noch zu sagen, es handelt sich um ein Delphi7 Projekt.

ASM 27. Feb 2013 09:29

AW: Daten über RS232
 
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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz