Entwickler-Ecke

Sonstiges (Delphi) - Komponentenempfehlung für Terminalprogramm


Blawen - Sa 02.02.13 19:27
Titel: Komponentenempfehlung für Terminalprogramm
Hallo Delphi Gemeinde

Zurzeit arbeite ich privat an einem Projekt mit einem Atmel Prozessor. Aktuell lese ich mit dem Terminalprogramm Putty via USB/UART-Schnittstelle div. Daten aus.
Endziel ist es aber, mittels einem Delphi Programm die Daten auszulesen, bzw. zu senden.
Daher bin ich auf der Suche nach entsprechenden Komponenten.

Gefunden habe ich zwar einige (RSCOM, AsyncFree, Comport, TPAPro), aber keine davon war mit meinem Delphi XE kompatibel.
Daher meine Frage, ob mir jemand eine Empfehlung abgeben kann. (Aktuell geht es um den schulischen Aspekt, daher dürfen es auch kostengünstige Komponenten sein).
Lieben Dank zum Voraus.

Gruss
Blawen


glotzer - Sa 02.02.13 20:12

Hallo,

Extrem einfache Comport Klasse die ich mir mal geschrieben hab. Vieleicht hilft sie dir ja.


Grüße
Glotzer


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
unit ComPort;

interface

uses
  Windows, SysUtils, classes;

type
  TMyComPort = class
    private
      ComHandle : THandle;
      FConnected: boolean;
    public
      procedure write(msg: AnsiString);
    public
      constructor Create(port: AnsiString);
      destructor Destroy; override;
    public
      property Connected: boolean read FConnected;
  end;

procedure EnumComPorts(Ports: TStrings);

implementation

procedure EnumComPorts(Ports: TStrings);
var
  KeyHandle: HKEY;
  ErrCode, Index: Integer;
  ValueName, Data: string;
  ValueLen, DataLen, ValueType: DWORD;
  TmpPorts: TStringList;
begin
  ErrCode := RegOpenKeyEx(
    HKEY_LOCAL_MACHINE,
    'HARDWARE\DEVICEMAP\SERIALCOMM',
    0,
    KEY_READ,
    KeyHandle);

  if ErrCode <> ERROR_SUCCESS then
  begin
    exit;
  end;

  TmpPorts := TStringList.Create;
  try
    Index := 0;
    repeat
      ValueLen := 256;
      DataLen := 256;
      SetLength(ValueName, ValueLen);
      SetLength(Data, DataLen);
      ErrCode := RegEnumValue(
        KeyHandle,
        Index,
        PChar(ValueName),
        Cardinal(ValueLen),
        nil,
        @ValueType,
        PByte(PChar(Data)),
        @DataLen);

      if ErrCode = ERROR_SUCCESS then
      begin
        SetLength(Data, DataLen - 1);
        TmpPorts.Add(Data);
        Inc(Index);
      end
      else
        if ErrCode <> ERROR_NO_MORE_ITEMS then break;

    until (ErrCode <> ERROR_SUCCESS) ;

    TmpPorts.Sort;
    Ports.Assign(TmpPorts);
  finally
    RegCloseKey(KeyHandle);
    TmpPorts.Free;
  end;

end;

procedure TMyComPort.write(msg: AnsiString);
var
  i: integer;
begin
  i := FileWrite(ComHandle, msg[1], Length(msg));
  if (i <> Length(msg)) then
  begin
   RaiseLastOSError;
  end;
end;

constructor TMyComPort.Create(port: AnsiString);
var
  DCB : TDCB;
  TimeOut : TCommTimeouts;
  tmp: boolean;
