Ski*_*oil 5 java events serial-port rxtx serial-communication
我是第一次发帖,所以我希望我按照格式写一切.
目前,我正在开发一个项目,在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());
Run Code Online (Sandbox Code Playgroud)
在此之后,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;
Run Code Online (Sandbox Code Playgroud)
我找到了一种方法来检查命令集 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);
}
}
Run Code Online (Sandbox Code Playgroud)