1.打開注冊表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\COM Name Arbiter
把ComDB刪除后重新嘗試即可!(注:這樣會重建所有COM口)。如果還不行,重啟電腦!
2.另:到注冊表下HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM將多余的COM口刪除即可
3.另外還可以看看集成的Modem是否占用了你的這個串口。
打開“控件面板”中的“電話/調(diào)制解調(diào)器選項(xiàng)”,在“調(diào)制解調(diào)器”選項(xiàng)卡中是否有一個連接占用著這個串口(如COM1)
解決方法:
如果有連接占用這個串口,直接刪除這個連接,重新啟動電腦,問題解決。
或者看看詳細(xì)原因:
1、用安全模式啟動,用系統(tǒng)自帶的通訊中的“超級終端”測試串口(COM1),
這時同樣報(bào)錯,不過錯誤信息更詳細(xì)了,如下:
******錯誤信息********
Windows 匯報(bào)了一個TAPI錯誤(80000048)。
請用“控件面板”中的“電話/調(diào)制解調(diào)器選項(xiàng)”
圖標(biāo)來確認(rèn)調(diào)制解調(diào)器安裝得是否正確。
**********************
2、然后把電腦正常啟動了。
打開“控件面板”中的“電話/調(diào)制解調(diào)器選項(xiàng)”,
發(fā)現(xiàn)在“調(diào)制解調(diào)器”選項(xiàng)卡中有一個連接占用著這個串口(COM1),
于是馬上刪除這個連接。
再用“超級終端”測試串口(COM1),不報(bào)錯了,
表示與串口(COM1)通訊正常。
3、把串口設(shè)備連接到串口(COM1)上,用相關(guān)軟件與設(shè)備通訊,正常,問題解決。
由於windows莫名其妙的registry原因,很多用戶發(fā)現(xiàn),在安裝藍(lán)牙管理軟件之後,對應(yīng)的藍(lán)牙虛擬端口居然變成COM9,甚至是COM13或更高,導(dǎo)致與許多應(yīng)用程序,如手機(jī)同步軟件,PDA同步軟件無法使用 ,多次重新安裝藍(lán)牙管理軟件只會讓狀況更惡化..
解決方案如下(執(zhí)行下列步驟之前,請務(wù)必卸載藍(lán)牙管理程序,并重新開機(jī))
1.在Windows系統(tǒng),按開始>執(zhí)行>輸入cmd,按回車
2.出現(xiàn)命令字符視窗之後,輸入
set DEVMGR_SHOW_NONPRESENT_DEVICES=1
按回車
devmgmt.msc
按回車
3.然后在設(shè)備管理器點(diǎn)擊>查看>顯示隱藏的設(shè)備
您現(xiàn)在能能刪除多余的端口了,刪除完畢之後,請務(wù)必重新開機(jī)
4.重新安裝藍(lán)牙管理軟件
5.如果您想永久性投入這個環(huán)境變量到XP, 到我的電腦>點(diǎn)選之後,按鼠標(biāo)右鍵>屬性>高級>環(huán)境變量
在系統(tǒng)變量里面,按"新建",在"變量名"里面填入" DEVMGR_SHOW_NONPRESENT_DEVICES" ,變量值填入"1"
參考:
徹底解決COM端口被占用(在使用中)問題的辦法
如何釋放被占用的COM口?
清理COM端口被占用(在使用中)問題的辦法
編程方面:
如何知道COM端口在使用中
假如機(jī)器上原來有兩個COM口,COM1和COM2
安裝了一個USB設(shè)備后,這個USB設(shè)備使用了VCP(virtual com port)把COM3占用了,
當(dāng)我安裝另一個新設(shè)備時,我如何知道哪些COM口已被分配呢?
通過設(shè)備管理器無疑是可以看出來,那如何編程實(shí)現(xiàn)呢?
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;