初めて投稿していますので、フォーマットに従ってすべてを書き込むことを願っています。Java SerialPortイベントの問題:DATA_AVAILABLEは、受信データをより早く呼び出します
現在、私は、Javaアプリケーションと測定デバイスの間のRXTXとのシリアル通信を使用するプロジェクトに取り組んでいます。これはうまくいきますが、デバイスがイベントとともに送信するデータを捕捉したいのです。
以下のコードは動作しますが、すべてのデータが送信される前に DATA_AVAILABLE
が4回呼び出されます。 私はこれをvBuffer
という文字列で捕まえ、完全な文字列を得るためにデータを捕まえることができます。
このデータ(完全な文字列)を返したいが、すべてのデータがこの文字列を返すために送信されるまで待機するSerialPortEvent
を見つけることができない。
次の例では、私はOUTPUT_BUFFER_EMPTY
を使用しますが、これはコマンドの送信の冒頭で呼び出されます。これは、2回目のコマンドを送信するときに、OUTPUT_BUFFER_EMPTY
イベントが最初のコマンドのデータとともにvBufferを返し、2番目のコマンドを開始した直後であることを意味します。 3回目にOUTPUT_BUFFER_EMPTY
は2番目のコマンドからデータを送信し、3番目のコマンドを開始します。
すべてのデータが送信されるまで待機する方法はありますか、すべてのデータが送信された後に呼び出される別のイベントがありますか?
追加情報:コマンドは、Stringbuilder
のcharsで送信され、デバイスの正しいフォーマットが送信されていることを確認します。コマンドのレイアウトは、<STX><COMMAND><RTX><CR><LF>
です。 コマンドが終了したときを見て最後を捉えることができますか?もしそうなら、どうですか?
更新:これは私が機能を送る方法コードです:。このDATA_AVAILABLE
後
StringBuilder message = new StringBuilder();
message.append(new Character((char) 2)); // STX (Start of Text)
message.append("M"); // Command character
message.append(new Character((char) 3)); // ETX (End of Text
message.append(new Character((char) 13)); // CR (Carriage Return)
message.append(new Character((char) 10)); // LF (Line Feed)
outputStream.write(message.toString().getBytes());
でキックされますが、受信したすべてのデータが行われるまで待機しません。
編集:この問題を解決するには、それ以上問題はありません。
serialEvent方法:
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:
if (vBuffer != "")
{
System.out.println(vBuffer);
}
break;
case SerialPortEvent.DATA_AVAILABLE:
byte[] readBuffer = new byte[40];
try
{
while (inputStream.available() > 0)
{
int numBytes = inputStream.read(readBuffer);
}
vBuffer += new String(readBuffer);
System.out.print(new String(readBuffer));
}
catch (IOException e)
{
System.out.println(e);
}
break;
すべてのデータを受信したと思いますか?あなたの側から。 – partlov
本当に何を意味するのか分かりませんが、受信した文字列には接続されたデバイスの測定データが含まれています。そしてそのストリング私は分割するつもりです。私はハードコーディングされた方法(睡眠を余儀なくされた)を行ってきましたが、今のところハードコードされた部分を持たずにこれを達成しようとしています。 – Skillcoil
"すべてのデータが送信されるまでDATA_AVAILABLEに待機する方法はありますか?"私はあなたが何かを送っているのを見ず、受け取っているだけです。すべてのデータが受信されるまで待つことを意味しますか? – partlov