在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);*/ } } 

使用以下内容:

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

您正在从while循环中打印结果。 但是,循环内的代码可能会运行多次,因此会丢失大量数据。

在进行读取之前,请尝试刷新端口的输入缓冲区。 否则,如果发送端在程序启动期间(或之前,可能由操作系统决定)发送数据,您将获得旧的缓冲数据。

此外,如果可能,请考虑在协议中添加消息框架 ,以便您可以检测何时读取的内容实际上不是完整的消息,并将其丢弃。 对于这些问题,这通常非常有用。

这看起来好像是在阅读在开始之前发送的其他消息。

尝试在启动程序时读取尽可能多的数据以清除任何硬件缓冲区。 之后,开始处理。