<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        COM端口被占用(在使用中)的問題

        作者:佚名   來源:本站原創   點擊數:  更新時間:2014年09月17日   【字體:

        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)上,用相關軟件與設備通訊,正常,問題解決。

        關于使用藍牙設備時COM口被占用問題
          由於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;

        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