Autor Beitrag
Blawen
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 616
Erhaltene Danke: 33

Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
BeitragVerfasst: Sa 02.02.13 19:27 
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

_________________
Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro ;-)
glotzer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: 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

ausblenden volle Höhe 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.

_________________
ja, ich schreibe grundsätzlich alles klein und meine rechtschreibfehler sind absicht

Für diesen Beitrag haben gedankt: Blawen
Blawen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 616
Erhaltene Danke: 33

Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
BeitragVerfasst: 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

_________________
Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro ;-)
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: 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 sein:
ausblenden 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                      |

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
glotzer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: 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)

_________________
ja, ich schreibe grundsätzlich alles klein und meine rechtschreibfehler sind absicht
Blawen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 616
Erhaltene Danke: 33

Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
BeitragVerfasst: 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
ausblenden 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

_________________
Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro ;-)
glotzer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: So 03.02.13 00:06 
aber gerne:

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

_________________
ja, ich schreibe grundsätzlich alles klein und meine rechtschreibfehler sind absicht


Zuletzt bearbeitet von glotzer am So 03.02.13 01:41, insgesamt 1-mal bearbeitet
Blawen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 616
Erhaltene Danke: 33

Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
BeitragVerfasst: So 03.02.13 01:22 
Mann, bin ich doof :oops:

Lieben Dank :-)

_________________
Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro ;-)