1.打开注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\COM Name Arbiter
把ComDB删除后重新尝试即可!(注:这样会重建所有COM口)。如果还不行,重启电脑!
2.另:到注册表下HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM将多余的COM口删除即可
3.另外还可以看看集成的Modem是否占用了你的这个串口。
打开“控件面板”中的“电话/调制解调器选项”,在“调制解调器”选项卡中是否有一个连接占用着这个串口(如COM1)
解决方法:
如果有连接占用这个串口,直接删除这个连接,重新启动电脑,问题解决。
或者看看详细原因:
1、用安全模式启动,用系统自带的通讯中的“超级终端”测试串口(COM1),
这时同样报错,不过错误信息更详细了,如下:
******错误信息********
Windows 汇报了一个TAPI错误(80000048)。
请用“控件面板”中的“电话/调制解调器选项”
图标来确认调制解调器安装得是否正确。
**********************
2、然后把电脑正常启动了。
打开“控件面板”中的“电话/调制解调器选项”,
发现在“调制解调器”选项卡中有一个连接占用着这个串口(COM1),
于是马上删除这个连接。
再用“超级终端”测试串口(COM1),不报错了,
表示与串口(COM1)通讯正常。
3、把串口设备连接到串口(COM1)上,用相关软件与设备通讯,正常,问题解决。
由於windows莫名其妙的registry原因,很多用户发现,在安装蓝牙管理软件之後,对应的蓝牙虚拟端口居然变成COM9,甚至是COM13或更高,导致与许多应用程序,如手机同步软件,PDA同步软件无法使用 ,多次重新安装蓝牙管理软件只会让状况更恶化..
解决方案如下(执行下列步骤之前,请务必卸载蓝牙管理程序,并重新开机)
1.在Windows系统,按开始>执行>输入cmd,按回车
2.出现命令字符视窗之後,输入
set DEVMGR_SHOW_NONPRESENT_DEVICES=1
按回车
devmgmt.msc
按回车
3.然后在设备管理器点击>查看>显示隐藏的设备
您现在能能删除多余的端口了,删除完毕之後,请务必重新开机
4.重新安装蓝牙管理软件
5.如果您想永久性投入这个环境变量到XP, 到我的电脑>点选之後,按鼠标右键>属性>高级>环境变量
在系统变量里面,按"新建",在"变量名"里面填入" DEVMGR_SHOW_NONPRESENT_DEVICES" ,变量值填入"1"
参考:
彻底解决COM端口被占用(在使用中)问题的办法
如何释放被占用的COM口?
清理COM端口被占用(在使用中)问题的办法
编程方面:
如何知道COM端口在使用中
假如机器上原来有两个COM口,COM1和COM2
安装了一个USB设备后,这个USB设备使用了VCP(virtual com port)把COM3占用了,
当我安装另一个新设备时,我如何知道哪些COM口已被分配呢?
通过设备管理器无疑是可以看出来,那如何编程实现呢?
uses
Windows, SysUtils, Registry, Math;
const
n_MaxComPortCnt = 256;
sKey_COMNameArbiter = '/System/CurrentControlSet/Control/COM Name Arbiter/';
sKey_NameComDB = 'ComDB';
resourcestring
sErr_OpenRegKey = 'Failed to open register key: %s';
sErr_WrongComPortName = 'Wrong COM port name: %s';
sErr_ProcNA = 'Processing not available for Com Port: %s';
function CalComPortIndex(const AComPortName: Integer): Integer;
var
QT, Res: Integer;
begin
// Each 8 ports per Byte.
QT := AComPortName div 8;
Res := AComPortName mod 8;
if QT = 0 then
begin
// 01..07
Result := AComportName;
end else begin
if Res = 0 then
begin
// 08, 16, 32...
Result := 8;
end else begin
Result := Res;
end;
end;
end;
function CalByteIndex(const AComPortName: Integer): Integer;
begin
// Each 8 ports per Byte.
Result := 0;
if AComPortName > n_MaxComPortCnt then Exit;
Result := (AComPortName div 8) + 1;
end;
function ComPortInstalled(AComPortName: string): Boolean;
var
nName, Len: Integer;
bIdx, pIdx, Flags: Integer;
Reg: TRegistry;
FlagBuff: array[1..n_MaxComPortCnt] of Byte; // Each 8 ports per Byte.
Value: Cardinal;
begin
(*
* Binary value: 31 00 00 00 00 00 00 00 .... (32 byte in total)
* 0 0 0 1 1 1 1 1
* 8th 7th 6th 5th 4th 3rd 2nd 1st (Each bit for one port)
*
* COM1 - COM5 installed(occupied), but it doesn't tell they are busy!
*)
Len := Length(AComPortName);
nName := StrToIntDef(Copy(AComPortName, 4, Len-3), 0);
if nName = 0 then
raise Exception.CreateFmt(sErr_WrongComPortName, [AComPortName]);
pIdx := CalComPortIndex(nName);
bIdx := CalByteIndex(nName);
if bIdx = 0 then
raise Exception.CreateFmt(sErr_ProcNA, [AComPortName]);
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
FillChar(FlagBuff, Length(FlagBuff), 0);
if Reg.OpenKey(sKey_COMNameArbiter, False) then
Reg.ReadBinaryData(sKey_NameComDB, FlagBuff[1], SizeOf(FlagBuff))
else
raise Exception.CreateFmt(sErr_OpenRegKey, [sKey_COMNameArbiter]);
finally
Reg.Free;
end;
Flags := FlagBuff[bIdx];
Value := Round(Power(2, pIdx-1));
Result := (Flags and Value) = Value;
end;