Forum: PC-Programmierung Wie Verfügbare COM-Ports unter Lazarus + Synaser heraus bekommen?


von Steffen H. (avrsteffen)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

Ich beschäftige mich gerade mit dem Delphi angelegtem freien Lazarus 
mit freiem Pascal Compiler.

Ich habe jetzt schon eine Kommunikation zwischen PC und µC hin bekommen. 
Dazu hab ich die ebenfalls freie Unit/Package Synaser verwendet. Also 
dies funktioniert schon mal.
1
unit Unit1;
2
3
{$mode objfpc}{$H+}
4
5
interface
6
7
uses
8
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
9
  StdCtrls, ExtCtrls, synaser;
10
11
  var
12
  serv:TBlockSerial;
13
  memoLineIndex: integer= 0;
14
15
type
16
17
  { TForm1 }
18
19
  TForm1 = class(TForm)
20
    Beenden: TButton;
21
    Memo1: TMemo;
22
    Verbinden: TButton;
23
    Senden: TButton;
24
    Edit1: TEdit;
25
    Edit3: TEdit;
26
    Timer1: TTimer;
27
    Transmit: TLabel;
28
    Receive: TLabel;
29
    Label3: TLabel;
30
    Label4: TLabel;
31
    procedure BeendenClick(Sender: TObject);
32
    procedure VerbindenClick(Sender: TObject);
33
    procedure SendenClick(Sender: TObject);
34
    procedure Timer1Timer(Sender: TObject);
35
36
  private
37
    { private declarations }
38
    connected: Boolean;
39
40
  public
41
    { public declarations }
42
  end;
43
44
var
45
  Form1: TForm1;
46
47
implementation
48
49
{ TForm1 }
50
51
procedure TForm1.Timer1Timer(Sender: TObject);
52
var
53
  signal : string;
54
55
begin
56
  if not connected then exit;
57
  signal := serv.Recvstring(Timer1.Interval div 2);
58
  if serv.LastError <> 0 then exit;
59
  Memo1.Lines[memoLineIndex] := signal;
60
  memoLineIndex := memoLineIndex +1;
61
end;
62
63
64
procedure TForm1.BeendenClick(Sender: TObject);
65
begin
66
  serv.free;
67
  ShowMessage('ComPort muss freigeschalten werden! Jetzt freischalten?');
68
  sleep(1000);
69
  close;
70
end;
71
72
73
procedure TForm1.VerbindenClick(Sender: TObject);
74
var
75
portnr : string;
76
parity : char;
77
baud,bits,stop : integer;
78
softflow : boolean;
79
hardflow : boolean;
80
81
  begin
82
    if connected then
83
    begin
84
    ShowMessage('Verbindung ist bereits vorhanden');
85
    exit;
86
    end;
87
    serv:=TBlockSerial.create;
88
    portnr := 'COM3';
89
    parity := 'N';
90
    baud := 9600;
91
    bits := 8;
92
    stop := SB1;
93
    softflow := false;
94
    hardflow := false;
95
    serv.Connect(portnr);
96
    sleep(1000);
97
    serv.Config(baud, bits, parity, stop, softflow, hardflow);
98
    sleep(1000);
99
    if serv.LastError = 0 then
100
    begin
101
    connected := True;
102
    ShowMessage('Verbindung erfolgreich');
103
    end
104
    else
105
    ShowMessage('Verbindung konnte nicht hergestellt werden');
106
  end;
107
108
109
procedure TForm1.SendenClick(Sender: TObject);
110
var
111
befehl, data : string;
112
113
const
114
CR = #$0d;
115
begin
116
  befehl := edit1.text;
117
  data   := befehl+CR;
118
  serv.SendString(data);
119
end;
120
121
initialization
122
123
124
{$R *.lfm}
125
126
end.
So, jetzt möchte ich aber beim Öffnen des Programmes im TEdit Edit2 die 
unter Windows verfügbaren COM-Ports anzeigen und daraus auswählen 
können.

Also benötige ich irgendwie eine Information von Windows oder über 
Synaser von Windows, welche COM-Ports gerade verfügbar sind.

Welche Funktionen/Prozeduren/Units kann man dafür nehmen? Wer kann mir 
weiter helfen?


Gruß Steffen

von Proxxon (Gast)


Lesenswert?


von Christian (Gast)


Lesenswert?

schau Dich da mal um, in dem Projket findest Du alles was Du brauchst.

http://www.leo-andres.de/2012/09/updateloader-benutzeroberflache-fur-avr-bootloader/

von Steffen H. (avrsteffen)


Angehängte Dateien:

Lesenswert?

Ich hab es gefunden, In der Unit synaser gibt es die Funktion:

function GetSerialPortNames: string;
Returns list/ of existing computer serial ports. Working properly only 
in Windows!

Jetz bekomm ich die gegenwärtig zur Verfügung stehenden COMs als string 
mit Komma getrennt zurück.

Beispiel:
1
procedure TForm1.ComboBox1DropDown(Sender: TObject);
2
var
3
  ports : string;
4
5
begin
6
  ports := GetSerialPortNames;
7
  Memo2.Text := ports;
8
end;

Jetzt muss ich die nur noch sortieren, und in die ComboBox eintragen. 
Lerne aber gerade erst Pascal.. kann also dauern :)



Gruß Steffen

von Steffen H. (avrsteffen)


Lesenswert?

Christian schrieb:
> schau Dich da mal um, in dem Projket findest Du alles was Du brauchst.
>
> 
http://www.leo-andres.de/2012/09/updateloader-benutzeroberflache-fur-avr-bootloader/

Danke Christian. Das hilft mir bestimmt auch weiter.

von PascalUser (Gast)


Lesenswert?

Hallo,

CommaText ist das was du zum "sortieren" suchst
(Beispiel mit ListBox):
1
procedure TfrmMain.EnumCOMPorts;
2
var
3
  sl: TStringList;
4
begin
5
  ListBox.Clear;
6
  sl := TStringList.Create;
7
  try
8
    sl.CommaText := GetSerialPortNames;
9
    ListBox.Items := sl;
10
  finally
11
    sl.Free;
12
  end; 
13
end;

MfG

von Robert L. (lrlr)


Lesenswert?

naja

 ListBox.Items.CommaText := GetSerialPortNames;


tut das selbe..

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.