第一次发帖,希望大家按格式写。
目前我正在开发一个项目,在 java 应用程序和测量设备之间使用 RXTX 进行串行通信。这很好用,但现在我想捕获设备随事件发送的数据。
下面的代码有效但有以下问题:
DATA_AVAILABLE
在发送所有数据之前将被调用 4 次。
我在一个名为 vBuffer
的字符串中捕获了它并且我能够捕获数据以获得完整的字符串。
现在我想返回此数据(完整字符串),但找不到 SerialPortEvent
它将等到所有数据发送完毕后返回此字符串。
在下面的示例中,我使用 OUTPUT_BUFFER_EMPTY
但这是在发送命令开始时调用的。这意味着当第二次发送命令时,OUTPUT_BUFFER_EMPTY
事件将返回带有来自第一个命令的数据的 vBuffer,并在第二个命令启动后立即返回。第3次OUTPUT_BUFFER_EMPTY
从第二个命令发送数据并启动第三个等。
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;
最佳答案
我找到了一种方法来检查命令集 STX 和 ETX 以查看消息是否完整(ETX 在消息的末尾)。如果检查为真,那么我得到了一条完整的消息。
问题解决了!
public void serialEvent(SerialPortEvent event)
{
if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE)
{
System.out.println("Data available event received");
try
{
int available = inputStream.available();
byte[] readBuffer = new byte[available];
if (available > 0)
{
inputStream.read(readBuffer);
}
messageBuffer = messageBuffer + new String(readBuffer);
try
{
int start = messageBuffer.indexOf(new Character((char) 2));
int end = messageBuffer.indexOf(new Character((char) 10));
if (start >= 0 && end >= 0)
{
System.out.println("We found 1 complete message!!");
System.out.println(messageBuffer.substring(start, end));
_fireBufferEvent();
messageBuffer = "";
}
}
catch (IndexOutOfBoundsException ex)
{
System.out.println("IndexOutOfBoundsException, message not complete yet. Waiting for more data.");
}
}
catch (IOException ex)
{
System.out.println("IOException while reading data:");
System.out.println(ex);
}
}
关于Java SerialPortEvent 问题 : DATA_AVAILABLE calls faster then incoming data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15408708/