1

/dev/ttyUSB0オペレーティングシステムが提供する標準ファイルを使用して、Ubuntu の USB シリアルポートから読み書きしています。Thread を拡張するクラスですべてのハードワークを行います。

public PacketHandlingThread(String fileName, PacketListener listener)
{
    mListener = listener;

    //the filename points toward a serial port. Something like /dev/ttyUSB0
    try
    {
        mOutputStream = new FileOutputStream(fileName);
        mInputStream = new FileInputStream(fileName);
        System.out.println("Created Serial Listener");
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

run メソッドは次のようになります。

public void run()
{
    while(true)
    {
        int numRead = -1;
        try
        {
            while(mInputStream.available() < 1)
            {
                //spin in circles
                try {
                    Thread.sleep(10);
                }catch (Exception e) {}
            }

            numRead = mInputStream.read(data);
            System.out.println("Num Read: "+numRead);   
        }
        catch (Exception e)
        {
            e.printStackTrace();
            numRead = -1;
        }

        if (numRead == -1)
        {
            mListener.OnConnectionClosed();
            break;
        }
    }
}

このコードは期待どおりに機能しますが、新しいデータがあるかどうかを確認するために、常にファイルをポーリングする必要があります。while ループの代わりに、次のようなものを使用したいと思います。

synchronized(mInputStream)
{
    mInputStream.wait();    
}

しかし、私がそれを行うと、おそらく基になるストリームが決して呼び出されないため、そこに永遠に待機しますnotify()(そして、それが呼び出されると疑う理由はありません.

私の質問は次のとおりです。シリアルポートから非ポーリング方法で読み取る方法はありますか?

私の調査では、それらのすべてが絶対にひどいことが示されているように見えるため、シリアルライブラリを使用する必要があるのは本当に嫌です。どんなアドバイスでも大歓迎です!

4

2 に答える 2

3

Java シンプル シリアル コネクタライブラリをご覧ください。

上記のリンクに示されているように、SerialPortEventListener インターフェイスを実装する必要があります。

USBアダプターを介してシリアルデータを読み取るために、本番環境で使用しましたが、安定していることを示しています。

于 2012-10-03T17:58:37.487 に答える
0

まず、私見ですが、下位レベル (IE デバイス接続、ハードウェア実装など) とのインターフェイスを作成する場合は、C++ (GCC を使用) を使用するのが最善の方法です。 OS レベルの機能の処理 (ほとんどの場合、java は、クロス プラットフォームにしようとする際に、OS 機能を操作できないか、明確かつ直接的な実装を持っていません)。

ベース オブジェクトを呼び出す場合 (そこから読み取る必要があります) fileName.size()、ストリームを直接テストする代わりに、for ループを使用して i をチェックできます。

for(int i = 0; i < filename.size(); i++)
   try{
        //...code here...
      }
       catch(Exception e)
       {
         e.printStackTrace();
       }
}

幸運を祈ります

于 2012-07-04T00:07:49.607 に答える