0

I am reading Accelerometer signals connected to Arduino board through a serial interface. I am using the RxTx library and following is the code.

private void initializeSerial() {
    CommPortIdentifier portId = null;
    Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

    while (portEnum.hasMoreElements()) {
        CommPortIdentifier currentPortIdentifier = (CommPortIdentifier) portEnum.nextElement();
        for (String portName : PORT_NAMES) {
            if (currentPortIdentifier.getName().equals(portName)) {
                portId = currentPortIdentifier;
                break;
            }
        }
    }

    if (portId == null) {
        System.out.println("Port not found");
        return;
    }

    try {

        serialPort = (SerialPort) portId.open(this.getClass().getName(), 2000);
        serialPort
                .setSerialPortParams(115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

        input = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
        output = serialPort.getOutputStream();

        serialPort.addEventListener(this);
        serialPort.notifyOnDataAvailable(true);

    } catch (Exception e) {
        System.err.println("Initialization failed : " + e.toString());
    }
}

@Override
public void serialEvent(SerialPortEvent event) {
    if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
        try {
            String inputLine = input.readLine();
            String[] inputValues = inputLine.split(",");
            System.out.println(inputLine);

            if (inputValues.length == 10 && inputValues[0].equals("STX")
                    && inputValues[inputValues.length - 1].equals("ETX")) {

                double classid = 0;
                double accx = 0;
                double accy = 0;
                double accz = 0;
                boolean num_error = false;

                try {

                    classid = Integer.parseInt(txtClassID.getText());
                    accx = Double.parseDouble(inputValues[2]);
                    accy = Double.parseDouble(inputValues[4]);
                    accz = Double.parseDouble(inputValues[6]);
                    num_error = false;

                } catch (NumberFormatException numex) {
                    num_error = true;
                }

                if (recording) {

                    if (!num_error) {
                        gestureList.add(new double[] { classid, accx, accy, accz });
                        System.out.println("ClassID : " + classid + " \tAdding : "+ accx +","+ accy+","+ accz);
                    }

                    System.out.println("ClassID : " + classid + " \tAdding : " + accx + accy + accz);
                } else {
                    if (gestureList.size() > 0) {
                        gestureCollection.add(gestureList);
                        System.out.println("Segment :" + (gestureCollection.size()) + "   Items : "
                                + gestureList.size());
                        txtSegments.append("Segment " + (gestureCollection.size()) + "\tItems : "
                                + gestureList.size() + "\n");

                        // comboSegments.addItem(gestureCollection.size());

                        gestureList = new ArrayList<>();
                    }
                }

                txtRawData.append(inputLine + "\n");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

The problem I have is that, I'm reading the values in Windows environment perfectly, without any issues. But in Ubuntu I get data that is damaged and partially read. Here is the Java console output when I did this in ubuntu.

These are correct readings.

STX,16564.00,16565.65,-352.00,-431.09,-17840.00,-17941.79,-178.64,-42.72,ETX STX,16524.00,16562.53,-440.00,-431.76,-17848.00,-17934.75,-178.63,-42.73,ETX STX,16572.00,16563.24,-420.00,-430.88,-17992.00,-17939.05,-178.64,-42.72,ETX

But I get readings like this too. (In a considerable amount)

STX,16580.00,16551.27,-432.00,-438.85,-17936.00,-17922.1724.00,16548.94,-380.00,-439.41,-17880.00,-17921.05,-178.61,-42.71,ETX

9-178.56,-42.75,ETX

.,-454.82,-17944.00,-17916.45,-178.54,-42.72,ETX

STX,16584.00,16558.19,-464.00,-465.68,-18007416.00,-446.99,-18008.00,-17935.43,-178.56,-42.71,ETX

Why does this happen, where I can read perfectly in Windows and Not in Ubuntu.

Any help please? Thank You.

UncleO
  • 8,299
  • 21
  • 29
kinath_ru
  • 4,488
  • 3
  • 21
  • 26
  • This is not an Arduino problem, as it works with Windows and Java. It is an RXTX problem. It looks like packets are interfering with each other on Ubuntu, as if the SerialEvents are interrupting each other, while on Windows, the events are buffered and the process is not interrupted. One way to fix the problem is to add a delay between packets on the sending side (on the Arduino). Not ideal, but RXTX is not expected to be bulletproof on every platform. – UncleO Dec 06 '14 at 02:45
  • UncleO, thanks for your comment. I have already added a delay on Arduino side with 10ms. But it doesn't do much change. – kinath_ru Dec 06 '14 at 03:00
  • I increased the delay from 10ms to 15ms and now it doesn't give the error at all as it seems... Thanks UncleO .. :-) – kinath_ru Dec 06 '14 at 05:49

0 Answers0