Thema: Delphi Auslesen der RS232

Einzelnen Beitrag anzeigen

peter21

Registriert seit: 24. Apr 2007
Ort: Golm
18 Beiträge
 
Delphi 4 Standard
 
#1

Auslesen der RS232

  Alt 24. Apr 2007, 20:52
Hallo,

ich habe mich erst vor kurzem an Delphi 4 gewagt. Vor etlichen Jahren hatte ich viel in Turbo-Pascal programmiert und muss nun einige Programme, die noch im DOS-Fenster laufen, auf Delphi anpassen.

Ein Problem ist dabei die serielle Schnittstelle. Ich muss ein Temperaturmessgerät, das ohne Anforderungen im Sekundentakt die Werte versendet, auslesen.
Nach einigen Recherchen habe ich mich als Unit für SerialNG entschieden. Dort existiert auch ein Beispiel-Programm (SerialNGSpy), mit dem das im Prinzip gut klappt. Nehme ich die für mich überflüssigen Funktionen heraus, funktioniert das Auslesen nicht mehr (Na ja, man soll auch auch auf diese Weise nicht programmieren).

Ich habe dann noch ein Beispiel von Tino Teuber angepasst, auch dort liest er die Schnittstelle ebenfalls nicht aus. Was mache ich falsch? Habe ich etwas vergessen?

Das Programm springt einfach nicht in die Procedure SerialPortNGRxClusterEvent.

Delphi-Quellcode:
unit RS232Mar_Unit1;

(*Dieses Programm liest die Temperatur über eine RS232-Schnittstelle
aus einem Temperatur-Messsystem aus.*)


interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Buttons, StdCtrls, ExtCtrls, ComCtrls, Menus,
  SerialNG,
  peterlib;

type
  TForm1 = class(TForm)
    Timer_Messung: TTimer;
    Messwerte: TRichEdit;
    MainMenuMessung: TMainMenu;
    Start1: TMenuItem;
    Ende1: TMenuItem;
    Datei: TMenuItem;
    Beenden1: TMenuItem;
    COM_1: TSerialPortNG;
    procedure Formactivate(Sender: TObject);
    procedure Start1Click(Sender: TObject);
    procedure SerialPortNGRxClusterEvent(Sender: TObject);
    procedure Timer_MessungTimer(Sender: TObject);
    procedure Messinterval1Click(Sender: TObject);
    procedure Ende1Click(Sender: TObject);
    procedure Beenden1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    COMStr: String;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
const
  n_messstellen = 1;

var
  messzeit, messzeit0: TDateTime;
  Messstellen_name: array [1 .. n_messstellen] of string;
  MesswerteArray: array [0..n_messstellen] of real;
  Messung: Boolean;

(*--------------Start-Proceduren-----------------------------------*)
procedure TForm1.FormActivate(Sender: TObject);
begin
  Messwerte.Text:= ' ';
  (* alles ausschalten *)
   Messung := False;
end;

procedure TForm1.Start1Click(Sender: TObject);
procedure start_rs232;
begin
   COM_1:= TSerialPortNG.Create(nil);
   with COM_1 do
     begin
        CommPort:= 'COM1';
        BaudRate:= CBR_2400;
        ParityType:= noparity;
        DataBits:= 8;
                StopBits:= 1;
      Active:= true;
    end;
  messstellen_name[1]:= 'Temperatur';
end; (*start_rs232 in start1click*)
begin (*Main of Start1Click*)
   Messung:= True;
  Messwerte.Text:= 'Startzeit = ' +
     DateToStr (date) + ' ' + TimeToStr(time) + ' '#13#10;
    start_rs232;
  messzeit0:= now;
end;

(*-----------------Messung-------------------------------------------*)
(*COM wird laufend in einen Test-String ausgelesen.*)
procedure TForm1.SerialPortNGRxClusterEvent(Sender: TObject);
begin
   if TSerialPortNG(Sender).NextClusterSize >= 0 then // Data available?
    begin
      if TSerialPortNG (Sender).NextClusterCCError = 0 then // Error during receiveing?
        COMStr:= '9999999'
      else
   COMStr:= TSerialPortNG(Sender).ReadNextClusterAsString;
    end;
end;

procedure TForm1.Timer_MessungTimer(Sender: TObject);
procedure messung_rs232;
var
   COMStr: String;
  messwert: real;
  zeit_ende: TDateTime;
  Daten_OK: Boolean;
  ftimeout_s: integer;
  ftimeout_d: real;
begin
   COMStr:= '';
  Daten_OK:= False;
  ftimeout_s:= 500; (*TimeOut in ms*)
  ftimeout_d:= ftimeout_s / 1000 / 60 / 60 / 24;
  (*Zeit berechnen, wann timeout erreicht wird.*)
   zeit_ende:= now + ftimeout_d;

(*  While (now < zeit_ende) and (not Daten_OK) do
     begin
       if COM_1.nextClusterSize > 0 then
         COMStr:= COMStr + COM_1.ReadNextClusterAsString;
      if copy (COMStr, length (COMStr), 1) = #13 then
         Daten_OK:= true;
      sleep (50);
    end; (*while (getTime() ... *)


  messwert:= COMtoReal (COMStr); (*Extrahiert die Werte aus dem String*)
  COMStr:= '';
  messwerte.text:= Messwerte.Text +
  messstellen_name [1] + '= '
    + FloatToStrF (messwert, ffFixed, 7, 2) + #13#10;
end; (*messung_rs232 in in Timer_MessungTimer*)
begin (*Main in Timer1Timer*)
   IF Messung Then
    BEGIN
      messzeit:= now;
      MesswerteArray[0]:= (messzeit - messzeit0)*24*60*60;
      Messwerte.text:= 'Zeit / s: '
         + FloatToStrF (MesswerteArray[0],ffFixed,7, 0) + #13#10;
        messung_rs232;
    END; (*IF Messung*)
end; (*Timer_MessungTimer*)

(*-------------------------------------Parameter verändern--------------*)

procedure TForm1.Messinterval1Click(Sender: TObject);
var
  str_zeitkonstante: String;
begin
  str_zeitkonstante:= inttostr (form1.timer_Messung.interval DIV 1000);
   str_zeitkonstante:= inputbox ('Zeitkonstante', 'Zeitkonstante in s:',
        str_zeitkonstante);
  form1.timer_Messung.interval:= StrToInt (str_zeitkonstante) * 1000;
end;

(*----------------------Messung beenden-------------------------------*)

procedure TForm1.Ende1Click(Sender: TObject);
begin
  (* alles ausschalten *)
   Messung := False;
end;

(*-----------------------------Programm beenden------------------------*)

procedure TForm1.Beenden1Click(Sender: TObject);
begin
  IF not messung then
    application.terminate;
end;

end.
Vielen Dank für Eure Hilfe.

Peter
  Mit Zitat antworten Zitat