如何能够知道一个串口是否存在?(50分)

待飞

Unregistered / Unconfirmed
GUEST, unregistred user!
现在要做一个串行通信程序,要求串口是可选的,以满足不同机器上的运行
那么怎么才能够检测到一个串口是否存在呢?
比如说如果检测不到COM3则用户选COM3提示一个错误
 
用COMPORT组件

ComPort1.Port := 'COM3';
ComPort1.BaudRate := br9600;
ComPort1.DataBits := dbEight;
ComPort1.Parity.Bits := prNone;
ComPort1.StopBits := sbOneStopBit;
ComPort1.Open;
Result := ComPort1.Connected;

uses Registry;

procedure TForm1.Button3Click(Sender: TObject);
var
reg : TRegistry;
ts : TStrings;
i : integer;
begin
reg := TRegistry.Create;
try
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('hardware/devicemap/serialcomm',false);
ts := TStringList.Create;
try
reg.GetValueNames(ts); //获得子键下的所有项
for i := 0 to ts.Count -1 do
begin //把每一项下的串值显示在Memo1中
Memo1.Lines.Add(reg.ReadString(ts.Strings));
end;
finally
ts.Free;
end;
finally
reg.CloseKey;
reg.free;
end;
end;

以上程序可以判断哪些串口已经被使用.

 
function TPCDataLink.GetAvailableCommPort:String;
var
I:Integer;
myhCommFile:THandle;
CommPort:String;
//count : Integer;
begin
Result := '';
//count := CommPortList.Count;
For I := 1 to 4 do
begin
CommPort := 'COM'+inttostr(I);
myhCommFile := CreateFile( PChar(CommPort),
GENERIC_READ or GENERIC_WRITE,
0, {not shared}
nil, {no security ??}
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,
0 {template} );
{$ifdef _Debug}
LogFileAddLine('Sync Manager is accessing Comm Port : '+CommPort);
{$endif}
if myhCommFile <> INVALID_HANDLE_VALUE then
begin
CloseHandle(myhCommFile);
if Result = '' then
Result := CommPort;

if CommPort = 'COM1' then
Com11.Enabled := True
else if CommPort = 'COM2' then
Com21.Enabled := True
else if CommPort = 'COM3' then
Com31.Enabled := True
else
Com41.Enabled := True;
exit;
end
else
begin
if CommPort = 'COM1' then
Com11.Enabled := False
else if CommPort = 'COM2' then
Com21.Enabled := False
else if CommPort = 'COM3' then
Com31.Enabled := False
else
Com41.Enabled := False;
end;
end;
end;
 
to mlzhou :
这是两种实现方式还是结合使用的?
Result := ComPort1.Connected 是串口连接的结果吗?
uses Registry部分不是太懂,还正在看
谢谢
 
对,我就是尝试打开,如果成功就是存在
 
两种实现方式
 
可是我在程序中没有用Result := ComPort1.Connected 时
选择一个不存在的串口通信会导致死机
to peng_qs, :
你的这段程序是在一个特定的组件基础上编写的吧?
我刚用DELPHI,只了解和会用极少的几个控件

 
用第二个方法
 
我现在用的是MsComm,程序已经编好了,这个组件里没有判断串口是否存在的方法吧?
 
多人接受答案了。
 
顶部