/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()
(そして、それが呼び出されると疑う理由はありません.
私の質問は次のとおりです。シリアルポートから非ポーリング方法で読み取る方法はありますか?
私の調査では、それらのすべてが絶対にひどいことが示されているように見えるため、シリアルライブラリを使用する必要があるのは本当に嫌です。どんなアドバイスでも大歓迎です!