2008-12-03 2 views
9

Я начинаю на Java. Я читаю данные с устройства через последовательный порт. Я получаю данные каждую минуту, но первое чтение идет наполовину, после чего данные поступают правильно.Чтение последовательного порта в 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);*/ 
} 

} 
+0

Пожалуйста, добавьте четыре пробела перед первой строкой, чтобы они были отформатированы как код. – guerda 2008-12-03 11:33:30

+0

Вы только что скопировали это с другого сайта? - http://www.java-samples.com/showtutorial.php?tutorialid=11 – 2012-08-18 18:09:47

ответ

2

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

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

3

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

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

4

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

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

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

Смежные вопросы