Objekte der Klasse
TBlockSerial kann ich problemlos erzeugen. Also muss der Fehler ja eigentlich irgendwo in meiner davon abgeleiteten Klasse
TRikaConnection liegen. Ich kann in meinem Quelltext aber keine Auffälligkeit entdecken.
Code: Alles auswählen
unit mRikaFunctions;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils,
{$IFNDEF SOME_LIB}
Dialogs,
{$ENDIF}
synaser,
mRikaTypesAndConsts;
type
TRikaConnection = class(TBlockSerial)
private
FLoggedOn: Boolean;
FVersion: TRikaVersion;
function IsDataAvailable: Boolean;
function LogOn(const AQueryMode: Byte): Boolean;
function LogOff: Boolean;
procedure SetVersion(Value: String);
function GetVersionString: String;
public
constructor Create(const AComPort, ABaud: SmallInt);
destructor Destroy; override;
function RecieveData: String;
function RecieveDataSet: TRikaDataSet;
property Version: TRikaVersion read FVersion {write SetVersion};
property VersionString: String read GetVersionString;
end;
const
SleepDelay = 250;
implementation
constructor TRikaConnection.Create(const AComPort, ABaud: SmallInt);
begin
inherited Create;
Connect('COM' + IntToStr(AComPort));
Config(ABaud, 8, 'N', SB1, False, False);
end;
destructor TRikaConnection.Destroy;
begin
if FLoggedOn then
LogOff;
inherited Destroy;
end;
function TRikaConnection.IsDataAvailable: Boolean;
var
Answer: Byte;
begin
Result := False; // initialisieren
SendByte(SYN);
//Sleep(SleepDelay);
Answer := RecvByte(GlobalTimeOut);
{$IFNDEF SOME_LIB}
if LastError > 0 then ShowMessage(LastErrorDesc);
{$ENDIF}
if Answer = SOH then
Result := True;
end;
function TRikaConnection.LogOn(const AQueryMode: Byte): Boolean;
var
LogOnAnswer: String;
begin
if FLoggedOn then exit;
Result := False; // initialisieren
SendByte(AQueryMode);
//Sleep(SleepDelay);
LogOnAnswer := RecvPacket(GlobalTimeOut);
SetVersion(LogOnAnswer);
if LastError = sOK then
begin
FLoggedOn := True;
Result := True;
end;
end;
function TRikaConnection.LogOff: Boolean;
begin
if not FLoggedOn then exit;
Result := False; // initialisieren
SendByte(DISCONNECT);
if ((LastError = sOK) and (RecvByte(GlobalTimeOut) = NUL)) then
begin
FLoggedOn := False;
Result := True;
end;
end;
procedure TRikaConnection.SetVersion(Value: String);
begin
if (Length(Value) < 3) then
begin
FVersion.MajorVersion := -1;
FVersion.MinorVersion := -1;
exit;
end;
FVersion.MajorVersion := StrToIntDef(Value[1],-1);
FVersion.MinorVersion := StrToIntDef(Value[2]+Value[3],-1);
end;
function TRikaConnection.GetVersionString: String;
begin
Result := 'Rika v' + IntToStr(Version.MajorVersion) + '.' + IntToStr(Version.MinorVersion);
end;
function TRikaConnection.RecieveData: String;
var
DataString: String;
begin
LogOn(CON_TOTAL);
try
if IsDataAvailable then
begin
try
DataString := RecvTerminated(GlobalTimeOut, Char(EOT));
finally
SendByte(FF);
end;
Result := Result + DataString;
end
else
Result := Result + '#NODATA';
finally
LogOff;
end;
end;
function TRikaConnection.RecieveDataSet: TRikaDataSet;
var
i, k: Integer;
StringList: TStringList;
begin
StringList := TStringList.Create;
try
StringList.Text := RecieveData;
if not (StringList.Text = '') then
begin
with Result do
begin
RikaSerialNumber := StrToIntDef(StringList.Strings[0], -1);
RikaBusAddress := StrToIntDef(StringList.Strings[1], -1);
ManualCode := StrToIntDef(StringList.Strings[2], -1);
TargetIdent := StringList.Strings[3];
DivisorFactor := StrToIntDef(StringList.Strings[4], -1);
HitQuantity := StrToIntDef(StringList.Strings[5], -1);
SetLength(Hits, HitQuantity);
k := 6;
for i := 0 to HitQuantity - 1 do
begin
with Hits[i] do
begin
Points := StrToIntDef(StringList.Strings[k], -1);
Divisor := StrToIntDef(StringList.Strings[k+1], -1);
Divisor := StrToIntDef(StringList.Strings[k+2], -1);
Divisor := StrToIntDef(StringList.Strings[k+3], -1);
Inc(k, 4);
end;
end;
end;
end;
finally
FreeAndNil(StringList);
end;
end;
end.