An Task's, die noch irgendwo herumgeistern, habe ich nichts gefunden.
Das Schliessen des Comports erfolgt unter Form.OnClose.
Habe alles reduziert auf ein kleines Testprogramm. (Ich weiss, da sind Sachen drin "die man so nicht macht")
Und ja, der Comport ist selbst nach einem Neustart blockiert.
So langsam bin ich der Ansicht, das dieses alles nicht mit Lazarus zu tun hat.
War wohl nur zufällig passiert als ich das mit Lazarus erstellte Programm ausserhalb der
IDE gestartet hatte. (Off-Topic verschieb?)
Also:
- Heute morgen backup von C neu eingespielt, Comport ok.
- Lazarus
IDE -> Programm kompiliert und gestartet, ok.
- Programm ausserhalb
IDE gestartet, auch gut.
- Mehrfach wiederholt, alles ok.
Dann aber (ja, mach man auch nicht):
wärend Programm (exe.file) läuft den USB/RS232 abgezogen.
Keine Fehlermeldung, aber natürlich auch keine Kommunikation.
USB/RS232 wieder gesteckt, seit dem kann ich mit nichts mehr auf den Comport zugreifen.
HTERM schreibt: "Com6 is blocked by another application"
Der Gerätemanager zeigt "alles gut" an, finde auch wieder nichts im Hintergrund.
Also gehe ich davon aus, das bei dem ersten gau auch zufällig ein Wackeliger in der Hardware war.
Nur das darauf Windows sich mit einem erzwungenen Neustart meldete.
Jetzt nicht.
Würde jetzt gerne einen Neustart tätigen, um zu sehen on Comport immer noch geblockt ist,
leider läuft gerade ein Backup (60%), welches noch etwa eine Stunde dauert.
Bin mal gespannt ...
Code:
unit unitspannung;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ComCtrls, SdpoSerial;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Memo1: TMemo;
ProgressBar1: TProgressBar;
SdpoSerial1: TSdpoSerial;
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure SdpoSerial1RxData(Sender: TObject);
procedure anzeige(s: string);
private
{ private declarations }
public
{ public declarations }
eingang : string;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure Tform1.anzeige(s: string);
var i : integer;
ftemp : real;
begin
for i:=1 to length(s) do if s[i]='.' then s[i]:=',';
Label1.Caption := Copy(s,3,6);
ftemp := StrToFloat(label1.caption);
ProgressBar1.Position := Round(ftemp);
label1.Caption := Format('%2.2f',[(12/1023)* ftemp])+'V';
end;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
SdpoSerial1.Active:=false;
SdpoSerial1.Close;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SdpoSerial1.Active:=true;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
SdpoSerial1.Device := 'COM6';
end;
procedure TForm1.SdpoSerial1RxData(Sender: TObject);
begin
eingang := eingang + SdpoSerial1.ReadData;
if length(eingang) >= 52 then
begin
anzeige(eingang);
Memo1.Lines.Add(eingang);
eingang := '';
end;
end;
end.
Auch wenn es vermutlich grausam ist, am Programm liegt es nicht.
Ich glaub' ich bin zu alt für sowas ....