1

comm.jarの使用で問題が発生しています。

問題は、デバイスを接続し、このコードを使用してプールでアプリケーションを開始したことです

 public static void main(String[] args) {
        Enumeration portList;
        CommPortIdentifier portId = null;
        portList = CommPortIdentifier.getPortIdentifiers();
        while (portList.hasMoreElements()) {
            portId = (CommPortIdentifier) portList.nextElement();
            System.out.println("port::" + portId.getName());

        }
        while (true) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ex) {
                Logger.getLogger(JavaComPortFinding.class.getName()).log(Level.SEVERE, null, ex);
            }
            main(args);
        }
    }

出力:

port::COM1
port::COM10

1回のポーリングの後、デバイスを取り出しました。私はまだ次のように応答を受け取ります

port::COM1
port::COM10

誰かが私を助けて/ポーリングで動的な応答を得ることを提案できますか?

4

2 に答える 2

1

CommPortIdentifierは毎回再作成する必要があるため、このようなことを試すことができます。

class TestProgram
{
    public static void main(String[] args)
    {
        while(true)
        {
            try
            {
                Thread.sleep(2000);
            }
            catch(InterruptedException ex)
            {
                Logger.getLogger(TestProgram.class.getName()).log(Level.SEVERE, null, ex);
            }

            scanPorts();
        }
    }

    private static void scanPorts()
    {
        Enumeration portList;
        CommPortIdentifier portId = null;
        portList = CommPortIdentifier.getPortIdentifiers();

        while (portList.hasMoreElements())
        {
            portId = (CommPortIdentifier) portList.nextElement();
            System.out.println("port::" + portId.getName());

        }
    }
}

編集 :

USBのBlackBerryを使用してWindowsXPSP3でプログラムをテストしました。プログラムを起動すると、BlackBerry用の通常のCOM1ポートと2つのCOMポートが表示されます。BlackBerryを切断すると、ポートはデバイスマネージャに残ります。それらを手動で削除すると、プログラム内で(再起動せずに)消えます。

于 2013-03-14T13:45:06.170 に答える
0

https://community.oracle.com/thread/2063873?start=0&tstart=0

同様の問題の解決策を見つける際に、上記のリソースが非常に貴重であることがわかりました。

ここでの主な問題は、 static ブロックCommPortIdentifierが 1 回だけロードされ、ポート情報がフィールド variable にキャッシュされることですportList。このメソッドを呼び出すと、初期ロード中に検出されgetPortIdentifiers()たポートが返されます。portList

これを回避するには、クラスで静的ブロックをリロードしてからCommPortIdentifierを呼び出しますgetPortIdentifiers()。これにより、ドライバーがリロードされ、COM ポートの更新されたリストが表示されます (これは、参照されているリンクで Java Reflection API を使用して行われました)。

幸運を!

于 2016-04-04T17:11:46.347 に答える