Чтение последовательного порта в Java - PullRequest
9 голосов
/ 03 декабря 2008

Я новичок в Java. Я читаю данные с устройства через последовательный порт. Я получаю данные за каждую минуту, но первое чтение приходит наполовину, после того, как эти данные поступают правильно.

Вывод, который я получаю:

6050.003120815340006050.003120815350006050.0

Правильный вывод должен быть таким:

03120815340006050.003120815350006050.0


Мой код:

import java.io.*;
import java.util.*; //import gnu.io.*;
import javax.comm.*;

public class SimpleRead implements Runnable, SerialPortEventListener {
    static CommPortIdentifier portId;
    static Enumeration portList;

InputStream inputStream;
SerialPort serialPort;
Thread readThread;
byte[] readBuffer;

public static void main(String[] args) {
    portList = CommPortIdentifier.getPortIdentifiers();
    System.out.println("portList... " + portList);
    while (portList.hasMoreElements()) {
        portId = (CommPortIdentifier) portList.nextElement();
        if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
            System.out.println("port identified is Serial.. "
                    + portId.getPortType());
            if (portId.getName().equals("COM2")) {
                System.out.println("port identified is COM2.. "
                        + portId.getName());
                // if (portId.getName().equals("/dev/term/a")) {
                SimpleRead reader = new SimpleRead();
            } else {
                System.out.println("unable to open port");
            }
        }
    }
}

public SimpleRead() {
    try {
        System.out.println("In SimpleRead() contructor");
        serialPort = (SerialPort) portId.open("SimpleReadApp1111",500);
        System.out.println(" Serial Port.. " + serialPort);
    } catch (PortInUseException e) {
        System.out.println("Port in use Exception");
    }
    try {
        inputStream = serialPort.getInputStream();
        System.out.println(" Input Stream... " + inputStream);
    } catch (IOException e) {
        System.out.println("IO Exception");
    }
    try {
        serialPort.addEventListener(this);

    } catch (TooManyListenersException e) {
        System.out.println("Tooo many Listener exception");
    }
    serialPort.notifyOnDataAvailable(true);
    try {

        serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,
                SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

        // no handshaking or other flow control
        serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);

        // timer on any read of the serial port
        serialPort.enableReceiveTimeout(500);

        System.out.println("................");

    } catch (UnsupportedCommOperationException e) {
        System.out.println("UnSupported comm operation");
    }
    readThread = new Thread(this);
    readThread.start();
}

public void run() {
    try {
        System.out.println("In run() function ");
        Thread.sleep(500);
        // System.out.println();
    } catch (InterruptedException e) {
        System.out.println("Interrupted Exception in run() method");
    }
}

public void serialEvent(SerialPortEvent event) {

    // System.out.println("In Serial Event function().. " + event +
    // event.getEventType());
    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: break;
     */
    case SerialPortEvent.DATA_AVAILABLE:
        readBuffer = new byte[8];

        try {

            while (inputStream.available()>0) {

                int numBytes = inputStream.read(readBuffer);
            //   System.out.println("Number of bytes read " + numBytes);
            }

            System.out.print(new String(readBuffer));

        } catch (IOException e) {
            System.out.println("IO Exception in SerialEvent()");
        }
        break;
    }
    // System.out.println();
/*  String one = new String(readBuffer);
    char two = one.charAt(0);
    System.out.println("Character at three: " + two);*/
}

}

Ответы [ 3 ]

4 голосов
/ 03 декабря 2008

Используйте следующее:

while (inputStream.available()>0) {
  int numBytes = inputStream.read(readBuffer);
  System.out.print(new String(readBuffer));
}

Вы печатаете результат из цикла while. Однако код внутри цикла может выполняться несколько раз, поэтому часть данных будет потеряна.

3 голосов
/ 03 декабря 2008

Попробуйте очистить входной буфер порта перед чтением. В противном случае, если отправляющая сторона отправила данные во время запуска вашей программы (или чуть раньше, это может быть связано с операционной системой), вы получите старые буферизованные данные.

Также, если возможно, рассмотрите возможность добавления в протокол фрейма сообщения , чтобы вы могли определить, прочитали ли вы что-то, что на самом деле не является полным сообщением, и отбросить его. Это часто очень помогает при подобных проблемах.

2 голосов
/ 03 декабря 2008

Это выглядит так, как будто вы читали оставшуюся часть сообщения, которое было отправлено до того, как вы начали.

Постарайтесь прочитать как можно больше данных при запуске программы, чтобы очистить все аппаратные буферы. После этого начните обработку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...