请问用程序如何判断串口是被占用,还是串口不存在?我用的是spcomm控件。

yikeshu_888 2007-03-16 09:26:12
我用的是spcomm控件。

我现在是用这种方法:

if ComPortAvailable('COM1:') then
begin
//ShowMessage('com1口可以使用.!');
end
else
begin
try
comm1.CommName:='com1';
comm1.StopComm;
sleep(500);
comm1.StartComm;
Lblopencom.Caption:='当前使用的串口为:com1';
exit;
except
showmessage('不存在串口1或被占用。');
end;
end;

所用的函数:
function ComPortAvailable(Port:PChar):boolean;
Var
DeviceName:Array[0..80] of Char;
ComFile:THandle;
begin
StrPCopy(DeviceName,Port);
ComFile:=CreateFile(DeviceName,GENERIC_READ or GENERIC_WRITE,0,Nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
Result:=ComFile<>INVALID_HANDLE_VALUE;
CloseHandle(ComFile);
end;

上述的程序最大的一个问题是不能区分该串口是被占用,还是不存在。

请高手指点,谢谢。
...全文
1393 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jadeluo 2007-03-16
  • 打赏
  • 举报
回复
查询注册表: \HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM, 可以获得当前计算机中所有可用串口的名称, 然后再逐一检测它们是否被占用。
yikeshu_888 2007-03-16
  • 打赏
  • 举报
回复
是的,好像用另外一个程序是关不了的。
constantine 2007-03-16
  • 打赏
  • 举报
回复
自己用createfile打开看看就知道了,不过无法知道串口是被使用还是不存在
注册表方法不行,里面有的,不一定表示就真的有,没有的也不表示真的没有
用别的程序应该关不了的!
yikeshu_888 2007-03-16
  • 打赏
  • 举报
回复
谢楼上朋友,

现在发现在问题的症结。

即如果第一个软件打开了串口1,现在我用另一个软件试图先关闭串口1,然后再打开串口1,此时会报错,提示该串口被占用或不存在。

比如我用串口调试器软件打开了串口1,然后我再打开我的程序,试图先关掉串口1,再打开串口1,可这样会报错。

请问是不是在另一个软件里关闭不掉先前的软件所占用的串口?
有没有解决办法。

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