inputstream.available() 始终为 0

编程入门 行业动态 更新时间:2024-10-11 15:22:51
本文介绍了inputstream.available() 始终为 0的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我不知道我的代码发生了什么.我没有收到任何错误,也没有回应.我正在将数据写入串行端口并通过激活 port.notifyOnDataAvailable(true); 等待响应,但未触发此事件并且 inputstream.available() 始终返回 0.可能有什么问题?我在 linux 中使用 RXTX.

I have no idea of what is happening to my code. i am getting no errors and no response as well. I am writing the data to the serialport and waiting for the response by activating port.notifyOnDataAvailable(true); but this event is not triggered and inputstream.available() returns 0 always. What might be wrong ? I am using RXTX in linux.

编辑

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 javaxm.*; 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

我在 main 方法上打开端口,并在应用程序内的按钮单击事件上发送消息.

I am opening the port on main method and sending the message on a button click event inside the application.

推荐答案

.available() 不能用于进程间通信(包括串口),因为它只检查是否有数据在当前进程中可用(在输入缓冲区中).

.available() can not be used in inter-process communication (serial included), since it only checks if there is data available (in input buffers) in current process.

在串口通信中,当你发送一个messaga,然后立即调用available(),你会得到0,因为串口还没有回复任何数据.

In serial communication, when you send a messaga and then immediately call available() you will mostly get 0 as serial port did not yet reply with any data.

解决方法是在单独的线程中使用阻塞read()(用interrupt()来结束):

The solution is to use blocking read() in a separate thread (with interrupt() to end it):

线程中断未结束对输入流的阻塞调用阅读

更多推荐

inputstream.available() 始终为 0

本文发布于:2023-11-16 03:57:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1600780.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:inputstream

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!