NeuronRobotics / nrjavaserial

A Java Serial Port system. This is a fork of the RXTX project that uses in jar loading of the native code.
Other
345 stars 143 forks source link

Injecting hex 00 chars into the byte stream when running on a linux instance #95

Closed kgoderis closed 4 years ago

kgoderis commented 7 years ago

On a linux (Ubuntu 17.04) instance the nrjavaserial seems to be injecting hex 00 chars into the byte stream when reading out a serial port.

This behaviour is quite "persistent", e.g. happening with each read cycle. When connecting to the serial port on the OS itself (e.g. via screen or picocom) all communication with the serially attached device is correct. When connecting the device to a Mac OS X machine running the same java code, then all communication is correct.

The java code is writing to the serial port using:

        if (logger.isTraceEnabled()) {
            logger.trace("writeString : '{}'", msg.getBytes());
        }
        outputStream.write(msg.getBytes());
        outputStream.flush();

The java code is reading from the serial port using a loop containing:

                if ((len = inputStream.read(tmpData)) > -1) {
                    foundStart = false;
                    if (logger.isTraceEnabled()) {
                        StringBuilder sb = new StringBuilder();
                        for (int i = 0; i < len; i++) {
                            sb.append(String.format("%02X", tmpData[i]));
                            sb.append(" ");
                        }
                        logger.trace("Read {} bytes : {}", len, sb.toString());
                    }

The some corresponding logs are as follows:

2017-05-05 16:27:47.612 [TRACE] [.oceanic.handler.OceanicThingHandler] - writeString : '[103, 101, 116, 76, 65, 82, 13]' 2017-05-05 16:27:47.626 [TRACE] [.oceanic.handler.OceanicThingHandler] - Read 1 bytes : 00 2017-05-05 16:27:47.626 [TRACE] [.oceanic.handler.OceanicThingHandler] - Byte 0 equals '0'('00') 2017-05-05 16:27:47.637 [TRACE] [.oceanic.handler.OceanicThingHandler] - Reading the inputStream 2017-05-05 16:27:47.637 [TRACE] [.oceanic.handler.OceanicThingHandler] - Read 19 bytes : 32 36 2E 30 34 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Where you can see that after a bunch of normal bytes a series of 00 bytes is returned

In

2017-05-05 16:30:39.752 [TRACE] [.oceanic.handler.OceanicThingHandler] - writeString : '[103, 101, 116, 67, 89, 78, 13]' 2017-05-05 16:30:39.760 [TRACE] [.oceanic.handler.OceanicThingHandler] - Read 1 bytes : 00 2017-05-05 16:30:39.760 [TRACE] [.oceanic.handler.OceanicThingHandler] - Byte 0 equals '0'('00') 2017-05-05 16:30:39.771 [TRACE] [.oceanic.handler.OceanicThingHandler] - Reading the inputStream 2017-05-05 16:30:39.771 [TRACE] [.oceanic.handler.OceanicThingHandler] - Read 4 bytes : 43 00 00 00 2017-05-05 16:30:39.771 [TRACE] [.oceanic.handler.OceanicThingHandler] - Byte 0 equals '67'('43') 2017-05-05 16:30:39.771 [TRACE] [.oceanic.handler.OceanicThingHandler] - Found the start 2017-05-05 16:30:39.771 [TRACE] [.oceanic.handler.OceanicThingHandler] - dataBuffer[0] set to '67'('43') 2017-05-05 16:30:39.771 [TRACE] [.oceanic.handler.OceanicThingHandler] - Byte 1 equals '0'('00') 2017-05-05 16:30:39.771 [TRACE] [.oceanic.handler.OceanicThingHandler] - The resulting line is 'C'

The resulting line should be 'C5', but you can see that after the first byte, the input stream is returning some 00 bytes, instead of the byte equivalent for '5'

The first loop of the read loop always seems to return a single 00 byte (which gets discarded in my code)