Shantanu Banerjee
Shantanu Banerjee

Reputation: 1447

SerialPort Reading in java

Here is problem in my Java Serial Communication ... my jennic hardware device is connected using UART. I want to retrieve values form my device ..

i am receiving byte array of string in SerialPortEvent.DATA_AVAILABLE

        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);
               }

first I read the bytes and store it in buff[]. then convert it into string and convert it to string array there after .. but my problem is i get the out put like but few time its breaks.

Sample output:

  80011634002078445541560000341201004189

  80011635002078445541560000341201004189

  80011636002078445541560000341201004189
  /*Here is Break my seq */
  800116370020784455

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

  80011638002078445541560000341201004189

is there problem for flushing the input buffer I have tried inputStream.reset() but it doesn't work.. can anyone give me a suitable suggestion to overcome the problem..

thanks...

Upvotes: 1

Views: 4868

Answers (3)

Edwin Buck
Edwin Buck

Reputation: 70909

You need to read from the port into a buffer, and when that buffer has a whole message, flush that portion of the buffer into your message handling routines. This means you need to define your messages in a manner where each message can independently be identified and isolated.

Reading a stream will work or block when data is available or unavailable; however, reading from a stream won't guarantee that you get your data in one message-sized pieces. You only get notice that there is data to be read. You noticed a common issue when data is available to be read in the serial port buffer, and you started reading it before all of the message was available to be read. Remember that there is another issue which can occur, perhaps during another run two or more messages might be buffered in the serial port buffers before your program is ready to read the "next" message.

Rework you communication protocol to read bytes into a buffer (a class), which holds bytes until messages are available to be read. Then put an interface on that buffer readMessage() which acts like read() except at the message level (buffering until it gets a full message).

Upvotes: 0

Shane Wealti
Shane Wealti

Reputation: 2342

In general you cannot expect that a "message" sent from one end of a serial connection is going to be received all as one group. You may get it all at once or in several chunks of varying lengths. It is up to your receiving program to use what it knows about the incoming data to read bytes from the serial port and put them together and realize when a complete message has been received.

Normally devices handle this in one of three ways:

  • Fix length packets - you read until you get X bytes and then process those X bytes.
  • Packet length is part of the packet header indicating how many additional bytes to read before considering the data received so far as a complete packet.
  • Packet start/end indicators (STX or SOH to start and ETX to end usually). You treat all data received between a start and end indicator as one message packet.

Upvotes: 0

user207421
user207421

Reputation: 310840

The 'problem' is in your expectations. Nowhere does it say that read() will fill the buffer, or that serial data transfer will preserve your message boundaries. That's up to you. All you get is a byte stream.

Upvotes: 1

Related Questions