我是第一次发帖,所以我希望我按照格式写所有东西。
目前,我正在开发一个在 java 应用程序和测量设备之间使用串行通信与 RXTX 的项目。这很好用,但现在我想捕获设备随事件发送的数据。
下面的代码有效,但存在以下问题:
DATA_AVAILABLE
在发送所有数据之前将被调用 4 次。我在一个名为的字符串中捕获它,vBuffer
并且我能够捕获数据以获取完整的字符串。
现在我想返回这个数据(完整的字符串),但是找不到一个SerialPortEvent
会等到所有数据都发送后才返回这个字符串的。
在下面的示例中,我使用了OUTPUT_BUFFER_EMPTY
但这在发送命令的开始时调用。这意味着当第二次发送命令时,OUTPUT_BUFFER_EMPTY
事件将返回 vBuffer 以及来自第一个命令的数据,然后立即启动第二个命令。在第 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
将启动。但不要等到所有接收到的数据都完成。
编辑:为了解决这个问题,问题仍然没有进一步。
串行事件方法:
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;