マイクロコントローラーからデータを取得するのに問題があります。私は正確に 2000 バイトのチャンクでデータを転送しており、次の 2k バイトを送信するための新しい呼び出しを行う前に、これらの 2000 バイトを処理するスレッドを作成しました。ほとんどの場合、問題なく動作しますが、何らかの理由で 1 バイトが多すぎたり、1 バイトが少なすぎたりする傾向があり、これはケース #2の間のみです。ケース#1を使用すると、常に問題なく動作しますが、何らかの理由で非常に遅くなります。10 秒で約 2000 バイトを処理していますが、シリアルポートを 115.200 ボーで動作するように設定した場合、これは遅すぎます。
ケース #1 (常に動作しますが、非常に遅い)
public void serialEvent(SerialPortEvent event)
{
switch (event.getEventType())
{
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
try
{
byte singleData = (byte) buffer.read();
gasArray.setMessage(singleData);
if (gasArray.isBusy())
{
gasArray.setProcessing();
while (gasArray.isProcessing())
{
continue;
}
}
else
gasArray.appendChat("Incoming data: " + singleData);
}
}
ケース #2 (時々スタックしますが、非常に高速です)
public void serialEvent(SerialPortEvent event)
{
switch (event.getEventType())
{
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
try
{
while (buffer.available() > 0)
{
byte singleData = (byte) buffer.read();
gasArray.setMessage(singleData);
if (gasArray.isBusy())
{
gasArray.setProcessing();
while (gasArray.isProcessing())
{
continue;
}
}
else
gasArray.appendChat("Incoming data: " + singleData);
}
}
着信データを処理し、いくつかの操作を実行する別のワーカー スレッドがあり、同期の問題などではありません。取得するバイト数が 1 バイト多すぎるか、1 バイトから数バイトになるため、バイト数をカウントするスレッドがもう 1 バイトを期待してスタックします。RealTerm (シリアル コンソール プログラム) を使用して同じものを取得しましたが、毎回高速かつ正確に取得できます。BufferedInputStream を追加すると、ケース #2で少しうまくいくように見えましたが、それでも問題が時々発生しました。
私の質問は次のとおりです: available() メソッドは、これらの問題を引き起こすほど信頼できないのですか? それとも、これはシリアル通信または RXTX ライブラリの問題ですか? これを処理するより良い方法はありますか?2000 バイトを取得して処理し、さらに 2000 バイトを要求しています。シリアルポートでデータを受信するのがこれほど遅いのは、#1 のケースですか?
例を含むアイデアは非常に役立ちます。