WindowsでCOMポート番号をリセットしてクリーンアップする方法

COMポートの扱い、特に複数のデバイスやBluetoothアダプタを接続する場合の扱いは、しばしば頭痛の種となります。Windowsはデバイスを接続するたびに1から255までのCOMポート番号を自動的に割り当てますが、場合によってはシステムが数十ものポートで溢れ、COM1からCOM9までしか扱えないレガシーアプリケーションの動作を困難にすることがあります。これは厄介な問題です。古いプログラムの中には、COMポート番号が9より大きいと動作しなくなるものがあり、この混乱を解消するのは必ずしも簡単ではありません。COMポートの割り当てを変更、解放、またはリセットする方法を知っておくと、特にデバイスの競合やドライバの問題を抱えている場合には、多くのストレスを軽減できます。

WindowsでデバイスのCOMポート番号を変更する方法

デバイスマネージャーでCOMポートを調整する

デバイスのポート割り当てが気に入らない、または使えない場合、まず最初に試すべき方法です。この方法は、そのポートが既に頻繁に使用されていたり予約済みでなかったりしない限り有効です。Windowsによっては新しいポートを選択できる場合もありますが、そうでない場合は、そのポートが使用中または予約済みになっていることが原因です。その場合は、もう少し深く調べる必要があるかもしれません(下記参照)。

  • devmgmt.mscデバイス マネージャー を開きます。 実行 ボックス ( Win + R) に入力するか、スタート メニューで検索することができます。
  • メニューで、[表示] -> [非表示のデバイスの表示] を選択します。これを行わないと、デバイスが完全に表示されない場合があるためです。
  • ポート(COMとLPT)までスクロールダウンして展開し、お使いのデバイスを見つけます。複数のエントリが表示された場合は、お使いのデバイスに関連するエントリを特定してください。
  • デバイスを右クリックし、[プロパティ] を選択して、[ポート設定] タブに移動し、[詳細設定] をタップします。
  • 現在のCOMポート番号は、「COMポート番号」ドロップダウンリストに表示されます。不要な番号が表示されている場合は、より小さい番号(COM3やCOM5など)に変更してみてください。

Windowsで低いポート番号を選択できるかどうかは、いわば運任せです。そのポートが既に使用中または予約済みの場合、ドロップダウンで変更できないことがあります。そのような場合は、ポート予約を解放する必要があります(下記参照)。

デバイス マネージャーで COM ポートの予約を解除または解放する

  • ポート (COM と LPT) セクションを再度展開し、解放するポートを見つけて、淡いアイコン (予約済みだが接続されていないことを意味する) を探します。
  • そのポートを右クリックし、「アンインストール」を選択します。これはドライバーを削除するものではなく、COM番号を解放するだけなのでご安心ください。
  • アンインストール後、デバイスを再接続するか、プロパティの [詳細設定] を使用してポートを再構成し、空いている COM ポートを割り当てます。

この方法がうまくいかない場合 (Windows がポートを直接解放しないことがあるため)、PowerShell を使用して使用中の COM ポートをすべて一覧表示する便利な方法があります。

Get-WMIObject Win32_SerialPort | Select-Object Name, DeviceID, Description

または、たとえばデバイス名がわかっている場合は、特定のデバイスに絞り込むことができます。

Get-WMIObject Win32_SerialPort | Where-Object { $_. Name -like "*Bluetooth*" } | Select-Object Name, DeviceID

これにより、接続されているポートを簡単に確認できます。すべてのポートが使用されているわけではありませんが、追加の手順なしでは解放するのが難しいポートもあります。

COMポートをブロックしているプロセスを見つける

プロセスまたはドライバがCOMポートをアクティブに使用している場合、Windowsでは単に割り当てを変更したりアンインストールしたりすることはできません。そのプロセスを見つけて強制終了する必要があります。最適なツールはSysinternalsのProcess Explorerです。このような作業にはまさに天の恵みです。

ステップ 1: PowerShell を開いて実行します。

