처음으로 게시 중이므로 형식에 따라 모든 것을 쓸 수 있기를 바랍니다.Java SerialPortEvent 문제 : DATA_AVAILABLE이 수신 데이터를 더 빠르게 호출합니다.
현재 Java 응용 프로그램과 측정 장치 사이에서 RXTX와의 직렬 통신을 사용하는 프로젝트를 진행하고 있습니다. 이것은 훌륭하게 작동하지만 이제는 장치가 이벤트와 함께 보내는 데이터를 잡아 내고 싶습니다.
아래 코드는 작동하지만 다음과 같은 문제가 있습니다. DATA_AVAILABLE
은 모든 데이터가 전송되기 전에 4 번 호출됩니다. 나는 이것을 vBuffer
이라는 문자열에서 잡았고 전체 문자열을 얻기 위해 데이터를 잡을 수있었습니다.
이제이 데이터 (전체 문자열)를 반환하지만이 문자열을 반환하기 위해 모든 데이터가 전송 될 때까지 대기하는 SerialPortEvent
을 찾을 수 없습니다.
아래 예제에서는 OUTPUT_BUFFER_EMPTY
을 사용하지만이 명령은 명령을 보내는 시작 부분에 호출됩니다. 즉, 두 번째 시간 동안 명령을 보낼 때 OUTPUT_BUFFER_EMPTY
이벤트는 첫 번째 명령의 데이터가있는 vBuffer를 반환하고 두 번째 명령을 시작한 직후입니다. 3 시간에 OUTPUT_BUFFER_EMPTY
은 2 명령에서 데이터를 전송 등 3를 시작
모든 데이터를 전송, 또는 모든 데이터가 전송 된 후 호출되는 다른 이벤트가있을 때까지 기다릴 DATA_AVAILABLE
있는 방법이 있나요?
추가 정보 : 장치의 올바른 형식이 전송되도록 명령에 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
정말 무슨 뜻인지 모르겠지만, 내가받은 문자열에는 연결된 장치의 측정 데이터가 들어 있습니다. 그리고 그 String은 나눌거야. 나는 하드 코딩 된 방법 (수면을 강요했다)을했지만 지금은 중간에 조각들을 하드 코딩하지 않고 이것을 시도하고있다. – Skillcoil
"모든 데이터가 전송 될 때까지 대기하는 DATA_AVAILABLE의 방법이 있습니까?" 나는 당신이 아무 것도 보내지 않고, 그냥 받는다는 것을 보지 못한다. 모든 데이터가 수신 될 때까지 기다려야한다는 뜻입니까? – partlov