初めて投稿するので、フォーマット通りに全部書いてほしいです。
現在、Javaアプリケーションと測定デバイス間でRXTXとのシリアル通信を使用するプロジェクトに取り組んでいます。これはうまく機能しますが、デバイスがイベントとともに送信するデータをキャッチしたいと思います。
以下のコードは機能しますが、次の問題
DATA_AVAILABLE
があります。すべてのデータが送信される前に4回呼び出されます。これをと呼ばれる文字列でvBuffer
キャッチし、データをキャッチして完全な文字列を取得できます。
このデータ(完全な文字列)を返したいのですが、SerialPortEvent
この文字列を返すためにすべてのデータが送信されるまで待機するを見つけることができません。
以下の例では使用していますOUTPUT_BUFFER_EMPTY
が、これはコマンドの送信の開始時に呼び出されます。つまり、コマンドを2回送信すると、OUTPUT_BUFFER_EMPTY
イベントは最初のコマンドのデータを含むvBufferを返し、2番目のコマンドを開始した直後に返されます。3回目OUTPUT_BUFFER_EMPTY
は、2番目のコマンドからデータを送信し、3番目などを開始します。
すべてのデータが送信されるまで待つ方法はありDATA_AVAILABLE
ますか、それともすべてのデータが送信された後に呼び出される別のイベントがありますか?
追加情報:コマンドはStringbuilder
、デバイスに適切な形式が送信されていることを確認するために、文字数とともに送信されます。コマンドのレイアウトは次のとおりです<STX><COMMAND><RTX><CR><LF>
。コマンドがいつ終了するかを見れば、終わりをつかむことができるでしょうか?もしそうなら、どのように?
更新:これは私が関数を送信する方法のコードです:
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());
この後、DATA_AVAILABLE
が開始されます。ただし、受信したすべてのデータが完了するまで待機しません。
編集:これを増やすために、それでも問題をさらに進めないでください。
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;