get-pnpdevice -class Ports -ea 0 | Select Name, PNPDeviceID, Status, Service

これにより、接続されているデバイスがわかります。サービス 列には シリアル などと表示されている場合があります。次に、プロセス エクスプローラー を管理者として実行し(リンクはこちら)、検索 -> ハンドルまたは DLL の検索 を選択します。先ほど確認したサービス名(「Serial」、「usbser」など)を入力してください。

Process Explorerを使えば、ポートをロックしているアプリやドライバーを見つけられます。そのCOMポートを完全に解放したい場合は、そのプロセスを閉じるか再起動するか、ドライバーをいじる必要があるかもしれません。少しハックっぽいですが、どうしても解決できない場合には有効です。

レジストリでCOMポートの割り当てをリセットする

徹底的なクリーンアップを行うには、レジストリに予約済みCOMポートを定義するキーが保存されています。正直なところ、レジストリをいじるのは、慣れていない限り避けるべきです。ちょっとしたミスでブルースクリーンが発生してしまうからです。それでも、他の方法を試してもダメな場合は、最後の手段です。

  • regedit.exe実行 ボックスから実行して regedit を開きます。
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\COM Name Arbiterに移動します。このキーを必ずバックアップしてください([ファイル] -> [エクスポート])。
  • ComDB の値を見つけてください。これはバイナリデータです。注意して編集してください。例えば、すべてのポートを解放する必要がある場合、この値を 0 に設定すると予約がリセットされます。ただし、この値を安易に編集すると、余分なビットを追加してブルースクリーン(BSOD)を引き起こす可能性があるので注意してください。
  • 確認すべきもう1つのキーは、HKEY_LOCAL_MACHINE\SYSTEM\HARDWARE\DEVICEMAP\SERIALCOMMです。接続されている場合、このキーにはアクティブなポートが人間が読める形式でリストされます。
  • 必要に応じて、ポートまたは予約情報から特定のポートのエントリを削除し、PC を再起動して変更を適用できます。

クリーンアップツールとしては、デバイスクリーンアップツール が挙げられます。これは、レジストリから孤立したデバイスエントリを削除し、COMポートを不必要に予約している可能性のある古いデバイスを切断するのに役立ちます(GitHubリポジトリを参照)。ただし、Microsoftによる公式サポートではないため、事前にバックアップを取っておくことをお勧めします。

まとめ

COMポートの管理は、特に複数のシリアルデバイスやBluetoothデバイスを接続した後は、非常に面倒になることがあります。デバイスマネージャーでポート番号を調整したり、PowerShellでポートを解放したり、レジストリを編集したりすることで、これらの問題を解決できます。ただし、すべての修正が最初の試みでうまくいくとは限らず、Windowsがポートを解放してくれない場合もあります。その場合は、忍耐強く待つか、より高度なレジストリの調整が必要になります。

まとめ

  • まずデバイス マネージャーを使用して COM ポートを変更してみてください。ただし、ポートがビジー状態の場合は変更できないこともあります。
  • 必要に応じて、PowerShell コマンドを使用して COM ポートの予約を解除するか、それらのポートを保持しているユーザーを見つけます。
  • Process Explorer を使用して、ポートをブロックしているプロセスを特定し、必要に応じて閉じます。
  • 解決が難しい場合は、レジストリを慎重に編集して COM ポートの割り当てをリセットします。

結論

COMポートの問題に対処するのは面倒ですが、これらの手順でほとんどのシナリオに対応できるはずです。場合によっては、レジストリを操作せずにポートを解放したり、割り当てを変更したりするだけで解決できることもあります。それでも解決しない場合は、再起動やドライバーの再インストールが役立つかもしれません。ただし、レジストリを操作する前に必ずバックアップを取ってください。Windowsでは、これらの割り当ての変更が本来よりも複雑になっています。COMポートのせいでシステムがごちゃごちゃして困っている方に、少しでもお役に立てれば幸いです。複数の環境でうまくいった方法なので、ご安心ください。