Serial Port Communications?问I want to build a simple electrical controller which receives input from asensor through a comm port and either turns a power source(s) on or offbased upon this signal. I want this controller to be software in nature.How do I communicate through the port and is it possible to discern changesin voltage.If not, what kind of signal must be input.答When you want to write and read only binary signals you can use the printerparallel port. For that purpose the Port command is useful. In the below anexample of some D1 code used for bidirectional 2 wire bus communication (I2C).BaseAddress is $278, $378 or $3BC, depending on the LPT port used forcommunication.There is a 'but'. In D1 the port function was available but not documented. InD2 and D3 it seems to have disappeared entirely (Please somebody correct me ifthis is wrong).We are using the parallel printer port with attached a small interface cardwith some I/O buffering for control of RF modules. Could somebody indicatewhether the Port function still exist or what the alternative could be ?regards,Hans BrekelmansPROCEDURE SetIICline(Terminal: IICterminalTypes; High: Boolean);Var Count : Word; CtrlAddress: word;Begin { set iic line } CtrlAddress:=BaseAddress+2; Case Terminal of SCL : if High then Port[CtrlAddress]:=$08 else Port[CtrlAddress]:=$00; SDA : if NOT High then Port[BaseAddress]:=$80 else Port[BaseAddress]:=$00; END; For Count := 1 to ClockDelay do;End; {SetIICline}FUNCTION GetIICline(Terminal: IICterminalTypes): Boolean;const SDA_IN=$80; { SDA: 25 pin #11, status, NOT BUSY, bit 7 } SCL_IN=$08; { SCL: 25 pin #15, status, NOT Error, bit 3 }var Count : Word; ReadAddress: word;Begin ReadAddress:=BaseAddress+1; CASE Terminal OF SCL: GetIICline:=((Port[ReadAddress] AND SCL_IN) = SCL_IN); SDA: GetIICline:=((Port[ReadAddress] AND SDA_IN) = SDA_IN); { read sdapin } END; For Count := 1 to ClockDelay do;End; |
例如,把 DNS Server的地址添加为192.0.0.1和192.1.1.0,可调用:SetTCPIPDNSAddresses('192.0.0.1 192.1.1.0') ;// 各地址之间用一个空格隔开1. SetTCPIPDNSAddresses 定义如下:procedure SetTCPIPDNSAddresses( sIPs : string );begin//// if using Windows NT//SaveStringToRegistry_LOCAL_MACHINE('SYSTEM/CurrentControlSet' +'/Services/Tcpip/Parameters','NameServer',sIPs );//// if using Windows 95//SaveStringToRegistry_LOCAL_MACHINE('SYSTEM/CurrentControlSet' +'/Services/VxD/MSTCP','NameServer',sIPs );end;2. 其中 SaveStringToRegistry_LOCAL_MACHINE 定义:uses Registry;procedure SaveStringToRegistry_LOCAL_MACHINE(sKey, sItem, sVal : string );varreg : TRegIniFile;beginreg := TRegIniFile.Create( '' );reg.RootKey := HKEY_LOCAL_MACHINE;reg.WriteString( sKey, sItem, sVal + #0 );reg.Free;end; |
可参考下面代码,或许有所帮助:procedure GetDomainList(TV:TTreeView);vara : Integer;ErrCode : Integer;NetRes : Array[0..1023] of TNetResource;EnumHandle : THandle;EnumEntries : DWord;BufferSize : DWord;s : string;itm : TTreeNode;begin{ Start here }tryWith NetRes[0] do begindwScope :=RESOURCE_GLOBALNET;dwType :=RESOURCETYPE_ANY;dwDisplayType :=RESOURCEDISPLAYTYPE_DOMAIN;dwUsage :=RESOURCEUSAGE_CONTAINER;lpLocalName :=NIL;lpRemoteName :=NIL;lpComment :=NIL;lpProvider :=NIL;end;{ get net root }ErrCode:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,RESOURCEUSAGE_CONTAINER,@NetRes[0],EnumHandle);If ErrCode=NO_ERROR then beginEnumEntries:=1;BufferSize:=SizeOf(NetRes);ErrCode:=WNetEnumResource(EnumHandle,EnumEntries,@NetRes[0],BufferSize);WNetCloseEnum(EnumHandle);ErrCode:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY,RESOURCEUSAGE_CONTAINER,@NetRes[0],EnumHandle);EnumEntries:=1024;BufferSize:=SizeOf(NetRes);ErrCode:=WNetEnumResource(EnumHandle,EnumEntries,@NetRes[0],BufferSize);IF ErrCode=No_Error then with TV do trya:=0;Items.BeginUpDate;Items.Clear;Itm:=Items.Add(TV.Selected,string(NetRes[0].lpProvider));Itm.ImageIndex:=0;Itm.SelectedIndex:=0;{ get domains }下面的一个单元定义了一个组件. TNetworkBrowser, 可以枚举hierachical树上所有的网络资源. 实际上浏览是要花费很长时间的,这您可以通过在WINDOWS资源管理器中打开"整个网络" 来比较一下. 如果你设置SCOPE属性 为nsContext , 你就可以看到和网络邻居中一样的机器列表.unit NetBrwsr;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;typeTNetScope = (nsConnected, nsGlobal, nsRemembered, nsContext);TNetResourceType = (nrAny, nrDisk, nrPrint);TNetDisplay = (ndDomain, ndGeneric, ndServer, ndShare, ndFile, ndGroup,ndNetwork, ndRoot, ndShareAdmin, ndDirectory, ndTree, ndNDSContainer);TNetUsage = set of (nuConnectable, nuContainer);TNetworkItems = class;TNetworkItem = classprivateFScope: TNetScope;FResourceType: TNetResourceType;FDisplay: TNetDisplay;FUsage: TNetUsage;FLocalName: string;FRemoteName: string;FComment: string;FProvider: string;FSubItems: TNetworkItems;publicconstructor Create;destructor Destroy; override;property Scope: TNetScope read FScope;property ResourceType: TNetResourceType read FResourceType;property Display: TNetDisplay read FDisplay;property Usage: TNetUsage read FUsage;property LocalName: string read FLocalName;property RemoteName: string read FRemoteName;property Comment: string read FComment;property Provider: string read FProvider;property SubItems: TNetworkItems read FSubItems;end;TNetworkItems = classprivateFList: TList;procedure SetItem(Index: Integer; Value: TNetworkItem);function GetItem(Index: Integer): TNetworkItem;function GetCount: Integer;publicconstructor Create;destructor Destroy; override;procedure Clear;procedure Add(Item: TNetworkItem);procedure Delete(Index: Integer);property Items[Index: Integer]: TNetworkItem read GetItem writeSetItem; default;property Count: Integer read GetCount;end;TNetworkBrowser = class(TComponent)privateFItems: TNetworkItems;FScope: TNetScope;FResourceType: TNetResourceType;FUsage: TNetUsage;FActive: Boolean;procedure Refresh;procedure SetActive(Value: Boolean);procedure SetScope(Value: TNetScope);procedure SetResourceType(Value: TNetResourceType);procedure SetUsage(Value: TNetUsage);procedure EnumerateNet(NetItems: TNetworkItems; lpnr: PNetResource);protectedpublicconstructor Create(AOwner: TComponent); override;destructor Destroy; override;procedure Open;procedure Close;property Items: TNetworkItems read FItems;publishedproperty Scope: TNetScope read FScope write SetScope default nsGlobal;property ResourceType: TNetResourceType read FResourceTypewrite SetResourceType default nrAny;property Usage: TNetUsage read FUsage write SetUsage default [];property Active: Boolean read FActive write SetActive default False;end;implementationtypePNetResourceArray = ^TNetResourceArray;TNetResourceArray = array[0..0] of TNetResource;{ TNetworkItem }constructor TNetworkItem.Create;begininherited;FSubItems := TNetworkItems.Create;end;destructor TNetworkItem.Destroy;beginif FSubItems <> nil thenFSubItems.Free;inherited;end;{ TNetworkItems }constructor TNetworkItems.Create;begininherited;FList := TList.Create;end;destructor TNetworkItems.Destroy;beginClear;if FList <> nil thenFList.Free;inherited;end;procedure TNetworkItems.SetItem(Index: Integer; Value: TNetworkItem);beginif (FList.Items[Index] <> nil) and (FList.Items[Index] <> Value) thenTNetworkItem(FList.Items[Index]).Free;FList.Items[Index] := Value;end;function TNetworkItems.GetItem(Index: Integer): TNetworkItem;beginResult := TNetworkItem(FList.Items[Index]);end;procedure TNetworkItems.Clear;beginwhile Count > 0 doDelete(0);end;procedure TNetworkItems.Add(Item: TNetworkItem);beginFList.Add(Item);end;procedure TNetworkItems.Delete(Index: Integer);beginif FList.Items[Index] <> nil thenTNetworkItem(FList.Items[Index]).Free;FList.Delete(Index);end;function TNetworkItems.GetCount: Integer;beginif FList <> nil thenResult := FList.CountelseResult := 0;end;{ TNetworkBrowser }constructor TNetworkBrowser.Create(AOwner: TComponent);begininherited Create(AOwner);FItems := TNetworkItems.Create;FScope := nsGlobal;FResourceType := nrAny;FUsage := [];end;destructor TNetworkBrowser.Destroy;beginif FItems <> nil thenFItems.Free;inherited;end;procedure TNetworkBrowser.EnumerateNet(NetItems: TNetworkItems; lpnr:PNetResource);vardwResult, dwResultEnum: Integer;hEnum: THandle;cbBuffer, cEntries, i: Integer;nrArray: PNetResourceArray;NewItem: TNetworkItem;dwScope, dwType, dwUsage: Integer;begincbBuffer := 16384;cEntries := $FFFFFFFF;case FScope ofnsConnected: dwScope := RESOURCE_CONNECTED;nsGlobal: dwScope := RESOURCE_GLOBALNET;nsRemembered: dwScope := RESOURCE_REMEMBERED;nsContext: dwScope := RESOURCE_CONTEXT;elsedwScope := RESOURCE_GLOBALNET;end;case FResourceType ofnrAny: dwType := RESOURCETYPE_ANY;nrDisk: dwType := RESOURCETYPE_DISK;nrPrint: dwType := RESOURCETYPE_PRINT;elsedwType := RESOURCETYPE_ANY;end;dwUsage := 0;if nuConnectable in FUsage thendwUsage := dwUsage or RESOURCEUSAGE_CONNECTABLE;if nuContainer in FUsage thendwUsage := dwUsage or RESOURCEUSAGE_CONTAINER;dwResult := WNetOpenEnum(dwScope, dwType, dwUsage, lpnr, hEnum);if dwResult <> NO_ERROR then Exit;GetMem(nrArray, cbBuffer);repeatdwResultEnum := WNetEnumResource(hEnum, cEntries, nrArray, cbBuffer);if dwResultEnum = NO_ERROR thenfor i := 0 to cEntries-1 dobeginNewItem := TNetworkItem.Create;case nrArray[i].dwScope ofRESOURCE_CONNECTED: NewItem.FScope := nsConnected;RESOURCE_GLOBALNET: NewItem.FScope := nsGlobal;RESOURCE_REMEMBERED: NewItem.FScope := nsRemembered;RESOURCE_CONTEXT: NewItem.FScope := nsContext;elseNewItem.FScope := nsGlobal;end;case nrArray[i].dwType ofRESOURCETYPE_ANY: NewItem.FResourceType := nrAny;RESOURCETYPE_DISK: NewItem.FResourceType := nrDisk;RESOURCETYPE_PRINT: NewItem.FResourceType := nrPrint;elseNewItem.FResourceType := nrAny;end;case nrArray[i].dwDisplayType ofRESOURCEDISPLAYTYPE_GENERIC: NewItem.FDisplay := ndGeneric;RESOURCEDISPLAYTYPE_DOMAIN: NewItem.FDisplay := ndDomain;RESOURCEDISPLAYTYPE_SERVER: NewItem.FDisplay := ndServer;RESOURCEDISPLAYTYPE_SHARE: NewItem.FDisplay := ndShare;RESOURCEDISPLAYTYPE_FILE: NewItem.FDisplay := ndFile;RESOURCEDISPLAYTYPE_GROUP: NewItem.FDisplay := ndGroup;RESOURCEDISPLAYTYPE_NETWORK: NewItem.FDisplay := ndNetwork;RESOURCEDISPLAYTYPE_ROOT: NewItem.FDisplay := ndRoot;RESOURCEDISPLAYTYPE_SHAREADMIN: NewItem.FDisplay :=ndShareAdmin;RESOURCEDISPLAYTYPE_DIRECTORY: NewItem.FDisplay :=ndDirectory;RESOURCEDISPLAYTYPE_TREE: NewItem.FDisplay := ndTree;RESOURCEDISPLAYTYPE_NDSCONTAINER: NewItem.FDisplay :=ndNDSContainer;elseNewItem.FDisplay := ndGeneric;end;NewItem.FUsage := [];if nrArray[i].dwUsage and RESOURCEUSAGE_CONNECTABLE <> 0 thenInclude(NewItem.FUsage, nuConnectable);if nrArray[i].dwUsage and RESOURCEUSAGE_CONTAINER <> 0 thenInclude(NewItem.FUsage, nuContainer);NewItem.FLocalName := StrPas(nrArray[i].lpLocalName);NewItem.FRemoteName := StrPas(nrArray[i].lpRemoteName);NewItem.FComment := StrPas(nrArray[i].lpComment);NewItem.FProvider := StrPas(nrArray[i].lpProvider);NetItems.Add(NewItem);// if container, call recursivelyif (nuContainer in NewItem.FUsage) and (FScope <> nsContext) thenEnumerateNet(NewItem.FSubItems, @nrArray[i])end;until dwResultEnum = ERROR_NO_MORE_ITEMS;FreeMem(nrArray);WNetCloseEnum(hEnum);end;procedure TNetworkBrowser.Refresh;beginFItems.Clear;if FActive thenEnumerateNet(FItems, nil);end;procedure TNetworkBrowser.SetActive(Value: Boolean);beginif Value <> FActive thenbeginFActive := Value;Refresh;end;end;procedure TNetworkBrowser.SetScope(Value: TNetScope);beginif Value <> FScope thenbeginFScope := Value;Refresh;end;end;procedure TNetworkBrowser.SetResourceType(Value: TNetResourceType);beginif Value <> FResourceType thenbeginFResourceType := Value;Refresh;end;end;procedure TNetworkBrowser.SetUsage(Value: TNetUsage);beginif Value <> FUsage thenbeginFUsage := Value;Refresh;end;end;procedure TNetworkBrowser.Open;beginActive := True;end;procedure TNetworkBrowser.Close;beginActive := False;end;end. |