2012-02-15 5 views
1

내 Java 직렬 통신에 문제가 있습니다. 내 jennic 하드웨어 장치가 UART를 사용하여 연결되었습니다. I는 처음 I의 바이트를 판독하고, [] 버프에 저장 Java에서 SerialPort 읽기

 case SerialPortEvent.DATA_AVAILABLE: 
      try { 
        int size; 
        while(inputStream.available()!=0) { 
         byte buff[]=new byte[100]; 
         size=inputStream.read(buff); 
         inputStream.close(); 
         String result = new String(buff,0,size); 
         ZPS_tsAplZdpIeeeAddrRsp IeeRsp = new ZPS_tsAplZdpIeeeAddrRsp(result); 
       } 

SerialPortEvent.DATA_AVAILABLE

에서 문자열의 바이트 배열을 수신하고

.. 값을 내 장치를 형성 검색 할. 그럼 문자열로 변환하고 거기에 문자열 배열로 변환 ..하지만 내 문제는 내가 밖으로 나가 몇 시간처럼 휴식 시간을 얻을 수 있습니다.

샘플 출력 :

80011634002078445541560000341201004189 

    80011635002078445541560000341201004189 

    80011636002078445541560000341201004189 
    /*Here is Break my seq */ 
    800116370020784455 

    41560000341201004189/*this two breaking seq generated two separate array and here is the problem*/ 

    80011638002078445541560000341201004189 

내가 inputStream.reset을 시도()하지만이 작동하지 않습니다 입력 버퍼를 플러싱 문제가이 .. 사람이 나에게 문제를 극복 할 수있는 적절한 제안을 제공 할 수 있습니다.

감사합니다 ...

답변

0

포트에서 버퍼로 읽고 버퍼에 전체 메시지가 있으면 버퍼의 해당 부분을 메시지 처리 루틴으로 플러시해야합니다. 즉, 각 메시지를 독립적으로 식별하고 분리 할 수있는 방식으로 메시지를 정의해야합니다.

데이터를 사용할 수 있거나 사용할 수 없을 때 스트림 읽기가 작동하거나 차단됩니다. 그러나 스트림을 읽는다고해서 하나의 메시지 크기로 데이터를 가져올 수 있다고 보장 할 수는 없습니다. 읽을 데이터가 있다는 것을 알게됩니다. 데이터을 직렬 포트 버퍼에서 읽을 수 있고 공통적으로 읽으려고하면 메시지을 모두 읽을 수 있기 전에 읽었습니다. 발생할 수있는 또 다른 문제가 있음을 기억하십시오. 프로그램이 "다음"메시지를 읽을 준비가되기 전에 두 번 이상의 메시지가 직렬 포트 버퍼에 버퍼링 될 수 있습니다.

메시지를 읽을 수있을 때까지 바이트를 보유하는 버퍼 (클래스)로 바이트를 읽는 통신 프로토콜입니다. 그런 다음 메시지 레벨을 제외하고 read()처럼 작동하는 버퍼 readMessage()에 인터페이스를 두십시오 (전체 메시지가 나올 때까지 버퍼링).

1

'문제'는 귀하의 기대에 부합합니다. read()가 버퍼를 채우거나 직렬 데이터 전송이 메시지 경계를 보존한다고 말할 수는 없습니다. 그것은 당신에게 달려 있습니다. 바이트 스트림 만 있으면됩니다.

0

일반적으로 직렬 연결의 한쪽 끝에서 보낸 "메시지"가 모두 하나의 그룹으로 수신 될 것이라고 기대할 수 없습니다. 한 번에 또는 여러 가지 길이의 여러 덩어리로 모든 것을 얻을 수 있습니다. 들어오는 데이터에 대해 알고있는 것을 사용하여 직렬 포트에서 바이트를 읽고 함께 넣어 놓고 완전한 메시지가 수신 된 것을 알게되는 것은 수신 프로그램에 달려 있습니다.

일반적으로 장치는 세 가지 방법 중 하나로이 문제를 해결할 :

  • 수정 길이 패킷 - 당신은 X 바이트를 얻을 때까지 읽은 다음 그 X 바이트를 처리합니다.
  • 패킷 길이는 완전한 패킷까지 수신 된 데이터를 고려하기 전에 읽어야 할 추가 바이트 수를 나타내는 패킷 헤더의 일부입니다.
  • 패킷 시작/끝 표시기 (시작하려면 STX 또는 SOH, 보통 종료하려면 ETX). 시작 및 종료 표시기 사이에 수신 된 모든 데이터를 하나의 메시지 패킷으로 취급합니다.