Autor |
Beitrag |
Blawen
      
Beiträge: 616
Erhaltene Danke: 33
Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
|
Verfasst: 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
      
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: 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
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);
if (ComHandle > 0) then 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 
      
Beiträge: 616
Erhaltene Danke: 33
Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
|
Verfasst: Sa 02.02.13 21:55
Hallo Glotzer
glotzer hat folgendes geschrieben : | 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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Sa 02.02.13 22:17
Blawen hat folgendes geschrieben : | 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:
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
      
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: Sa 02.02.13 22:34
_________________ ja, ich schreibe grundsätzlich alles klein und meine rechtschreibfehler sind absicht
|
|
Blawen 
      
Beiträge: 616
Erhaltene Danke: 33
Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
|
Verfasst: Sa 02.02.13 23:41
Martok hat folgendes geschrieben : | Sicher?
|
Jein. Wobei ich unterdessen festgestellt habe, dass es an den mitgelieferten Beispielen liegt und nicht bei der eigentlichen Komponente.
glotzer hat folgendes geschrieben : | 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
_________________ Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro
|
|
glotzer
      
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: 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; |
_________________ 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 
      
Beiträge: 616
Erhaltene Danke: 33
Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
|
Verfasst: So 03.02.13 01:22
Mann, bin ich doof
Lieben Dank 
_________________ Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro
|
|
|