我不知道我的代码正在发生什么。我没有错误,也没有回应。我正在将数据写入串行端口,并通过激活等待响应, port.notifyOnDataAvailable(true);但未触发此事件,inputstream.available()始终返回0。可能是什么问题?我在Linux中使用RXTX。
port.notifyOnDataAvailable(true);
编辑
package testConn; import forms_helper.global_variables; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.util.logging.Level; import java.util.logging.Logger; import javax.comm.*; import java.util.*; /** Check each port to see if it is open. **/ public class openPort implements SerialPortEventListener { static Enumeration portList; static CommPortIdentifier portId; static String messageString; public static SerialPort serialPort; static OutputStream outputStream; InputStream inputStream; static boolean outputBufferEmptyFlag = false; private BufferedReader is; private PrintStream os; public void open() { Enumeration port_list = CommPortIdentifier.getPortIdentifiers(); while (port_list.hasMoreElements()) { // Get the list of ports CommPortIdentifier port_id = (CommPortIdentifier) port_list.nextElement(); if (port_id.getName().equals("/dev/ttyS1")) { // Attempt to open it try { SerialPort port = (SerialPort) port_id.open("PortListOpen", 20000); System.out.println("Opened successfully:"+port); try { int baudRate = 9600; // port.setSerialPortParams( baudRate, SerialPort.DATABITS_7, SerialPort.STOPBITS_1, SerialPort.PARITY_EVEN); port.setDTR(true); port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); System.out.println("properties are set"); } catch (UnsupportedCommOperationException e) { System.out.println(e); } try { //input = new SerialReader(in); port.addEventListener(this); System.out.println("listeners attached" + this); } catch (TooManyListenersException e) { System.out.println("too many listeners"); } port.notifyOnDataAvailable(true); //port.notifyOnOutputEmpty(true); //sendMessage(port,"@PL"); //port.close (); try { is = new BufferedReader(new InputStreamReader(port.getInputStream())); } catch (IOException e) { System.err.println("Can't open input stream: write-only"); is = null; } try { os = new PrintStream(port.getOutputStream(), true); } catch (IOException ex) { Logger.getLogger(openPort.class.getName()).log(Level.SEVERE, null, ex); } try { inputStream = port.getInputStream(); System.out.println("inputstream" + inputStream.available()); outputStream = (OutputStream) port.getOutputStream(); os = new PrintStream(port.getOutputStream(), true, "US-ASCII"); } catch (IOException e) { System.out.println(e); } //set the created variables to global variables global_variables.port = port; global_variables.inputStream = inputStream; System.out.println(inputStream); System.out.println(outputStream); global_variables.outputStream = outputStream; global_variables.os = os; } catch (PortInUseException pe) { System.out.println("Open failed"); String owner_name = port_id.getCurrentOwner(); if (owner_name == null) { System.out.println("Port Owned by unidentified app"); } else // The owner name not returned correctly unless it is // a Java program. { System.out.println(" " + owner_name); } } } } } public static void sendMessage(SerialPort port, String msg) { if (port != null) { System.out.println(msg); try { byte[] bytes = msg.getBytes("US-ASCII"); try { global_variables.outputStream.write(bytes); System.out.println(bytes.length); global_variables.outputStream.flush(); } catch (IOException ex) { Logger.getLogger(openPort.class.getName()).log(Level.SEVERE, null, ex); } } catch (UnsupportedEncodingException ex) { Logger.getLogger(openPort.class.getName()).log(Level.SEVERE, null, ex); } System.out.println("Opened successfully:"+msg.getBytes()); //global_variables.outputStream.write(msg.getBytes()); //global_variables.outputStream.flush(); //global_variables.os.print(msg); System.out.println(global_variables.outputStream); try { Thread.sleep(2000); // Be sure data is xferred before closing System.out.println("read called"); //SimpleRead read = new SimpleRead(); //int read = global_variables.inputStream.read(); //System.out.println("read call ended"+read); } catch (Exception e) { } } } public void serialEvent(SerialPortEvent event) { System.out.println(event.getEventType()); String line; try { line = is.readLine(); if (line == null) { System.out.println("EOF on serial port."); System.exit(0); } os.println(line); } catch (IOException ex) { System.err.println("IO Error " + ex); } 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: System.out.println("event.getEventType()"); break; * */ case SerialPortEvent.DATA_AVAILABLE: System.out.println("inside event handler data available"); byte[] readBuffer = new byte[20]; try { while (inputStream.available() > 0) { int numBytes = inputStream.read(readBuffer); } System.out.print(new String(readBuffer)); System.exit(1); } catch (IOException e) { System.out.println(e); } break; } } } // PortListOpen
我在主要方法上打开端口,并在应用程序内的按钮单击事件上发送消息。
.available() 不能用于进程间通信(包括串行),因为它仅检查当前进程中(输入缓冲区中)是否有可用数据。
.available()
在串行通信中,当您发送一个messaga然后立即呼叫时available(),由于串行端口尚未回复任何数据,因此您通常会得到0。
available()
解决方案是read()在单独的线程中使用阻塞(interrupt()以结束线程): 线程中断未结束对输入流的读取的阻塞调用
read()
interrupt()