begin
  FConnected := false;
  ComHandle := CreateFile(
    PChar('\\.\' + PAnsiChar(port) ),
    GENERIC_READ or GENERIC_WRITE,
    0,
    nil,
    OPEN_EXISTING,
    0,
    0);

  { Einstellungen zum COM-Port zuweisen, wenn die Verbindung aktiv ist }
  if (ComHandle > 0then
  begin
    if not GetCommState(ComHandle, DCB) then RaiseLastOSError;
    DCB.DCBlength := SizeOf(DCB);
    DCB.ByteSize := 8;
    DCB.Parity := NoParity;
    DCB.StopBits := 0;
    DCB.BaudRate := 57600;
    DCB.Flags := 1;
    if not SetCommState(ComHandle, DCB)then RaiseLastOSError;
  end else
  begin
    RaiseLastOSError;
  end;
  FConnected := true;
end;

destructor TMyComPort.Destroy;
begin
  FileClose(ComHandle);
  ComHandle := 0;
end;

end.


Blawen - Sa 02.02.13 21:55

Hallo Glotzer

user profile iconglotzer hat folgendes geschrieben Zum zitierten Posting springen:
Extrem einfache Comport Klasse die ich mir mal geschrieben hab. Vieleicht hilft sie dir ja.
Einfach ist immer gut. :-)

Mir ist noch nicht klar, wie der Aufruf der Prozedur EnumComPorts abläuft (Parameter), kannst Du mir auf die Sprünge helfen?


Lieben Dank.

Gruss
Blawen


Martok - Sa 02.02.13 22:17

user profile iconBlawen hat folgendes geschrieben Zum zitierten Posting springen:
Gefunden habe ich zwar einige (RSCOM, AsyncFree, Comport, TPAPro), aber keine davon war mit meinem Delphi XE kompatibel.
Sicher? Sollte sie nämlich eigentlich [http://sourceforge.net/projects/comport/] sein:

Readme
1:
2:
3:
| ComPort Library version 4.10                    |
| for Delphi 5, 6, 7, 2005, 2006, 2007, 2010, XE  |
| and C++ Builder 3, 4, 5, 6                      |


glotzer - Sa 02.02.13 22:34

user profile iconBlawen hat folgendes geschrieben Zum zitierten Posting springen:
Hallo Glotzer

user profile iconglotzer hat folgendes geschrieben Zum zitierten Posting springen:
Extrem einfache Comport Klasse die ich mir mal geschrieben hab. Vieleicht hilft sie dir ja.
Einfach ist immer gut. :-)

Mir ist noch nicht klar, wie der Aufruf der Prozedur EnumComPorts abläuft (Parameter), kannst Du mir auf die Sprünge helfen?


Lieben Dank.

Gruss
Blawen


Die Funktion sucht nach allen möglichen Comports in der Registry, danach werden sie in die übergebende Klasse geschrieben, welche von TStrings abgeleitet ist (z.B. TStringList TMemo.Strings etc etc)


Blawen - Sa 02.02.13 23:41

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Sicher?
Jein. Wobei ich unterdessen festgestellt habe, dass es an den mitgelieferten Beispielen liegt und nicht bei der eigentlichen Komponente.

user profile iconglotzer hat folgendes geschrieben Zum zitierten Posting springen:
Die Funktion sucht nach allen möglichen Comports in der Registry, danach werden sie in die übergebende Klasse geschrieben, welche von TStrings abgeleitet ist (z.B. TStringList TMemo.Strings etc etc)
Irgendwie mache ich den Aufruf falsch (EAccessViolation wenn ich eine TSringliste zuweise, Auslöser ist die Zeile

Delphi-Quelltext
1:
 Ports.Assign(TmpPorts);                    

Ich wäre Dir sehr dankbar, wenn Du mir ein Beispiel geben könntest, wie der Aufruf/Ablauf korrekt wäre.

Lieben Dank.

Gruss
Blawen


glotzer - So 03.02.13 00:06

aber gerne:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  l: TStringList;
begin
  L := TStringList.Create;
  EnumComPorts(l);
end;


Blawen - So 03.02.13 01:22

Mann, bin ich doof :oops:

Lieben Dank :-)