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. |